通过括号访问的Javascript对象属性分配了另一个属性的值?

时间:2015-04-21 20:59:32

标签: 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"
console.log(myObject[blah]); // returns "blah not defined" error.

通过这种方法,myObject [blah]如何定义myObject [foo]和myObject [bar] 是如何定义的 - 不仅定义了,而且设置为相同的值?

根据http://www.w3schools.com/js/js_objects.asp,可以通过object.property object[property]访问对象的属性,但是如果我之前添加了myObject.foo = "foobar";控制台日志,myObject[foo]未设置为" foobar"但myObject.foo确实如此。

如果我是console.log myObject.ObjectmyObject.objectmyObject[object]myObject[Object] - 这一切都是未定义的。

foo和bar的值均为Object {}。所以他们没有被设定。

3 个答案:

答案 0 :(得分:4)

问题在于此处的类型。

foo是一个对象,您不能以另一个对象作为键来访问对象的属性。

虽然foo将被转换为字符串并且不会发生错误,但请注意最终将评估的内容是:

myObject[foo] = 'foo';
myObject[bar] = 'bar';

转换为

myObject["[object Object]"] = 'foo';
myObject["[object Object]"] = 'bar';
  

通过这个衡量标准,myObject [blah]如何定义myObject [foo]和   myObject [bar]已定义 - 不仅定义了,而且设置为相同   值?

此消息错误不会告诉您密钥不存在,因为它不会是错误。它告诉你的是blah是你试图使用的变量,而你以前从未定义它,因此抛出一个未定义的引用错误。


此外,不相关但{}语法始终优​​先于new Object()

答案 1 :(得分:2)

您正在引用未定义的变量blah

foobar已定义,但将它们用作另一个对象中的键非常奇怪。 JavaScript默认情况下不支持HashMaps,而是执行to-string强制转换,这会产生"[object Object]"

所以myObject[foo]myObject[bar]都只是myObject["[object Object]"]

您打算myObject["foo"]myObject["bar"]“吗?

语法是:

obj["property"];
// or
obj.property;
// or
var prop = "property";
obj[prop];

答案 2 :(得分:0)

  • 通过这种方法,myObject [blah]如何定义

myObject[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';

这部分在其他两个答案中得到了很好的回答,但是为了完成。 当你说myObject.foo时,它会创建一个新的'property',如果还没有,则为'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命令它应该工作,但请注意属性区分大小写