Javascript 了解obj和两个等于{some object data}的BRAK值发生了什么

Javascript 了解obj和两个等于{some object data}的BRAK值发生了什么,javascript,arrays,object,square-bracket,Javascript,Arrays,Object,Square Bracket,有时候,最基本的可能就是不理解。我遇到了一些我需要理解的javascript代码。我添加了一个调试器,这样我就可以一步一步地进行,希望能更好地理解它,但仍然不清楚到底发生了什么 var obj = {}; var myID = 999; var productID = 1; var myModelID = 100; var myCatID = 200; var addMe = 1; if (typeof obj[myCatID] == 'undefined') { obj

有时候,最基本的可能就是不理解。我遇到了一些我需要理解的javascript代码。我添加了一个调试器,这样我就可以一步一步地进行,希望能更好地理解它,但仍然不清楚到底发生了什么

var obj = {};
var myID = 999;

var productID = 1;

var myModelID = 100;
var myCatID = 200;
    var addMe = 1; 

if (typeof obj[myCatID] == 'undefined') {
    obj[myCatID] = {};
}

var locationObj = {
    state: 'roch',
    city: '3',
    street: '2nd',
    houseNum: '101'
};

var qty = 1;

obj[myCatID][myModelID]={
    'location': locationObj,
    'quantity': qty,
    'prodID': productID,
    'id': myID
};
这是怎么回事?obj[myCatID][myModelID]=。关于obj的括号符号中的两个属性?然后给它分配一个对象?只是不清楚我在看什么

通过我的警报和调试器的输出。 !

!


最后,如果我添加一个额外的括号值,将obj[myCatID][myModelID]更改为obj[myCatID][myModelID][addMe],会怎么样?为什么会出现调试错误,uncaught TypeError:运行时无法设置undefined的属性“1”?我看不出[myModelID]和它的声明有什么不同。非常感谢您帮助我克服这个障碍。

您可以使用括号访问器访问和操作JavaScript对象

var obj = {};  // create an empty object
obj['test'] = 'Hello World';  // add an object property 'test' with content 'Hello World'
console.info(object['test']);  // Hello World
console.info(object.test);  // Hello World
如您所见,对象属性访问可以表示为
obj['propertyName']
obj.propertyName
。如果要向对象添加新属性,同样适用:
obj['newProperty']=42
obj.newProperty=42
相同

现在,如果希望在外部对象内部嵌套内部对象,可以使用多个括号访问器或点来实现这一点:
obj['prop1']['prop2']['prop3']=42
obj.prop1.prop2.prop3=42

但是:您必须分别初始化每个内部对象,然后才能访问它!否则JavaScript会说“无法设置未定义的属性”,因为您尝试访问的实际对象以前从未初始化过

var obj = {};
obj['prop1'] = {};  // creates an inner object 'prop1'
obj['prop1']['prop2']['prop3'] = 42;  // does not work because 'prop2' has never been created as an inner object

在您的示例中,您无法访问
obj[myCatID][myModelID][addMe]
,因为内部对象“myModelID”从未初始化为对象。因此,访问
obj[myCatID][myModelID]
将返回
undefined
,因此您将尝试调用
undefined['prop3']
,这将导致错误


简单的解决方案是:检查每个内部对象是否已经初始化。这是在
处代码中发生的情况,如果(typeof obj[myCatID]=“undefined”)
括号访问器允许您访问仅在运行时已知的对象属性(例如变量值)。如果属性不存在,则不会自动创建该属性,这就是为什么您不能盲目地任意组合括号访问器,而不首先确保在流程的每个步骤中定义该属性。
obj[myCatID][myModelID]
在本例中为
obj[200][100]
由于变量
myCatID
myModelID
的值,要使用
addMe
首先需要设置
obj[myCatID][myModelID]={}
,设置方式与该代码中将
obj[myCatID]
设置为
{}
的方式相同