思考這樣一個(gè)問題煌抒,假如你定義了一個(gè)Array
var a = [1,2,3,4,5];
然后你對(duì)這個(gè)數(shù)組進(jìn)行了for...in循環(huán)求和操作
var total = null;
for (var i in a) {
total += a[i];
}
cosole.log(total); //15
過了一段時(shí)間,你的teammate為了解決一個(gè)排序問題忘蟹,像Array函數(shù)添加了一個(gè)原型方法order
Array.prototype.order = function() {
//排序操作
};
這時(shí)候你再去執(zhí)行你的求和操作斗塘,會(huì)發(fā)現(xiàn)結(jié)果不再是15了而是
原因是Array數(shù)組的原型方法也被遍歷出來了欣舵,這里就涉及到j(luò)s可枚舉屬性了滞伟。
js中什么是可枚舉屬性######
js中每個(gè)對(duì)象的屬性(js里萬物皆屬性揭鳞,對(duì)象的屬性也是對(duì)象)都有一個(gè)屬性叫enumerable(可枚舉性),這個(gè)屬性true/false決定了該對(duì)象的屬性是否可枚舉(就是讓一些方法訪問到這個(gè)屬性)梆奈。
js中哪些屬性可枚舉汹桦,哪些不可枚舉?######
- js基本數(shù)據(jù)類型自帶的原型屬性不可枚舉鉴裹。
- 通過Object.defineProperty()方法指定enumeralbe為false的屬性不可枚舉。
js中哪些方法會(huì)訪問到enumerable為true的對(duì)象屬性钥弯?######
- for...in操作
- Object.keys()方法(和for...in的區(qū)別就是Object.keys()不會(huì)返回對(duì)象原型鏈上的屬性)
- JSON.stringify()方法径荔。
雖然enumerable為false的屬性上述三個(gè)方法不能訪問到,但是你要是直接獲取的話脆霎,還是能直接獲取到的总处。
回過頭來看最開始的情形,你總不能要求別人把它定義的原型方法刪除睛蛛,這時(shí)候就要用到object.hasOwnProperty()方法了鹦马。
該方法會(huì)判斷一個(gè)對(duì)象是否含有指定的屬性,但是會(huì)忽略從原型鏈上繼承的屬性忆肾。
將開頭的代碼改成如下:
var total = null;
for (var i in a) {
if (a.hasOwnProperty(i)) {
total += a[i];
}
}
cosole.log(total); //15
現(xiàn)在就沒有原先那樣奇怪的結(jié)果了荸频。