JavaScript,for (variable in value),每次循环时,会不会重新计算value的值?

我们知道,每次进入循环时,会重新计算variable的值。
那么,会不会重新计算value的值呢?特别当value的值在循环体中被修改时。

var arry=[12,34.56,true,"hello",null,undefined,{}];
var i=0,brry=[];
for (brry[i] in arry){
    arry[i]= arry[i]+brry[i];
    i++;
}
console.log(arry);
console.log(brry);
阅读 1.8k
3 个回答

题主的问题,可以抽象成:

for in 循环中给数组插入新值,会不会陷入死循环?

像下面的代码:

var arr = [0, 1, 2]
var i
for (i in arr) {
  arr.push(4)
  console.log(arr[i])
}

事实证明是不会的,推理一下么,这里的 arrfor (i in arr)时,仅仅给所有的属性拍了个快照,所以上面代码可能等价于:

var arr = [0, 1, 2]
var i
var keys=Object.keys(arr)
for (i in keys) {
  arr.push(4)
  console.log(arr[i])
}

没有查规范是怎么说的,但应该类似,这种问题测试一下就知道了,也没必要查规范,如果想查的话,自己动手查下吧。

另外,for (brry[i] in arry){这种用法我是第二次看到,

虽然我知道是为了同时获得index,key,value

但这个代码可读性我觉得不好,

  • 多了一个全局变量brry,
  • 多了一行i++

遍历数组的属性

for (i in arr) {

完全可以了,即使用来遍历对象。

var obj={x:1,y:2}
var i,keys=Object.keys(obj)
for (i in keys) {
  console.log(i,keys[i],obj[keys[i]])
}

这样也是可以的,或者直接用ES5的数组操作方法也是可以的。

var obj={x:1,y:2}
Object.keys(obj).forEach(function(key,index){
    console.log(key,index,obj[key])
})

没有明白你说的和你代码 有什么关系的?

这个是一定会的。javascript数组类型本质上是一个Object, 不管在哪里更改,都会改变它的值本身。加入你不确定,你可尝试写一个代码验证好了:

for(i in arry) {
  array[i] = 'test'
  console.log(arry)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题