我知道下面的代码是什么,我只是无法绕过为什么。
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.Object
或myObject.object
或myObject[object]
或myObject[Object]
- 这一切都是未定义的。
foo和bar的值均为Object {}
。所以他们没有被设定。
答案 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
。
foo
和bar
已定义,但将它们用作另一个对象中的键非常奇怪。 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]
未定义,因为您尝试添加不存在的对象blah或未定义(这就是解释器在您打开控制台时抱怨的内容)
所以如果你会说
var blah= new Object();
myobject[blah]
本来可以。
与上述类似的原因,因为你已经通过将它们声明为对象来定义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命令它应该工作,但请注意属性区分大小写