物件的每個屬性都有乙個描述物件( descriptor ),用來控制該屬性的行為。object.getownpropertydescriptor方法可以獲取該屬性的描述物件。
描述物件的enumerable屬性,稱為 」 可列舉性 「 ,如果該屬性為false,就表示某些操作會忽略當前屬性。let obj = ;
object.getownpropertydescriptor(obj, 'foo')
//
es5 有三個操作會忽略enumerable為false的屬性。
for...in迴圈:只遍歷物件自身的和繼承的可列舉的屬性
object.keys():返回物件自身的所有可列舉的屬性的鍵名
json.stringify():只序列化物件自身的可列舉的屬性
es6 新增了乙個操作object.assign(),會忽略enumerable為false的屬性,只拷貝物件自身的可列舉的屬性。
這四個操作之中,只有for...in會返回繼承的屬性。實際上,引入enumerable的最初目的,就是讓某些屬性可以規避掉for...in操作。比如,物件原型的tostring方法,以及陣列的length屬性,就通過這種手段,不會被for...in遍歷到。
上面**中,tostring和length屬性的enumerable都是false,因此for...in不會遍歷到這兩個繼承自原型的屬性。object.getownpropertydescriptor(object.prototype, 'tostring').enumerable
// false
object.getownpropertydescriptor(, 'length').enumerable
// false
另外, es6 規定,所有 class 的原型的方法都是不可列舉的。
總的來說,操作中引入繼承的屬性會讓問題複雜化,大多數時候,我們只關心物件自身的屬性。所以,盡量不要用for...in迴圈,而用object.keys()代替。object.getownpropertydescriptor(class }.prototype, 'foo').enumerable
// false
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...