访问对象和分配变量

时间:2016-04-13 18:14:43

标签: javascript

我正在学习“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

非常感谢。

2 个答案:

答案 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.somePropertysomeObject['someProperty']

在第二种情况下你正在做的是将string'otherBox'分配给名为innerBox2的变量,然后通过向对象询问变量中给出的名称属性来尝试访问对象的属性{ {1}}转换为box[innerBox2]

现在是第一个案例。您已在其上创建了一个对象及其属性,该对象具有空对象box['otherBox']的值。然后,您将从{}返回的值分配给名为box.innerBox2的变量。该变量现在保存一个只是一个空对象的值,它实际上是innerBox2。现在,您尝试访问var innerBox2 = {}对象上的属性,该对象只有box属性且值为空对象。但是,通过innerBox2现在字面意思是box[innerBox2],这意味着没有意义,因此也就是错误。

我希望你对我有意义。随意提出更多问题,不清楚。