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

Hef*_*ler 5 javascript closures pointers scope 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]
Run Code Online (Sandbox Code Playgroud)

现在有一个带对象的数组

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}]
Run Code Online (Sandbox Code Playgroud)

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

Nem*_*ani 1

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

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

var a= {name: "some"};
var b = a;
b.name = "newName";
console.log(a.name);// "newName"
Run Code Online (Sandbox Code Playgroud)

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

var a = "some";
var b = a;
b = "newName";
console.log(a);//"some"
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助!