【发布时间】:2018-01-29 08:26:14
【问题描述】:
我意识到 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}]
为什么会有这两种截然不同的行为?
【问题讨论】:
-
因为
item === ARR_obj[i]。item指的是 ARR_obj[i] -
这是因为 javascript 将整数作为值传递,而将对象作为引用传递(实际上是引用的值是精确的)。这意味着当你将它存储在
item中时,对item所做的更改会影响原始对象,但不会影响原始整数 -
for 循环在您的示例中没有不同的行为 - 这是您对数组中的数据所做的不同
-
@Rajesh 虽然我可以理解,但我的问题可能是重复的,指出的问题并没有完全回答 primitives 部分。
标签: javascript pointers scope closures var