[英]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()?
對象文字不評估冒號左側的標識符的主要原因是,因此您不必強制引用所有文字名稱(就像在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.