簡體   English   中英

如何在javascript中理解if({}中的名字)?

[英]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 (在沒有關於toStringin錯誤的實現上; 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM