为什么javascript“for loop”对不同类型的对象有不同的行为

时间:2017-08-21 09:50:33

标签: javascript pointers scope closures var

我意识到JavaScript没有指针,但是当循环遍历包含对象的数组时,我注意到了这种“指针”行为,但是当数组包含数字时(例如),没有类似的行为。

var ARR_num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for (var i = 0, len = ARR_num.length; i < len; i++) {
  var item = ARR_num[i];
  item++;
}
console.log(ARR_num);
//Outputs [0,1,2,3,4,5,6,7,8,9]

现在有一个带对象的数组

var ARR_obj = [{}, {}, {}];
for (var i = 0, len = ARR_obj.length; i < len; i++) {
  var item = ARR_obj[i];
  item.pointer = true;
}
console.log(ARR_obj);
//Outputs [{pointer: true}, {pointer: true}, {pointer: true}]

为什么这两种不同的行为?

4 个答案:

答案 0 :(得分:1)

为什么会出现这两种截然不同的行为?

当您将对象分配给另一个变量时,新变量指向相同的对象,因此当您更改新的变量属性时,对象会发生变异 例如:

var a= {name: "some"};
var b = a;
b.name = "newName";
console.log(a.name);// "newName"

当您将基元类型分配给另一个变量时,它只是一个新变量并且没有引用旧变量,因此更改新变量不会影响旧变量。 例如:

var a = "some";
var b = a;
b = "newName";
console.log(a);//"some"
希望这会有所帮助!!

答案 1 :(得分:0)

  

为什么这两种不同的行为?

因为您有两个不同的操作。在后者中,你正在改变对象的状态

item.pointer = true;

item一直指向同一个对象。只更改对象的内部。

但是这里

item++; # equivalent to item = item + 1

重新分配项。它将指向操作后的另一个整数。如果在对象循环中执行类似的操作

item = { pointer: true }

然后您的原始数组元素不会受到影响,您将不会观察到任何“指针语义”。

是的,它也与整数是原始/立即值有关。

答案 2 :(得分:0)

{}是对象文字语法,它创建(在您的情况下)数组中的新对象。当循环遍历它并使用ARR_obj [i]时,您将获得引用的对象,然后对其进行操作。

或者将其用于其他(更一般)的话:

Primitives(undefined,null,boolean,string和number)按值传递,而Objects则通过引用传递(或者通过引用的副本传递)。

答案 3 :(得分:0)

众所周知,所有值(不是基元)都是对象指针。 因此item是用例2中的对象指针,其中在用例1中是整数。

在用例2中,它指的是值&#34; true&#34;对于所有迭代。所以根据代码写出它给出的结果。

一般来说,JavaScript不支持通过引用传递参数,因此在Javascript中使用Objects,我们可以传递引用。

相关问题