gpt4 book ai didi

javascript - 如何理解 if (name in {}) 在 javascript 中?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:28:42 24 4
gpt4 key购买 nike

遇到一个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(在关于 toStringin 没有问题的实现上;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,包括它从 Thingy 继承的 x 属性,但包括 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 - 如何理解 if (name in {}) 在 javascript 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4509250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com