一、全局對(duì)象
window有很多屬性搀突,重點(diǎn)介紹以下幾個(gè):
parseInt()是將其它數(shù)據(jù)類(lèi)型轉(zhuǎn)成整型數(shù)值
parseFloat()是將其他數(shù)據(jù)類(lèi)型轉(zhuǎn)成浮點(diǎn)型數(shù)值
Number()是將其他數(shù)據(jù)類(lèi)型轉(zhuǎn)成數(shù)值型
String()是將其它數(shù)據(jù)類(lèi)型轉(zhuǎn)成字符型
Boolean()是將其它數(shù)據(jù)類(lèi)型轉(zhuǎn)成布爾值
Object()是將其他數(shù)據(jù)類(lèi)型轉(zhuǎn)成對(duì)象
以上是ECMA Script規(guī)定的
每個(gè)瀏覽器都會(huì)有自己私有的屬性仰迁,以下屬性沒(méi)有寫(xiě)進(jìn)ECMA Script規(guī)定中:
alert()是彈窗提示
prompt()是用戶可以自己填寫(xiě)內(nèi)容顽分,并獲取該內(nèi)容
confirm()是用戶可以自己進(jìn)行確認(rèn)卒蘸,如果確認(rèn)則返回true,取消則返回false
console.log()是用戶可以自控制臺(tái)打印出想要打印的東西
document()是關(guān)于文檔的屬性
var n1 = 1
var n2 = new Number(1)
請(qǐng)問(wèn)澄步,此時(shí)n1和n2有什么區(qū)別呢村缸?
這里的n1只是一個(gè)數(shù)字,存放在stack中仇箱,打印出的n1只是數(shù)字1
n2就會(huì)是一個(gè)對(duì)象东羹,stack里面存放的是一個(gè)地址属提,heap中存放了很多關(guān)于它的屬性。
我們知道堪滨,Number沒(méi)有toString的屬性袱箱,只有object才有toString的屬性义矛,那我們?cè)趯?duì)Number進(jìn)行字符串轉(zhuǎn)換(toString())的時(shí)候,內(nèi)存里是一個(gè)怎樣的過(guò)程呢筐咧?
var n = 1
n.toString() ? ? ? //這里n是不應(yīng)該有toString屬性的量蕊,其實(shí)內(nèi)部有這樣的一個(gè)變換
==> temp = new Number(n)
? ? ? ?temp.toString()
之后再把temp清除
二艇挨、字符串的屬性
charAt() 獲取某一個(gè)索引對(duì)應(yīng)的字符
var s = 'abcdefg'
s.charAt(0) //'a' =>s[0]
charCodeAt() 獲取某一個(gè)索引對(duì)應(yīng)的字符的編碼
var s = 'a'
s.charCodeAt(0) //97
toString(16)獲取數(shù)字的十六進(jìn)制的值
(100).toString(16) //64
trim() 去掉空格的字符串
' username '.trim()
//"username"
concat() 連接兩個(gè)字符串
var s1 = 'Hello'
var s2 = 'World'
s1.concat(s2)
//HelloWorld
slice() 分割字符串
var s1 = 'Hello'
s1.slice(0,2)
//"He"
s1.slice(0,3)
//"Hel"
replace() 替換字符串中的某位元素
var s1 = 'Hello'
s1.replace('e','o')
//"Hollo"
但值得注意的是势就,s1還是"Hello"
split() 將一個(gè)字符串分割為字符串?dāng)?shù)組
var str="How are you doing today?"
document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))
//How,are,you,doing,today?
//H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
//How,are,you
提問(wèn):打印結(jié)果是什么?
var f1 = false
var f2 = new Boolean(false)
if(f1){console.log(1)}
if(f2){console.log(2)}
打印的結(jié)果是2袖牙,因?yàn)閷?duì)象的bool值都為true舅锄,f2是一個(gè)對(duì)象
三、原型與原型鏈
每一個(gè)對(duì)象都有一些公共的屬性畴蹭,例如toString()叨襟,valueOf()等等幔荒,如果創(chuàng)建一個(gè)對(duì)象,就要給這個(gè)對(duì)象這些屬性的話右犹,就很浪費(fèi)空間傀履,因此莉炉,我們給這個(gè)對(duì)象一個(gè)_proto_屬性碴犬,這個(gè)屬性里就包含了該對(duì)象擁有的公共屬性服协,我們將這個(gè)公共屬性全部放到一個(gè)對(duì)象里,這就是叫做prototype窘游,也就是原型跳纳。我們可以看到:
var o1 = {}
var o2 = {}
o1.toString === o2.toString
true
說(shuō)明o1和o2的toString是一樣的寺庄,他們公用同一個(gè)toString力崇。
然而亮靴,不是對(duì)象的其他的數(shù)據(jù)類(lèi)型也有很多公共的屬性于置,例如Number俱两,Number有很多自帶的屬性,例如toString(16)休讳,toFixed()尿孔,toExponential()活合,這些屬性是Object沒(méi)有的,這時(shí)留晚,Number一開(kāi)始就指向的是所有Number自帶的公共屬性告嘲,在這個(gè)公共屬性中橄唬,又有一個(gè)_proto_,指向Object的公共屬性隆判,Object的屬性是所有數(shù)據(jù)類(lèi)型的公共屬性僧界。prototype是瀏覽器給的捂襟,因?yàn)椴蛔寯?shù)據(jù)類(lèi)型自帶的共有屬性被垃圾回收,prototype也是一個(gè)對(duì)象郎汪。
如圖所示,string抛计,number吹截,bool都會(huì)先指向自帶的公共屬性凝危,然后再指向object的公共屬性,因此形成一個(gè)原型鏈懦铺。
提問(wèn):有下劃線的proto和無(wú)下劃線的prototype的區(qū)別是什么冬念?
答:第一個(gè)是對(duì)象的屬性牧挣,第二個(gè)是函數(shù)的屬性
四、燒腦環(huán)節(jié)
我們應(yīng)當(dāng)首先看懂上面的圖裆针,new一個(gè)對(duì)象后世吨,該對(duì)象的_proto等于該函數(shù)的prototype的另假。
例如:var n = new Number(1)
此時(shí)奏甫,n是一個(gè)對(duì)象胜蛉,n的_proto指向的是Number的prototype。
以下定理是我們應(yīng)該牢記的:
1.對(duì)象會(huì)有一個(gè)_proto屬性
2.函數(shù)有一個(gè)prototype對(duì)象
3.prototype對(duì)象 是一個(gè)對(duì)象,所以它有_proto恕稠,所有的prototype對(duì)象的_proto_都指向Object.prototype
var 對(duì)象 = new 函數(shù)()
①對(duì)象._proto_ === 函數(shù).prototype???????
②函數(shù).prototype._proto_ === Object.prototype
③函數(shù)._proto_ === Function.prototype
④Function._proto_ === Function.prototyoe
⑤Function.prototype._proto_ ===Object.prototype
對(duì)于②,函數(shù).prototype是一個(gè)對(duì)象凑懂,所以它的_proto是指向Object.prototype
對(duì)于③巷帝,函數(shù)是由Function構(gòu)造的笤闯,所以它的_proto是指向Function的prototype
對(duì)于④时呀,F(xiàn)unction優(yōu)先是一個(gè)函數(shù)瞧预,再是一個(gè)對(duì)象滩愁,所以在④中,F(xiàn)unction的_proto_是指向自己的prototype