成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

筆記-你不知道的JS-對(duì)象

senntyou / 1534人閱讀

摘要:內(nèi)置對(duì)象,在中,它們實(shí)際上只是一些內(nèi)置函數(shù)。這些內(nèi)置函數(shù)可以當(dāng)作構(gòu)造函數(shù),使用調(diào)用,產(chǎn)生新對(duì)象。在必要時(shí)語言會(huì)自動(dòng)把字符串字面量轉(zhuǎn)換成一個(gè)對(duì)象,也就是說你并不需要顯式創(chuàng)建一個(gè)對(duì)象。屬性操作符要求屬性名滿足標(biāo)識(shí)符的命名規(guī)范。

1 如何定義
// 聲明形式,大部分情況下使用聲明形式
let obj ={
  a:2,
  b:3
};
// 構(gòu)造形式
let obj= = new Object();
obj.a=2;
obj.b=3;
2 類型

7種類型:string、boolean、number、null 、 undefined、object、symbol

typeof null === object,原理是這樣的,不同的對(duì)象在底層都表示為二進(jìn)制,在 JavaScript 中二進(jìn)制前三位都為 0 的話會(huì)被判斷為 object 類型,null 的二進(jìn)制表示是全 0,自然前三位也是 0,所以執(zhí)行 typeof 時(shí)會(huì)返回“object”。

內(nèi)置對(duì)象:String, Number, Object, Date, Boolean, Array, Function, RegExp, Error,在 JavaScript 中,它們實(shí)際上只是一些內(nèi)置函數(shù)。這些內(nèi)置函數(shù)可以當(dāng)作構(gòu)造函數(shù),使用 new 調(diào)用,產(chǎn)生新對(duì)象。

在必要時(shí)語言會(huì)自動(dòng)把字符串字面量轉(zhuǎn)換成一個(gè) String 對(duì)象,也就是說你并不需要顯式創(chuàng)建一個(gè)對(duì)象。

var strPrimitive = "I am a string"; 
console.log( strPrimitive.length ); // 13 
console.log( strPrimitive.charAt( 3 ) ); // "m"

我們都可以直接在字符串字面量上訪問屬性或者方法,之所以可以這樣做,是因?yàn)橐孀詣?dòng)把字面量轉(zhuǎn)換成 String 對(duì)象,所以可以訪問屬性和方法。同樣引擎會(huì)自動(dòng)把數(shù)字字面量轉(zhuǎn)換為Number對(duì)象,如使用3.1415.toFixed(2)

null 和 undefined 沒有對(duì)應(yīng)的構(gòu)造形式,它們只有文字形式。相反,Date 只有構(gòu)造,沒有文字形式。
對(duì)于 Object、Array、Function 和 RegExp(正則表達(dá)式)來說,無論使用文字形式還是構(gòu)造形式,它們都是對(duì)象,不是字面量。

Error 對(duì)象很少在代碼中顯式創(chuàng)建,一般是在拋出異常時(shí)被自動(dòng)創(chuàng)建。也可以使用 newError(..) 這種構(gòu)造形式來創(chuàng)建。

3 屬性

. 操作符要求屬性名滿足標(biāo)識(shí)符的命名規(guī)范。

在對(duì)象中,屬性名永遠(yuǎn)都是字符串。如果你使用 string(字面量)以外的其他值作為屬性名,那它首先會(huì)被轉(zhuǎn)換為一個(gè)字符串。

var myObject = { };
let arr = [2,3];
myObject[true] = "foo"; 
myObject[3] = "bar"; 
myObject[myObject] = "baz";
myObject[arr] =4;
myObject["true"]; // "foo"
myObject["3"]; // "bar"
myObject["[object Object]"]; // “baz”
myObject["2,3"]; // 4

為數(shù)組添加命名屬性,但數(shù)組的length值不會(huì)變

4 復(fù)制

對(duì)于 JSON 安全(也就是說可以被序列化為一個(gè) JSON 字符串并且可以根據(jù)這個(gè)字符串解析出一個(gè)結(jié)構(gòu)和值完全一樣的對(duì)象)的對(duì)象來說,有一種巧妙的復(fù)制方法:

var newObj = JSON.parse( JSON.stringify( someObj ) );
Object.assign(..) 方法的第一個(gè)參數(shù)是目標(biāo)對(duì)象,之后還可以跟一個(gè)或多個(gè)源對(duì)象。它會(huì)遍歷一個(gè)或多個(gè)源對(duì)象的所有可枚舉(enumerable,參見下面的代碼)的自有鍵(owned key,很快會(huì)介紹)并把它們復(fù)制(使用 = 操作符賦值)到目標(biāo)對(duì)象,最后返回目標(biāo)對(duì)象。

