这是我在一个更大的项目中遇到的一些简化,所以我希望它有意义。
我有两个对象:
FirstObj = {
data : [],
init : function()
{
for(var a = 0; a < 20; a++)
{
this.data[a] = 1;
}
}
};
SecondObj = {
init : function()
{
var cell = FirstObj.data[0];
cell = 0;
}
};
然后我调用两个init
方法并记录结果:
(function(){
FirstObj.init();
SecondObj.init();
console.log(FirstObj.data);
})()
现在,我假设 - 基于我在Actionscript中的基础 - 日志会显示Array
,其中第一项是0
,其余的都是1
但是0
似乎没有坚持。
为什么0
值的分配在此处不成功,但如果cell = 0
我直接定位到FirstObj.data[0] = 0
,则效果正常。
我猜这是一个范围问题,我可以解决它,但我正在努力正确理解JS实际上如何处理这些东西,特别是在将代码集中到像这样的对象时(另外,是这是人们普遍看法的好方法吗?)。
感谢您的帮助。
答案 0 :(得分:1)
数组索引返回Javascript中的值,而不是引用。这意味着,data[0]
分配cell
后,对cell
的进一步修改不会影响data[0]
。
分配数组本身会导致您正在寻找的行为:
SecondObj = {
init : function()
{
var cells = FirstObj.data;
cells[0] = 0; // Will also affect data[0].
}
};
答案 1 :(得分:0)
JavaScript中的数字称为primitive value types(包括字符串,布尔值null
和undefined
)。
这意味着,当你这样做时
var cell = FirstObj.data[0];
您正在传递FirstObj.data[0]
中的值,而不是参考它。
你在做什么就像:
var x = 5;
var y = x; // y is now 5
y = 4; // y is 4, x is still 5.
当然,像FirstObj.data[0] = 0
这样的东西应该有效。