you don't know JavaScript
object
- 對(duì)象的兩種創(chuàng)建方式
字面量的方式,new操作符創(chuàng)建
- 在對(duì)象中引用、創(chuàng)建、其他對(duì)象或函數(shù)的本質(zhì)含義
都只是對(duì)函數(shù)的引用,函數(shù)不屬于任何對(duì)象。
- 對(duì)象的屬性描述符有哪些?
vaule
writable
configurble
enumberable
get
set
- 對(duì)對(duì)象進(jìn)行一些限制性操作:凍結(jié)、常量化、封裝、密封;不同的操作之間的聯(lián)系?
常量化:writable:false;configurable:false;
禁止擴(kuò)展:Object.preventExtensions();
密封:Object.seal();世家還是那個(gè)等于:Object.preventExtensions() + configurable:false;
凍結(jié):Object.freeze();等于將對(duì)象密封后且不可讀,即Obejct.seal() + writable:false;
- 訪問(wèn)對(duì)象屬性和查找對(duì)象屬性的本質(zhì)?
通過(guò)描述符中set get去操作
- 對(duì)對(duì)象屬性的遍歷和對(duì)數(shù)組的遍歷有何不同?
對(duì)屬性的遍歷相當(dāng)于對(duì)索引的遍歷,而數(shù)組也可以對(duì)索引進(jìn)行遍歷,但我們往往最關(guān)心的是數(shù)組的值,所以存在遍歷數(shù)組值得方法
enumerable 可控制對(duì)象的屬性是否可以出現(xiàn)在遍歷中,為false時(shí)屬性不會(huì)出現(xiàn)在for in 循環(huán)中
反問(wèn)對(duì)象的屬性,和訪問(wèn)一個(gè)變量在內(nèi)部機(jī)制上有什么不同?
當(dāng)訪問(wèn)一個(gè)對(duì)象及其原型鏈中不存在的屬性時(shí),會(huì)返回undefined,但訪問(wèn)一個(gè)當(dāng)前詞法作用域中不存在的變量時(shí),會(huì)拋出一個(gè)ReferenceError異常。
檢查一個(gè)對(duì)象中是否有某屬性的兩種方法?
in 方法可以檢測(cè)對(duì)象中的屬性是否存在,問(wèn)什么不能檢測(cè)數(shù)組中是否有某值?
for in 循環(huán)遍歷的是什么?為什么不能用它來(lái)遍歷數(shù)組中的值?
涉及Object 屬性的一些操作方法有哪些?
去查找對(duì)象的屬性時(shí),若對(duì)象中不存在該屬性會(huì)順著原型鏈回溯去查找該屬性值,怎樣區(qū)別屬性是對(duì)象自身的屬性還是原型鏈上的屬性?
Object.hasOwnPeoperty( );
什么是深不變性和淺不變性?
in操作和Object.hasOwnProperty( )的區(qū)別?
(property in Object)會(huì)檢查該property是否存在于對(duì)象中以及它的原型鏈中;(in操作符只會(huì)檢查屬性名是否存在,而不會(huì)檢查值,所以不要用in操作符來(lái)檢查數(shù)組中的值)
Object.hasOwnPropery()只會(huì)檢查該property是否在在該對(duì)象中而不會(huì)延伸到對(duì)象的prototype中去。
- 在對(duì)象和數(shù)組中應(yīng)用for-in操作有什么不同?
由于for-in不僅會(huì)遍歷值得索引,還會(huì)遍歷所有屬性,所以如果用for-in來(lái)遍歷數(shù)組可能會(huì)造成數(shù)值和屬性混雜的問(wèn)題。
--
- JavaScript中9種內(nèi)置對(duì)象類(lèi)型和5種基本類(lèi)型?
JavaScript中的內(nèi)置對(duì)象實(shí)際上是一些內(nèi)置的函數(shù),通過(guò)內(nèi)置函數(shù)、new操作符可以創(chuàng)建一個(gè)對(duì)應(yīng)子類(lèi)型的對(duì)象。通過(guò)字面量創(chuàng)建和通過(guò)內(nèi)置函數(shù)創(chuàng)建的不同點(diǎn)在于使用 typeof 檢測(cè)出來(lái)的類(lèi)型不一樣,如:
var str1 = 'i am a coder';
var str2 = new String("i am a coder");
typeof str1;//string
typeof str2;//object
str1 instanceof String;//true
str2 instanceof object;//false
但內(nèi)置對(duì)象中的null 、 undefined屬于特殊情況,它們只有自己的文字形式而沒(méi)有構(gòu)造形式。
對(duì)象的屬性名都是字符串,即便是數(shù)組也是如此,數(shù)組的下標(biāo)就可以理解成是對(duì)象的屬性名,它們都是字符串形式。
理解在對(duì)象中引用函數(shù)的本質(zhì),如:
var person = {
name:['jack','lina','ellon'],
findId:function() {
...//具體的函數(shù)操作
},
searchTel:searchTel
};
function searchTel() {
...//具體函數(shù)操作
};
從技術(shù)角度講,函數(shù)永遠(yuǎn)不屬于任何對(duì)象####
具體講:對(duì)象中屬性訪問(wèn)的函數(shù)和其他函數(shù)沒(méi)有任何區(qū)別,(除了可能發(fā)生的隱式綁定this外);上面代碼塊中的findId 和searchTel 都是對(duì)兩個(gè)不同的函數(shù)的引用,都不能說(shuō)是屬于person這個(gè)對(duì)象,即便findId是在person中定義的。
數(shù)組也屬于對(duì)象,所以也可以給數(shù)組添加新屬性,但給數(shù)組添加一個(gè)命名屬性并不會(huì)增加數(shù)組的長(zhǎng)度(這個(gè)新屬性的屬性名要看起來(lái)不是一個(gè)整數(shù)),如果你給Array 添加的新屬性的屬性名看起來(lái)像一個(gè)整數(shù),則JavaScript引擎會(huì)把它當(dāng)做是數(shù)組的新值得下標(biāo),數(shù)組的Length也會(huì)隨之增長(zhǎng)。
屬性描述符有哪些?
configurable
enumberable
writable
value
get
set
configurble:false;可以禁止對(duì)屬性的屬性描述符進(jìn)行更改,包括刪除該屬性;但可以對(duì)該屬性重新賦值。
delete 可以用來(lái)刪除屬性,但delete僅僅只是刪除而已,并不具備釋放內(nèi)存的功能。
對(duì)象的一些操作方法:
Object.assign()
Object.defineProperty()