Javascript 通过为另一个属性';s值多少?
我知道下面的代码是做什么的,我只是不知道为什么Javascript 通过为另一个属性';s值多少?,javascript,Javascript,我知道下面的代码是做什么的,我只是不知道为什么 var myObject = new Object(); var foo = new Object(); var bar = new Object(); myObject[foo] = 'foo'; myObject[bar] = 'bar'; console.log(myObject[foo]); // returns bar console.log(myObject); // returns [object Object]: "bar" c
var myObject = new Object();
var foo = new Object();
var bar = new Object();
myObject[foo] = 'foo';
myObject[bar] = 'bar';
console.log(myObject[foo]); // returns bar
console.log(myObject); // returns [object Object]: "bar"
console.log(myObject[blah]); // returns "blah not defined" error.
通过这个度量,myObject[blah]是如何定义的,而myObject[foo]和myObject[bar]又是如何定义的?不仅定义了,而且设置为相同的值
根据需要,对象的属性可以通过object.property
或object[property]
访问,但是如果我添加myObject.foo=“foobar”
在控制台记录日志之前,myObject[foo]
未设置为“foobar”,但myObject.foo
设置为“foobar”
如果我使用console.logmyObject.Object
或myObject.Object
或myObject[Object]
或myObject[Object]
,则返回时都是未定义的
foo和bar的值都是
Object{}
。所以它们没有被设置。您正在引用未定义的变量blah
定义了foo
和bar
,但将它们用作另一个对象中的键非常奇怪。默认情况下,JavaScript不支持HashMaps,相反,它将执行to字符串转换,这将生成“[object object]”
所以myObject[foo]
和myObject[bar]
都是myObject[“[object object]”]
您是否打算myObject[“foo”]
和myObject[“bar”]
“
语法为:
obj["property"];
// or
obj.property;
// or
var prop = "property";
obj[prop];
这里的问题在于类型
foo
是一个对象,不能使用另一个对象作为键访问对象的属性
尽管foo
将被转换为字符串,并且不会发生错误,但请注意,最终将评估的内容如下:
myObject[foo] = 'foo';
myObject[bar] = 'bar';
翻译成
myObject["[object Object]"] = 'foo';
myObject["[object Object]"] = 'bar';
按照这个标准,myObject[blah]是如何定义的,而myObject[foo]又是如何定义的
myObject[bar]已定义-不仅已定义,而且已设置为相同的值
价值
此消息错误不会告诉您密钥不存在,因为它不会是一个错误。相反,它告诉您,blah
是您尝试使用的变量,而您以前从未定义过它,因此引发未定义的引用错误
另外,不相关但
{}
语法总是优先于新对象()
按照这个标准,myObject[blah]是如何定义的
myObject[blah]
未定义,因为您试图添加不存在的对象blah或未定义的对象blah(这是打开控制台时解释器所抱怨的)
所以如果你说
var blah= new Object();
myobject[blah]
会工作得很好
- 然而,myObject[foo]和myObject[bar]是定义的——不仅定义了,而且设置为相同的值
原因与上述类似,因为您已经通过将foo和bar声明为对象来定义它们
var foo = new Object();
var bar = new Object();
它们具有相同值的原因是您为它们指定了这些值
myObject[foo] = 'foo';
myObject[bar] = 'bar';
- 根据(尝试使用MDN)…但是,如果我在控制台日志之前添加myObject.foo=“foobar”;myObject[foo]不会设置为“foobar”,但是myObject.foo会设置为“foobar”
这一部分在其他两个答案中得到了很好的回答,但为了完成。
当您说myObject.foo时,它会创建一个新的属性',如果尚未出现,则称为'myObject'的'foo'
另一种方式,当你说
myobject["foo"] //-> NOTE foo is a string. A property is created.
但是当你有
var foo = new object();
myobject[foo] // this is not correct since foo is an object here not a string
//or a property. inshort adding objects as property not a good idea.
- 如果我输入console.log myObject.Object或myObject.Object或myObject[Object]或myObject[Object]——则返回为未定义
myObject.Object//在myObject中没有名为“Object”、“Object”的属性
然而,如果你说
myObject.object = "added object property"; //OR
myObject["object"] = "added object property";
然后尝试上面的console.log命令它应该可以工作,但是请注意属性是区分大小写的对象。属性
与对象['property']
相同,而不是对象[property]
。您会看到“blah未定义”,因为找不到名为blah
的变量。对象['blah']
将避免该错误,尽管属性本身未定义。这是正确的答案。不要将对象用作其他对象的键。这是测试中的一个问题。即使在看到答案后,我也无法弄清楚发生了什么-但将其转换为基本上myObject[“[对象对象]”]=“foo”现在才有意义。