Javascript 是否';array[array.length-1]=array.pop();屈服于未定义的行为?
我一直在尝试实现一种方法,该方法将数组和索引作为输入,将给定数组的最后一个元素复制到给定索引处的条目中,然后截断最后一个元素(即将数组缩短1) 以下是我为这项任务提出的建议:Javascript 是否';array[array.length-1]=array.pop();屈服于未定义的行为?,javascript,arrays,node.js,Javascript,Arrays,Node.js,我一直在尝试实现一种方法,该方法将数组和索引作为输入,将给定数组的最后一个元素复制到给定索引处的条目中,然后截断最后一个元素(即将数组缩短1) 以下是我为这项任务提出的建议: function swapWithLastAndRemove(array, index) { array[index] = array.pop(); } 然后我测试了这个函数,以确保它在任何给定的索引上都能工作: for (let index = 0; index < 5; index++) { v
function swapWithLastAndRemove(array, index) {
array[index] = array.pop();
}
然后我测试了这个函数,以确保它在任何给定的索引上都能工作:
for (let index = 0; index < 5; index++) {
var array = [0, 1, 2, 3, 4];
swapWithLastAndRemove(array, index);
console.log(array);
}
换句话说,对于最后一个元素,它将其从数组中弹出,然后将其重写到数组中
让我印象深刻的是这句话:
array[index] = array.pop();
这相当于在最后一个元素上执行时的此行:
array[array.length - 1] = array.pop();
不可能导致数组
的内容等于[0,1,2,3,4]
在我看来,这里有两种选择:
array.length-1
之前,执行语句array.pop()
array.length-1
之后,执行语句array.pop()
[0,1,2,3,4]//初始状态
[0,1,2,3]//弹出4后
[0,1,2,4]//分配后
array[4]
)
我知道NodeJS可能会应用一些内存管理方案,以某种方式允许在不出现“数组索引越界”异常的情况下完成此操作,但我仍然不明白为什么它会让此操作“逍遥法外”,而且,为什么结果是这样
行array[array.length-1]=array.pop()
是否可能是未定义的行为
JavaScript中是否存在未定义的行为?最后一个索引结果是
[0,1,2,3,4]
,而不是[0,1,2,3,4]
:
函数swapWithLastAndRemove(数组,索引){
array[index]=array.pop();
}
var数组=[0,1,2,3,4];
swapWithLastAndRemove(阵列,5);
console.log(数组)代码>
第二个选项:语句array.pop()
在表达式之后执行
array.length-1将被计算
事实就是这样。JS求值总是从左到右。它计算数组的array.length-1
到索引4
,然后从数组中弹出最后一个元素,然后将该元素分配到索引4
在第二种情况下,它应该触发某种内存访问冲突,因为当数组的长度只有4个条目时,会有人试图写入数组中的第5个条目(array[4]
)
不,JS中没有内存访问冲突。它只是再次创建一个新属性,并相应地更改数组的长度。这与代码发生的情况完全相同
常量数组=[0,1,2,3,4];
常量元素=array.pop();
console.log(JSON.stringify(array));//[0,1,2,3]
数组[4]=元素;
console.log(JSON.stringify(array));//[0,1,2,3,4]
获取最后一个索引需要什么结果?“在第二种情况下,它应该触发某种内存访问冲突,”为什么<代码>arr=[];arr[42]=“你好”
不是问题。JS中的数组是动态的,并不真正对应于大多数其他语言中的数组,但更像JavaNo中的ArrayList,JS wrt求值顺序中没有未定义的行为-它总是从左到右。arrray.length-1
表达式是在array.pop()之前计算的。
callI认为@goodvibration试图在arr[4]赋值,而不是arr[5]
对不起,但是您对swapWithLastAndRemove(array,5)
的调用不是我在代码中所做的,也不是我想做的。Javascript中的索引(以及据我所知的任何其他语言)是基于0的。所以在我的例子中,最后一个元素的索引是4,而不是5。这也是我在上面的编码示例中使用的索引。据我所知,这使得你的整个答案变得无关紧要(虽然部分答案可能是真的,但我不承认我一看到“5”就停止了阅读。)@HarunurRashid:是的,你的评论是正确的。
array[array.length - 1] = array.pop();