前言 關于屬性
屬性類型:
對象有兩種屬性類型:String類型屬性 與 Symbol類型屬性。它們通常被稱為屬性與符號屬性。
屬性描述符:
對象的每個屬性都有一個屬性描述符。屬性描述符分兩種:數(shù)據(jù)描述符 與 訪問器描述符。
- 描述符也是一個對象
- 描述符必須是這兩種形式之一,不能同時是兩者
- 對象添加屬性時,新屬性默認擁有一個數(shù)據(jù)描述符,且
configurable、enumerable、writable都為true
兩種描述符共有的屬性:
- configurable
-
enumerable 影響
for...inObject.keys()Object.entries()Object.assign()
數(shù)據(jù)描述符特有的屬性:
- value
- writable
訪問器描述符特有的屬性:
- get
- set
屬性的劃分
- 屬性 / 符號屬性
- 自身屬性 / 原型鏈上的屬性
- 是否可枚舉 - enumerable
- 是否可寫 - writable
- 是否可配置 - configurable
與屬性相關的內(nèi)建方法
for...in
- 以任意順序遍歷一個對象的可枚舉屬性
- 循環(huán)將遍歷對象自身的所有可枚舉屬性,以及原型鏈上的可枚舉屬性(更接近原型鏈中對象的屬性覆蓋原型屬性)
- 不包括Symbol屬性
- 一個在被訪問之前已經(jīng)被刪除的屬性將不會在之后被訪問;在迭代進行時被添加到對象的屬性,可能在之后的迭代被訪問,也可能被忽略
- 不應被用于迭代一個 Array,應用
for...of或forEach
Object.getOwnPropertyNames()
- 返回一個給定對象自身的所有String屬性名的字符串數(shù)組
- 不包括Symbol屬性
- 包括可枚舉與不可枚舉
Object.getOwnPropertySymbols()
- 返回一個給定對象自身的所有 Symbol 屬性的Symbol數(shù)組
- 包括可枚舉與不可枚舉
Object.keys()
- 返回一個由一個給定對象的自身、可枚舉屬性組成的數(shù)組
- 不包括Symbol屬性
Object.assign()
- 拷貝源對象自身并且可枚舉的屬性到目標對象
- 會拷貝對象自身的Symbol屬性
- 對復制源,只會調用其getter,拷貝它的值,而不會復制getter。也不會復制屬性的定義,如果要復制定義,應使用
Object.getOwnPropertyDescriptor()和Object.defineProperty() - 會跳過那些值為
null或undefined的源對象
Object.entries()
- 返回一個給定對象自身,可枚舉屬性的鍵值對數(shù)組
- 不包括Symbol屬性
Object.isExtensible()
Object.preventExtensions()
對象不可擴展:
- 永遠不能再添加新的屬性
- __proto__屬性的值不可被修改
Object.isSealed()
Object.seal()
對象密封:
- 不可擴展
- configurable= false (不可修改屬性的描述或刪除屬性)
- 可寫性描述(writable)為可寫的屬性的值仍然可以被修改
- 不會影響從原型鏈上繼承的屬性
Object.isFrozen()
Object.freeze()
對象凍結:
- 不可擴展
- 密封
- writable=false
- 如果一個屬性的值是個對象,則這個對象中的屬性是可以修改的,除非它也是個凍結對象