我正在学习“Javascript:从Fundamentals到Functional JS”这个课程,我有一个关于对象的问题。我把这段代码写成了
的答案 'make the line box[innerBox2].full = false'
不会抛出错误。
编辑 - 将某些变量的名称更改为(希望)让我更清楚的地方
我的回答如下:
var box = {};
//Initialize the property box.myInnerBox to empty object
box.myInnerBox = {};
//Create a new variable to point to the value of box.MyInnerBox, which should be an empty object
var insideBox = box.myInnerBox;
box[insideBox].full = false; // Throws Error
但这不起作用。当我将var innerBox2分配给box.innerBox2时,它似乎不喜欢它。为什么以上代码不起作用,而下面的代码呢?具体来说,它是如何知道'otherBox'是没有第一个引用框的框的属性?为什么我不能将变量赋给box的属性? 我的问题不是关于如何使用括号与点符号。我的问题是为什么将var innerBox2
分配给box.innerBox2
的值不起作用
var box ={};
box.otherBox = {};
var innerBox2 = 'otherBox';
box[innerBox2].full = false; // No Error
非常感谢。
答案 0 :(得分:1)
您遇到的问题是了解对象在javascript中的工作原理 - 请参阅以下内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
要回答您的问题,第一个示例不起作用,因为您在对象上使用括号表示法。括号表示法必须带一个字符串(否则它会将您输入的任何内容转换为字符串,这可能不是您所期望的) - 这就是为什么第二个示例可以工作。
尝试这两个代码段,它们是等效的:
var box = {};
box.innerBox = {};
box.innerBox.filled = false;
和
var box = {};
box['innerBox'] = {};
box['innerBox']['filled'] = false;
括号表示法和点符号可以互换使用。点符号更易于阅读,通常更方便。如果要根据可以传递到括号中的变量设置/获取,括号表示法很有用。
答案 1 :(得分:0)
好的,让我们先看看为什么第二个有效。
基本上,您有两种访问对象属性的方法:someObject.someProperty
和someObject['someProperty']
在第二种情况下你正在做的是将string
'otherBox'分配给名为innerBox2的变量,然后通过向对象询问变量中给出的名称属性来尝试访问对象的属性{ {1}}转换为box[innerBox2]
。
现在是第一个案例。您已在其上创建了一个对象及其属性,该对象具有空对象box['otherBox']
的值。然后,您将从{}
返回的值分配给名为box.innerBox2
的变量。该变量现在保存一个只是一个空对象的值,它实际上是innerBox2
。现在,您尝试访问var innerBox2 = {}
对象上的属性,该对象只有box
属性且值为空对象。但是,通过innerBox2
现在字面意思是box[innerBox2]
,这意味着没有意义,因此也就是错误。
我希望你对我有意义。随意提出更多问题,不清楚。