我意识到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}]
为什么这两种不同的行为?
答案 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,我们可以传递引用。