遇到一个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.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
,包括它从 x
继承的 Thingy
属性,但 而不是 ,包括它从 foo
继承的 Object
属性,我可以使用那个 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
上。关于javascript - 如何理解javascript中的if({}中的名称)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4509250/