2016-04-13 147 views
-1

我正在学习“Javascript:从基础到功能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'是没有第一个引用框的框的属性?为什么我不能将变量分配给框的属性? 我的问题不是关于如何使用括号vs点符号。我的问题是,为什么分配var innerBox2box.innerBox2值不起作用

var box ={}; 
box.otherBox = {}; 

var innerBox2 = 'otherBox'; 

box[innerBox2].full = false; // No Error 

非常感谢。

+0

'box [innerBox2]'与'box.innerBox2'不一样。 –

+0

这就是为什么我试图用'var innerBox2 = box.innerBox2'这一行来设置它。为什么这不起作用? – EFH

回答

0

好了,让我们开始为什么第二个作品。

基本上你访问对象属性的两种方式:通过询问someObject.somePropertysomeObject['someProperty']

你正在做在第二种情况下什么是分配string“otherBox”变量命名innerBox2,然后试图访问一个对象的属性对象的变量名称如box[innerBox2],其翻译为box['otherBox']

我们第一种情况。您已经创建了一个对象和一个属性,它具有空对象{}的值。然后,您将从box.innerBox2返回的值分配给名为innerBox2的变量。该变量现在拥有一个只是一个空对象的值,它实际上就是这个var innerBox2 = {}。现在您试图访问box对象上的一个属性,该属性只有innerBox2属性,其值为空对象。但通过做box[innerBox2]现在字面意思是box[{}]这是没有意义,因此是错误。

我希望它对您有意义。随意问任何更多它不清楚。

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; 

括号符号和点符号可以互换使用。点符号更适合可读性,通常更方便。如果您想基于可以传递到括号中的变量设置/获取括号符号,则该符号很有用。

+0

对,我明白在'box [innerBox2] .fill = false;'innerBox2必须是一个变量。这就是为什么我试图将'var innerBox2'赋值给'box.innerBox2',我已经初始化为一个空对象,认为这会将变量innerBox2赋值给box.innerBox2,它是一个空对象。我的问题是为什么将'box.innerBox2'分配给变量会引发错误。 – EFH

+0

@EFH在你描述的情况下,'box [innerBox2]','innerBox2'不一定是一个变量。有可能。它必须是一个字符串。 – Damon

+0

@EFH括号表示法中使用的表达式必须是字符串,因此它将转换为字符串。一个对象的toString()是'[object Object]',所以实际上'box [innerBox2] .full = false'就像是说'box ['[object Object]'full = false;'因为'box ['[object Object]''是'undefined'。如果你之前有一行像'box ['[object Object]'= {};'它不会抛出错误。 – Paulpro

1

托架符号需要一个字符串,其值是属性的名称。如果你使用一个对象,那么它会被转换成一个String。

innerBox2最终被转换为字符串“[对象的对象]”,所以这是该属性它试图访问,而不是“innerBox2”。

+0

是不是真的,如果没有引号,它会期望''innerBox2''中的'innerBox2'是一个变量(换句话说,充当索引)?第二个例子工作正常,只是这样做,而不是设置'var innerBox2'等于''otherBox'',我设置'var innerBox2'等于'box.innerBox2'(这可能是混淆来自何处,我可能会需要更改名称以使其更清晰),以便将其设置为box.innerBox2的**值**,该值是一个空对象。 – EFH