【问题标题】:Javascript object property accessed via brackets assigned another property's value?通过括号访问的Javascript对象属性分配了另一个属性的值?
【发布时间】:2015-04-21 20:59:31
【问题描述】:

我知道以下代码的作用,但我无法理解为什么。

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 {}。所以他们没有被设置。

【问题讨论】:

  • object.propertyobject['property'] 相同,而不是object[property]。您看到“blah not defined”是因为找不到名为 blah 的变量。 object['blah'] 会避免该错误,尽管属性本身是未定义的。

标签: javascript


【解决方案1】:

问题在于这里的类型。

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()

【讨论】:

  • 这是正确答案。不要将对象用作其他对象的键。
【解决方案2】:

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

foobar 已定义,但将它们用作另一个对象中的键很奇怪。 JavaScript 默认不支持 HashMaps,而是执行一个字符串转换,这会产生 "[object Object]"

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

您是否打算使用myObject["foo"]myObject["bar"]"?

语法是:

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

【讨论】:

  • 这是一个测试题。即使在看到答案之后,我也无法弄清楚发生了什么 - 但现在基本上将其转换为 myObject["[object Object]"] = "foo" 是有意义的。
【解决方案3】:
  • 通过这个衡量,myObject[blah] 是如何未定义的

myObject[blah] 未定义,因为您尝试添加不存在或 undefined 的对象 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' ,如果尚未存在,则称为 'foo' for 'myobject'。

你说的另一种方式

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 命令它应该可以工作,但请注意属性区分大小写

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多