簡體   English   中英

javascript對象文字表示法和添加到對象之間的區別

[英]Difference between javascript object literal notation and adding to objects

有人可以解釋下面的代碼中發生了什么嗎? 我希望toString被foo和bar調用,或者都不被調用。 文字對象表示法與創建對象后向其添加字段有何不同?

function Obj(v) {
    this.v = v;    
};

Obj.prototype.toString= function() {
    window.alert("to string called for " +
                this.v);
    return this.v.toString();
}        

var foo = new Obj('foo');
var bar = new Obj('bar');

// toString is not called here.
var map = {foo : 'blah'};
// toString is called here.
map[bar] = "blah2";

為什么在添加到現有對象時對象文字不使用toString()確實使用toString()?

http://jsfiddle.net/pByGJ/2/

對象文字不評估冒號左側的標識符的主要原因是,因此您不必強制引用所有文字名稱(就像在JSON中一樣)。

括號表示法會強制您引用屬性名稱,如果不引用,它將被視為變量。

在第二個示例中確實要調用toString()的原因是,必須將bar轉換為用作屬性名稱的字符串。

在第一個示例中,您只是創建一個文字對象(與{"foo" : 'blah'}完全相同)。 因此,它永遠不會使用變量foo

如果要使用變量名創建對象,則不能使用文字對象表示法,而必須使用[]強制它調用toString()

這是一個在一個表達式中創建具有變量名稱的對象的函數。

function obj(key, value /*, key, value, ... */) {
    var obj = {};
    for (var i = 0, ln = arguments.length ; i < ln; i+=2) {
        obj[arguments[i]] = arguments[i+1];
    }
    return obj;
}

更清晰的例子

變量名稱和值相同的事實無助於理解問題。 讓我建議這段代碼

var foo = new Obj('fooValue');
var bar = new Obj('barValue');

var map = {foo : 'blah'};
map[bar] = "blah2";

// You expect map to be {fooValue: 'blah', barValue: 'blah2'}
// But it's {foo: 'blah', barValue: 'blah2'}

要執行所需的操作,請使用我的obj函數

// Almost as clear as literal notation ???
var map = obj(
    foo, 'blah',
    bar, 'blah2'
);
// map = {fooValue: 'blah', barValue: 'blah2'} Yay!!

對象文字中的鍵被視為字符串,而不是被解釋為變量。 這個:

var map = {foo : 'blah'};

等效於此:

var map = {"foo" : 'blah'};

和這個:

var map = {};
map["foo"] = "blah";

但與此完全不同:

var map = {};
map[foo] = "blah";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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