「這是我參與2022首次更文挑戰(zhàn)的第12天篮条,活動詳情查看:2022首次更文挑戰(zhàn)」
寫在前頭
大多數(shù)小伙伴看技術(shù)書籍都會用“啃”來描述讀書的直觀感受弟头,當然我也是一個前端小白,白的透明那種涉茧,但是我在讀技術(shù)書籍感覺到“啃”的時候,我希望把我啃紅寶書第四版的過程的想法疹娶,總結(jié)帶給大家伴栓,以供后來者能夠更快上手。
注: 本文由于作者水平原因雨饺,如有錯誤之處钳垮,懇請大家指正,另外隨著學(xué)習(xí)的深入,體會的加深额港,我會不斷回來更新饺窿,修改這類文章。
思維導(dǎo)圖
脈絡(luò)
這小節(jié)就是介紹了3.4數(shù)據(jù)類型中的3.4.7. Symbol 類型移斩,3.4.8. Object 類型肚医。
3.4數(shù)據(jù)類型
3.4.7. Symbol 類型
符號是原始值,用途
符號實例是常量向瓷,符號實例是唯一肠套、不可變的。
用途:確保對象屬性使用唯一標識符猖任,不會發(fā)生屬性沖突的危險你稚。
1. 符號的基本用法
-
Symbol()函數(shù)初始化
使用 Symbol()函數(shù)初始化,不用new!var symbol = new Symbol();
-
字符串參數(shù)
①對符號的描述刁赖,調(diào)試代碼
②與符號定義或標識完全無關(guān)
沒有字面量語法
不與new關(guān)鍵字做構(gòu)造函數(shù)
為了避免包裝對象搁痛,和number,Boolean宇弛,string不同落追。確實想使用符號包裝對象
- 結(jié)合Object()函數(shù),符號包裝對象
類似數(shù)據(jù)類型轉(zhuǎn)換涯肩,將將符號作為參數(shù)傳入轿钠。
const sym = Symbol();
const sym = Number(sym);
console.log(typeof sym); // object
2. 使用全局符號注冊表
- 運用System.for()方法。
Symbol.for()對每個字符串鍵都執(zhí)行冪等操作病苗。第一次使用某個字符串調(diào)用時疗垛,它會檢查全局運行時注冊表,發(fā)現(xiàn)不存在對應(yīng)的符號硫朦,于是就會生成一個新符號實例并添加到注冊表中贷腕。后續(xù)使用相同字符串的調(diào)用同樣會檢查注冊表,發(fā)現(xiàn)存在與該字符串對應(yīng)的符號咬展,然后就會返回該符號實例泽裳。(書中原話)。
對比
const sym = Symbol('sym');
const othersym = Symbol('sym');
console.log(sym == othersym); // false
const foo = Symbol.for('foo');
const otherfoo = Symbol.for('foo');
// 即使采用相同的符號描述破婆,在全局注冊表中定義的符號跟使用 Symbol()定義的符號也并不等同
console.log(foo == otherfoo); // true
const xoo = Symbol('xoo');
const otherxoo = Symbol.for('xoo');
console.log(xoo == otherxoo); // false
必須使用字符串鍵
鍵同時也會被用作符號描述
Symbol.keyFor()來查詢?nèi)肿员?/p>
3. 使用符號作為屬性
凡是可以使用字符串或數(shù)值作為屬性的地方涮总,都可以使用符號
* Object.defineProperty()/Object.defineProperties()
* Object.getOwnPropertyNames()返回對象實例的常規(guī)屬性數(shù)組
* Object.getOwnPropertySymbols()返回對象實例的符號屬性數(shù)組
* Object.getOwnPropertyDescriptors()會返回同時包含常規(guī)和符號屬性描述符的對象
* Reflect.ownKeys()會返回兩種類型的鍵
4. 常用內(nèi)置符號
開發(fā)者可以直接訪問、重寫或模擬這些行為
是全局函數(shù) Symbol 的普通字符串屬性祷舀,指向一個符號的實例
所有內(nèi)置符號屬性都是不可寫瀑梗、不可枚舉、不可配置的
后續(xù)先鴿了(o)/~
3.4.8. Object 類型
ECMAScript 中的對象本質(zhì)
ECMAScript 中的對象其實就是一組數(shù)據(jù)和功能的集合裳扯。對象其實就是包含了很多的屬性和方法的集合抛丽。
創(chuàng)建對象
一般通過new關(guān)鍵字來創(chuàng)建對象實例。
var object = new Object();
Object 也是派生其他對象的基類
Object就是最大的對象饰豺,其他對象都會繼承他的屬性和方法亿鲜。
Object 實例都有如下屬性和方法
這些方法和屬性是所有對象都擁有的。
constructor
hasOwnProperty(propertyName)
isPrototypeOf(object)
propertyIsEnumerable(propertyName)
toLocaleString()
toString()
valueOf()
ECMA-262 中對象的行為不一定適合JavaScript 中的其他對象
由宿主環(huán)境定義和提供的宿主對象冤吨,由宿主環(huán)境定義和提供的宿主對象蒿柳。