以下两段代码之间的区别是什么?
之一。
var arr = [70,80,150,310,260,100,78];
var pointArr=[];
var point={};
for (var i = 0; i < arr.length; i++) {
point.x=i*80;
point.y=(arr[i]/600)*240;
pointArr.push(point);
console.log(point);
console.log(pointArr);
}
两个
var arr = [70,80,150,310,260,100,78];
var pointArr=[];
for (var i = 0; i < arr.length; i++) {
//diff
var point={};
point.x=i*80;
point.y=(arr[i]/600)*240;
pointArr.push(point);
console.log(point);
console.log(pointArr);
}
答案 0 :(得分:0)
对于代码一,point
初始化一次。而对于代码二,它是为每个循环初始化的。
答案 1 :(得分:0)
当你在循环中初始化变量时,它会在每次迭代时初始化(重置)。这意味着您将每次for循环运行时将数据推送到空对象并记录该对象,而不是连续推送到第一个示例中在循环外创建的对象。这有意义吗?
答案 2 :(得分:0)
在JavaScript中通过引用传递对象。而原始类型是按值传递的,而且是不可变的。
因此,在您的第一个代码示例中,变量point
将以指针的形式存储在内存中作为引用。在循环内部,您继续将相同的引用推送到pointArr
。更改x
的{{1}}和y
属性只会更改引用的值。这与循环本身无关。
只需将您的第一个示例更改为以下内容:
point
&#13;
通过查看控制台输出,您可以看出在var arr = [70,80,150,310,260,100,78];
var pointArr=[];
var point={};
for (var i = 0; i < arr.length; i++) {
point.x=i*80;
point.y=(arr[i]/600)*240;
pointArr.push(point);
}
window.setTimeout(function() {
point.x = 'foo';
point.y = 'bar';
console.log(pointArr);
}, 2000)
内有多次出现相同的引用。
通过在循环中重新声明pointArr
,就像在第二个示例中所做的那样,您只需为每个点创建一个新的引用。
您可能需要查看以下链接,以便更详细地解释这一点。
Primitive Types and Reference Types
希望有所帮助。