5 屬性描述符
var myObject = { a:2};
Object.getOwnPropertyDescriptor( myObject, "a" );
// {
// value: 2,
// writable: true,
// enumerable: true,
// configurable: true 
// }
// writable(可寫)、 enumerable(可枚舉)和 configurable(可配置)

不管是不是處于嚴(yán)格模式,嘗試修改一個(gè)不可配置的屬性描述符都會(huì)出錯(cuò),也不可以刪除該屬性。注意:如你所見,把 configurable 修改成false 是單向操作,無法撤銷!要注意有一個(gè)小小的例外:即便屬性是 configurable:false,我們還是可以把 writable 的狀態(tài)由 true 改為 false,但是無法由 false 改為 true。

enumerable描述符控制的是屬性是否會(huì)出現(xiàn)在對(duì)象的屬性枚舉中,比如說for..in 循環(huán)。如果把 enumerable 設(shè)置成 false,這個(gè)屬性就不會(huì)出現(xiàn)在枚舉中,雖然仍然可以正常訪問它。

6 不變性

1 結(jié)合 writable:false 和 configurable:false 就可以創(chuàng)建一個(gè)真正的常量屬性

2 如果你想禁止一個(gè)對(duì)象添加新屬性并且保留已有屬性,可以使用 Object.preventExtensions(..)

3 Object.seal(..) 會(huì)創(chuàng)建一個(gè)“密封”的對(duì)象,這個(gè)方法實(shí)際上會(huì)在一個(gè)現(xiàn)有對(duì)象上調(diào)用Object.preventExtensions(..) 并把所有現(xiàn)有屬性標(biāo)記為 configurable:false。所以,密封之后不僅不能添加新屬性,也不能重新配置或者刪除任何現(xiàn)有屬性(雖然可以修改屬性的值)。

4 Object.freeze(..) 會(huì)創(chuàng)建一個(gè)凍結(jié)對(duì)象,這個(gè)方法實(shí)際上會(huì)在一個(gè)現(xiàn)有對(duì)象上調(diào)用Object.seal(..) 并把所有“數(shù)據(jù)訪問”屬性標(biāo)記為 writable:false,這樣就無法修改它們的值。你可以“深度凍結(jié)”一個(gè)對(duì)象,具體方法為,首先在這個(gè)對(duì)象上調(diào)用 Object.freeze(..),然后遍歷它引用的所有對(duì)象并在這些對(duì)象上調(diào)用 Object.freeze(..)。但是一定要小心,因?yàn)檫@樣做有可能會(huì)在無意中凍結(jié)其他(共享)對(duì)象。

7 [[Get]]和[[Put]]

在語言規(guī)范中,myObject.a 在 myObject 上實(shí)際上是實(shí)現(xiàn)了 [[Get]] 操作(有點(diǎn)像函數(shù)調(diào)用:[[Get]]())。對(duì)象默認(rèn)的內(nèi)置 [[Get]] 操作首先在對(duì)象中查找是否有名稱相同的屬性,如果找到就會(huì)返回這個(gè)屬性的值。如果沒有找到名稱相同的屬性,會(huì)遍歷可能存在的 [[Prototype]] 鏈,也就是原型鏈。若在原型鏈上也沒有找到,那就返回undefined。

[[Put]] 被觸發(fā)時(shí),如果已經(jīng)存在這個(gè)屬性,[[Put]] 算法大致會(huì)檢查下面這些內(nèi)容。

屬性是否是訪問描述符(參見3.3.9節(jié))?如果是并且存在setter就調(diào)用setter。

屬性的數(shù)據(jù)描述符中writable是否是false?如果是,在非嚴(yán)格模式下靜默失敗,在嚴(yán)格模式下拋出 TypeError 異常。

如果都不是,將該值設(shè)置為屬性的值。

如果對(duì)象中不存在這個(gè)屬性,[[Put]] 操作會(huì)更加復(fù)雜。

8 存在性

in 操作符會(huì)檢查屬性是否在對(duì)象及其 [[Prototype]] 原型鏈中。

hasOwnProperty(..) 只會(huì)檢查屬性是否在 myObject 對(duì)象中,不會(huì)檢查 [[Prototype]] 鏈。

