Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否';array[array.length-1]=array.pop();屈服于未定义的行为?_Javascript_Arrays_Node.js - Fatal编程技术网

Javascript 是否';array[array.length-1]=array.pop();屈服于未定义的行为?

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

我一直在尝试实现一种方法,该方法将数组和索引作为输入,将给定数组的最后一个元素复制到给定索引处的条目中,然后截断最后一个元素(即将数组缩短1)

以下是我为这项任务提出的建议:

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]//分配后
    在第二种情况下,它应该触发某种内存访问冲突,因为当数组的长度只有4个条目时,会有人试图写入数组中的第5个条目(
    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();