遇到一个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 ,包括它从 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/

10-10 22:01
查看更多