一固翰、 全局對(duì)象
在ES標(biāo)準(zhǔn)里收厨,全局對(duì)象是global围俘,在瀏覽器里是window,因?yàn)闉g覽器的實(shí)現(xiàn)比標(biāo)準(zhǔn)要早。
1. 常用的全局API
ES標(biāo)準(zhǔn) | 瀏覽器私有 |
---|---|
paseInt() | alert(彈窗提示) |
paseFloat() | prompt(用戶填寫) |
Number() | comfirm(確認(rèn)) |
String() | console(開發(fā)者使用) |
Boolean() | document(文檔)DOM |
Object() | history(瀏覽器)BOM |
二界牡、簡(jiǎn)單類型與對(duì)象的區(qū)別
1. Number()
(1). Number()的兩種用法
Number('1')
將括號(hào)內(nèi)的值轉(zhuǎn)換成Number類型var n = new Number(1)
生成一個(gè)Number對(duì)象
(2). var n = 1 與 var n = new Number(1)的區(qū)別:
var n = 1生成的是一個(gè)簡(jiǎn)單類型簿寂,而var n = new Number(1)生成的是一個(gè)對(duì)象。
var n = 1; n.toString()之所以生效宿亡,是因?yàn)樵趫?zhí)行n.xxx的時(shí)候常遂,會(huì)將基本類型的1轉(zhuǎn)換成一個(gè)對(duì)象的1(臨時(shí)變量),并調(diào)用該臨時(shí)變量里的屬性挽荠。
2. String
定義String的兩種方式:
var s = 'afdssafd';
var s = new String('safdsafdsa')克胳。
(1). String常用的api
s.charAt(n) 獲取第n位的值,等價(jià)于s[n]
s.charCodeAt(n) 獲取第n位字符的unicode編碼
s.charCodeAt(n).toString(16) 獲取第n位字符的Unicode編碼圈匆,并轉(zhuǎn)換成16進(jìn)制
s.trim()去掉字符串兩邊的空格
s1.concat(s2)連接兩個(gè)字符串
s.slice(n1, n2) 獲取字符串n1~n2的片段(左閉右開漠另,不包括右邊)
3.Boolean()
定義Boolean的兩種方式:
var b = true
var b = new Boolean(true)
坑:
var b = new Boolean(false)
if (b) {
console.log('helloWorld')
}
//打印出helloWorld
以上代碼之所以會(huì)打印,是因?yàn)?code>var b = new Boolean(false)是一個(gè)對(duì)象跃赚,所有對(duì)象轉(zhuǎn)換成Boolean時(shí)都是true
笆搓。
4. Object()
定義對(duì)象的兩種方法:
var o1 = {}
var o2 = new Object()
if (o1 === o2)
是false,因?yàn)閷?duì)象是否相等比較的stack內(nèi)存中的地址纬傲,兩個(gè)指向不同堆內(nèi)存的對(duì)象自然是不相等的满败。
三、 公用屬性
1. 公用屬性來源于__proto__
在以下代碼中叹括,對(duì)象o1
并沒有定義toString()
函數(shù)算墨,但是仍能調(diào)用,是因?yàn)樵趧?chuàng)建一個(gè)對(duì)象時(shí)汁雷,默認(rèn)會(huì)繼承一個(gè)__proto__
屬性净嘀,這個(gè)屬性指向公用的對(duì)象屬性,里面包含toString()
摔竿。
var o1 = new Object()
o1.name = 'Mike'
o1.age = 18
o1.toString()
2. 對(duì)象內(nèi)proto的指向
- 無論創(chuàng)建多少個(gè)Object面粮,它們的
__proto__
指向的都是同一個(gè)公用屬性。
var o1 = new Object()
var o2 = new Object()
if (o1 === o2) //false继低,因?yàn)閛1與o2存儲(chǔ)的地址是不一樣的
if(o1.toString === o2.toString) //true熬苍,因?yàn)閛1與o2的__proto__指向的是同一個(gè)公共屬性。
- 基本類型與Object的proto指向圖
var n = new Number(1)
n.__proto__ === Number.prototype //true
n.__proto__.__proto__ === Object.prototype //true
var s = new String("hello")
s.__proto__ === String.prototype //true
s.__proto__.__proto__ === Object.prototype //true
var b = new Boolean(false)
b.__proto__ === Boolean.prototype //true
b.__proto__.__proto__ === Object.prototype //true
var o = new Object()
o.__proto__ === Object.prototype //true
3. 不寫代碼就有prototype
當(dāng)一個(gè)堆內(nèi)存沒有被引用時(shí)袁翁,就會(huì)被回收柴底。公用屬性就已經(jīng)存在,是因?yàn)闉g覽器在初始化時(shí)就創(chuàng)建了全局對(duì)象window
粱胜,它里面的Number
String
等屬性的prototype
屬性引用了公用屬性柄驻。如下圖:
四、__proto__
與prototype
精髓:
var 對(duì)象 = new 函數(shù)()
=>對(duì)象.__proto__ === 函數(shù).prototype
注意:
Object.__proto__ === Function.prototype
Object.prototype.__proto__ === null
Function.__proto__ === Function.prototype
var obj = { name: 'Mike'}
obj.toString === Object.prototype.toString //true
obj.toString === Object.toString //false
推導(dǎo)過程(運(yùn)用對(duì)象.__proto__ === 函數(shù).prototype
):
obj.__proto__ === Object.prototype
obj.toString === obj.__proto__.toString
obj.toString === Object.prototype.toString
Object.__proto__ === Function.prototype
Object.toString === obj.__proto__.toString
Object.toString === Function.prototype.toString