[英]How to understand if (name in {}) in javascript?
我遇到了一個js函數片段,列表如下
each = function(obj, fun) {
if (typeof fun != "function") {
return obj
}
if (obj) {
var return_value;
if (obj.length === undefined) {
for (var name in obj) {
if (name in {}) { // how to undertand this line, what's purpose?
continue
}
return_value = fun.call(obj[name], obj[name], name);
if (return_value == "break") {
break
}
}
} else {
for (var i = 0,
length = obj.length; i < length; i++) {
return_value = fun.call(obj[i], obj[i], i);
if (return_value == "break") {
break
}
}
}
}
return obj
};
感謝您的回答:)
它正在做的是查看該屬性名稱是否存在於空白對象中。 因此,例如,它將過濾掉toString
(在沒有關於toString
和in
錯誤的實現上; IE是)。
這可能是嘗試解決人們向Object.prototype
添加內容的Object.prototype
(這是一個非常非常糟糕的主意)。 例如:
Object.prototype.foo = "bar"; // <== VERY BAD IDEA
alert({}.foo); // alerts "bar"
function Thingy(a, b) {
this.a = a;
this.b = b;
}
Thingy.prototype.x = 42;
var t = new Thingy(1, 2);
如果我想復制t
,包括它從Thingy
繼承的x
屬性但不包括它從Object
繼承的foo
屬性,我可以使用if (name in {})
跳過那些。
請注意,這不是一個非常聰明的方法,因為如果我這樣做會失敗:
var t = new Thingy(1, 2);
t.foo = "charlie";
現在t
都有自己 foo
,這大概我早就想復制。
更徹底的檢查將是:
dest = {};
blank = {}; // No need to recreate it on every iteration
for (name in src) {
if (src.hasOwnProperty(name) || !(name in blank)) {
dest[name] = src[name];
}
}
這只會過濾掉從Object
繼承或至少可能繼承的那些。 但即便如此也是有缺陷的; 如果它繼承了屬性的值,而不是Object
的值(例如,中間的東西 - 也許是Thingy
- 已經覆蓋了Object
的默認值)會怎么樣?
因此,您可能希望重構您繼承的代碼,可能是使用hasOwnProperty
並確保應用程序中的任何位置都不會將內容放在Object.prototype
。
In是一個特殊的運算符,如果指定的屬性在指定的對象中,則返回true。
來自https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/in_Operator
每個對象(包括{})都從Object.prototype繼承屬性。 如果name
是那些繼承屬性之一, if
在這里繼續循環。
示例: console.log('toString' in {});
記錄為true
。 console.log('customProperty' in {});
記錄錯誤。
如果第二個操作數中的屬性具有第一個操作符的標識符,則in
運算符返回true,否則返回false。 所以, name in {}
檢查是否存在與價值的名稱的屬性name
。
這似乎很奇怪,因為{}
似乎沒有任何屬性。 但是普通對象繼承了Object.prototype中的一些屬性。 所以"toString" in {}
返回true,因為有Object.prototype.toString
。 還有從Object.prototype.hasOwnProperty
繼承的hasOwnProperty
方法可以替代使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.