所有的普通對(duì)象都可以通過對(duì)于 Object.prototype 的委托來訪問hasOwnProperty(..), 但 是 有 的 對(duì) 象 可 能 沒 有 連 接 到 Object.prototype( 通 過Object.create(null) 來創(chuàng)建)。在這種情況下,形如 myObejct.hasOwnProperty(..)就會(huì)失敗。這時(shí)可以使用Object.prototype.hasOwnProperty.
call(myObject,"a")。

9 遍歷

for..in 循環(huán)可以用來遍歷對(duì)象的可枚舉屬性列表(包括 [[Prototype]] 鏈)。

對(duì)于數(shù)值索引的數(shù)組來說,可以使用標(biāo)準(zhǔn)的 for 循環(huán)來遍歷值,或者使用for...of循環(huán),for..of 循環(huán)首先會(huì)向被訪問對(duì)象請(qǐng)求一個(gè)迭代器對(duì)象,然后通過調(diào)用迭代器對(duì)象的next() 方法來遍歷所有返回值。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/104375.html

相關(guān)文章

  • 筆記-你不知道JS-原型

    摘要:如果存在于原型鏈上層,賦值語句的行為就會(huì)有些不同。中包含的屬性會(huì)屏蔽原型鏈上層的所有屬性,因?yàn)榭偸菚?huì)選擇原型鏈中最底層的屬性。如果不直接存在于中而是存在于原型鏈上層時(shí)會(huì)出現(xiàn)的三種情況。類構(gòu)造函數(shù)原型函數(shù),兩個(gè)函數(shù)通過屬性和屬性相關(guān)聯(lián)。 1 [[Prototype]] 對(duì)于默認(rèn)的 [[Get]] 操作來說,如果無法在對(duì)象本身找到需要的屬性,就會(huì)繼續(xù)訪問對(duì)象的 [[Prototype]] ...

    vincent_xyb 評(píng)論0 收藏0
  • 筆記-你不知道JS-原型

    摘要:如果存在于原型鏈上層,賦值語句的行為就會(huì)有些不同。中包含的屬性會(huì)屏蔽原型鏈上層的所有屬性,因?yàn)榭偸菚?huì)選擇原型鏈中最底層的屬性。如果不直接存在于中而是存在于原型鏈上層時(shí)會(huì)出現(xiàn)的三種情況。類構(gòu)造函數(shù)原型函數(shù),兩個(gè)函數(shù)通過屬性和屬性相關(guān)聯(lián)。 1 [[Prototype]] 對(duì)于默認(rèn)的 [[Get]] 操作來說,如果無法在對(duì)象本身找到需要的屬性,就會(huì)繼續(xù)訪問對(duì)象的 [[Prototype]] ...

    AndroidTraveler 評(píng)論0 收藏0
  • 你不知道JS》讀書筆記---作用域及閉包

    摘要:注此讀書筆記只記錄本人原先不太理解的內(nèi)容經(jīng)過閱讀你不知道的后的理解。作用域及閉包基礎(chǔ),代碼運(yùn)行的幕后工作者引擎及編譯器。 注:此讀書筆記只記錄本人原先不太理解的內(nèi)容經(jīng)過閱讀《你不知道的JS》后的理解。 作用域及閉包基礎(chǔ),JS代碼運(yùn)行的幕后工作者:引擎及編譯器。引擎負(fù)責(zé)JS程序的編譯及執(zhí)行,編譯器負(fù)責(zé)詞法分析和代碼生成。那么作用域就像一個(gè)容器,引擎及編譯器都從這里提取東西。 ...

    denson 評(píng)論0 收藏0
  • 筆記-你不知道JS-this

    摘要:綁定使用來調(diào)用函數(shù),或者說發(fā)生構(gòu)造函數(shù)調(diào)用時(shí),會(huì)自動(dòng)執(zhí)行下面的操作。 1 this的概念 this 在任何情況下都不指向函數(shù)的詞法作用域。作用域?qū)ο鬅o法通過 JavaScript代碼訪問,它存在于 JavaScript 引擎內(nèi)部。 this 是在運(yùn)行時(shí)進(jìn)行綁定的,并不是在編寫時(shí)綁定,它的上下文取決于函數(shù)調(diào)用時(shí)的各種條件。this 的綁定和函數(shù)聲明的位置沒有任何關(guān)系,只取決于函數(shù)的調(diào)用方...

    leanote 評(píng)論0 收藏0
  • 你不知道javascript》筆記_對(duì)象&原型

    摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...

    seasonley 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<