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;
- 訪問對(duì)象屬性和查找對(duì)象屬性的本質(zhì)?
通過描述符中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)中
反問對(duì)象的屬性,和訪問一個(gè)變量在內(nèi)部機(jī)制上有什么不同请琳?
當(dāng)訪問一個(gè)對(duì)象及其原型鏈中不存在的屬性時(shí),會(huì)返回undefined痹筛,但訪問一個(gè)當(dāng)前詞法作用域中不存在的變量時(shí),會(huì)拋出一個(gè)ReferenceError異常床佳。
檢查一個(gè)對(duì)象中是否有某屬性的兩種方法昔头?
in 方法可以檢測對(duì)象中的屬性是否存在减细,問什么不能檢測數(shù)組中是否有某值驮吱?
for in 循環(huán)遍歷的是什么狰腌?為什么不能用它來遍歷數(shù)組中的值?
涉及Object 屬性的一些操作方法有哪些洲赵?
去查找對(duì)象的屬性時(shí),若對(duì)象中不存在該屬性會(huì)順著原型鏈回溯去查找該屬性值理张,怎樣區(qū)別屬性是對(duì)象自身的屬性還是原型鏈上的屬性赫蛇?
Object.hasOwnPeoperty( );
什么是深不變性和淺不變性?
in操作和Object.hasOwnProperty( )的區(qū)別雾叭?
(property in Object)會(huì)檢查該property是否存在于對(duì)象中以及它的原型鏈中悟耘;(in操作符只會(huì)檢查屬性名是否存在,而不會(huì)檢查值织狐,所以不要用in操作符來檢查數(shù)組中的值)
Object.hasOwnPropery()只會(huì)檢查該property是否在在該對(duì)象中而不會(huì)延伸到對(duì)象的prototype中去暂幼。
- 在對(duì)象和數(shù)組中應(yīng)用for-in操作有什么不同?
由于for-in不僅會(huì)遍歷值得索引移迫,還會(huì)遍歷所有屬性旺嬉,所以如果用for-in來遍歷數(shù)組可能會(huì)造成數(shù)值和屬性混雜的問題。
--
- JavaScript中9種內(nèi)置對(duì)象類型和5種基本類型厨埋?
JavaScript中的內(nèi)置對(duì)象實(shí)際上是一些內(nèi)置的函數(shù)邪媳,通過內(nèi)置函數(shù)、new操作符可以創(chuàng)建一個(gè)對(duì)應(yīng)子類型的對(duì)象。通過字面量創(chuàng)建和通過內(nèi)置函數(shù)創(chuàng)建的不同點(diǎn)在于使用 typeof 檢測出來的類型不一樣雨效,如:
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屬于特殊情況,它們只有自己的文字形式而沒有構(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ì)象中屬性訪問的函數(shù)和其他函數(shù)沒有任何區(qū)別,(除了可能發(fā)生的隱式綁定this外)讼昆;上面代碼塊中的findId 和searchTel 都是對(duì)兩個(gè)不同的函數(shù)的引用托享,都不能說是屬于person這個(gè)對(duì)象,即便findId是在person中定義的浸赫。
數(shù)組也屬于對(duì)象闰围,所以也可以給數(shù)組添加新屬性,但給數(shù)組添加一個(gè)命名屬性并不會(huì)增加數(shù)組的長度(這個(gè)新屬性的屬性名要看起來不是一個(gè)整數(shù))既峡,如果你給Array 添加的新屬性的屬性名看起來像一個(gè)整數(shù)羡榴,則JavaScript引擎會(huì)把它當(dāng)做是數(shù)組的新值得下標(biāo),數(shù)組的Length也會(huì)隨之增長运敢。
屬性描述符有哪些校仑?
configurable
enumberable
writable
value
get
set
configurble:false;可以禁止對(duì)屬性的屬性描述符進(jìn)行更改,包括刪除該屬性传惠;但可以對(duì)該屬性重新賦值迄沫。
delete 可以用來刪除屬性,但delete僅僅只是刪除而已卦方,并不具備釋放內(nèi)存的功能羊瘩。
對(duì)象的一些操作方法:
Object.assign()
Object.defineProperty()