es6 javascript屬性的可列舉性

2021-07-25 02:26:35 字數 1126 閱讀 1963

物件的每個屬性都有乙個描述物件( descriptor ),用來控制該屬性的行為。object.getownpropertydescriptor方法可以獲取該屬性的描述物件。

let obj = ;

object.getownpropertydescriptor(obj, 'foo')

//

描述物件的enumerable屬性,稱為 」 可列舉性 「 ,如果該屬性為false,就表示某些操作會忽略當前屬性。

es5 有三個操作會忽略enumerable為false的屬性。

for...in迴圈:只遍歷物件自身的和繼承的可列舉的屬性

object.keys():返回物件自身的所有可列舉的屬性的鍵名

json.stringify():只序列化物件自身的可列舉的屬性

es6 新增了乙個操作object.assign(),會忽略enumerable為false的屬性,只拷貝物件自身的可列舉的屬性。

這四個操作之中,只有for...in會返回繼承的屬性。實際上,引入enumerable的最初目的,就是讓某些屬性可以規避掉for...in操作。比如,物件原型的tostring方法,以及陣列的length屬性,就通過這種手段,不會被for...in遍歷到。

object.getownpropertydescriptor(object.prototype, 'tostring').enumerable

// false

object.getownpropertydescriptor(, 'length').enumerable

// false

上面**中,tostring和length屬性的enumerable都是false,因此for...in不會遍歷到這兩個繼承自原型的屬性。

另外, es6 規定,所有 class 的原型的方法都是不可列舉的。

object.getownpropertydescriptor(class }.prototype, 'foo').enumerable

// false

總的來說,操作中引入繼承的屬性會讓問題複雜化,大多數時候,我們只關心物件自身的屬性。所以,盡量不要用for...in迴圈,而用object.keys()代替。

es6 javascript物件屬性的簡潔表示法

es6 允許直接寫入變數和函式,作為物件的屬性和方法。這樣的書寫更加簡潔。var foo bar var baz baz 等同於 var baz 上面 表明,es6 允許在物件之中,只寫屬性名,不寫屬性值。這時,屬性值等於屬性名所代表的變數。下面是另乙個例子。function f x,y 等同於 f...

es6 javascript物件的擴充套件運算子

目前,es7 有乙個提案,將 rest 解構賦值 擴充套件運算子 引入物件。babel 轉碼器已經支援這項功能。1 rest 解構賦值 物件的 rest 解構賦值用於從乙個物件取值,相當於將所有可遍歷的 但尚未被讀取的屬性,分配到指定的物件上面。所有的鍵和它們的值,都會拷貝到新物件上面。let x ...

ES6 JavaScript 的深複製和淺複製

react中,我們會遇到乙個有趣的問題,那就是物件的複製,為什麼說有趣,是因為直覺和結果差距很大。我們看一下這個例子 let a let b a a.title 淺複製 那麼我們會獲得兩個物件,乙個a,乙個b,a的title是淺複製,b的title是深複製。但結果真是這樣嗎?我們console.lo...