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.log
myObject.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”现在才有意义。