首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在数组内移位数组会影响复制的(不是通过引用)数组,而移位整个初始数组不会?(Javascript)

在JavaScript中,数组是引用类型的数据结构。当我们将一个数组赋值给另一个变量时,实际上是将数组的引用地址赋给了新的变量,而不是将数组的值复制一份给新的变量。

当我们对原始数组进行移位操作时,例如使用shift()方法移除数组的第一个元素,这会导致原始数组的长度减少,并且所有元素的索引都会减少1。由于新的数组变量仍然引用原始数组,因此在移位操作后,新的数组变量也会反映出这些变化。

然而,当我们将整个初始数组赋值给新的变量时,实际上是将原始数组的引用地址赋给了新的变量。这意味着新的变量和原始数组引用的是同一个数组对象。因此,无论我们对原始数组进行何种操作,新的变量都会反映出这些变化。

下面是一个示例代码来说明这个问题:

代码语言:txt
复制
// 初始化数组
var originalArray = [1, 2, 3, 4, 5];

// 将数组赋值给新的变量
var newArray = originalArray;

// 移除原始数组的第一个元素
originalArray.shift();

console.log(originalArray); // 输出: [2, 3, 4, 5]
console.log(newArray); // 输出: [2, 3, 4, 5]

在上面的示例中,当我们移除原始数组的第一个元素后,原始数组和新的数组变量都反映出了这个变化。这是因为它们引用的是同一个数组对象。

如果我们将整个初始数组赋值给新的变量,例如var newArray = originalArray;,无论我们对原始数组进行何种操作,新的变量都会反映出这些变化。例如,如果我们移除原始数组的第一个元素,新的变量也会受到影响。

总结起来,当我们对原始数组进行移位操作时,会改变原始数组的长度和元素的索引,因此通过引用的新数组变量也会反映出这些变化。而当我们将整个初始数组赋值给新的变量时,它们引用的是同一个数组对象,因此无论对原始数组进行何种操作,新的变量都会反映出这些变化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

这些Java 代码必须要说一说优化细节!

10、当复制大量数据时,使用System.arraycopy命令 11、乘法和除法使用移位操作 例如: ?...12、循环内不要不断创建对象引用 例如: ? 这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,建议为改为: ?...16、尽量在合适的场合使用单例 使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: (1)控制资源的使用,通过线程同步来控制资源的并发访问...的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的,如: ?...19、实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历 这是JDK推荐给用户的。

62530

Java高级开发必会的50个性能优化的细节(珍藏版)

在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。 例如: Java代码 ?...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 ● 24....● 二、为'Vectors' 和 'Hashtables'定义初始大小 JVM为Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。...不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。 ● 四、使用'System.arraycopy ()'代替通过来循环复制数组 例子: ? 更正: ?

58640
  • Java编程性能优化一些事儿

    在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再 丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。 例如: Java代码 ?...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多 24....二、为’Vectors’ 和 ‘Hashtables’定义初始大小 JVM为Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。...四、使用’System.arraycopy ()’代替通过来循环复制数组,例子: ? 更正: ?

    65300

    Java高级开发必会的50个性能优化的细节(珍藏版)

    在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。 例如: Java代码 ?...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 ● 24....● 二、为'Vectors' 和 'Hashtables'定义初始大小 JVM为Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。...不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。 ● 四、使用'System.arraycopy ()'代替通过来循环复制数组 例子: ? 更正: ?

    1.3K30

    必会的 55 个 Java 性能优化细节!一网打尽!

    在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...19、尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为 null。 例如: Java 代码 ?...23、尽量使用 System.arraycopy () 代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。...50、为 'Vectors' 和 'Hashtables' 定义初始大小 JVM 为 Vector 扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。...不管程序执行的结果如何,finally 块总是会执行的,以确保资源的正确关闭。 52、使用 'System.arraycopy ()' 代替通过来循环复制数组 例子: ? 更正: ?

    2.9K10

    Java开发50条编码习惯,让你的代码不在慢慢吐吐

    尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。 例如: ?...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 23....这里有个注意,给成员变量设置初始值但需要调用其他方法的时候,最好放在一个方法。比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常。如: ? 28....二、为Vectors 和 Hashtables定义初始大小 JVM为Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。...四、使用'System.arraycopy ()'代替通过来循环复制数组 例子: ?

    94910

    30个精简代码的小技巧

    4.及时关闭流 java编程过程中,进行的数据库连接,I/O流等操作时务必当心,在使用完毕后,应及时关闭流以释放资源。因为这些大对象的操作会造成系统大的开销,会大大影响程序运行效率。...比如,一个字符数组大概要放5000个字符而不指定长度,最接近5000的2次幂是4096,那么: (1) 在4096的基础上,在申请8194+2个大小的新数组,加起来相当于共申请了12292的内存空间,如果一开始就指定长度...(2) 把原来的4096个字符拷贝到新的字符数组中,这样不仅浪费内存又降低代码运行效率。 所以,给底层以数组实现的集合、工具类设置一个合理的初始值是不会有错的。...16.尽量在何时的场合使用单例 使用单例可以减轻加载的负担,缩短加载时的时间,提高加载的效率,但并不是所有的地方都适用于单例,简单说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问...)方法 本意是想打印数组里的内容,却可能因为数组引用对象为空而导致空指针异常。

    65821

    你不知道的,Java代码性能优化的 40+ 细节,赶快收藏!

    在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问;...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。...从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。...比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,如:public int state = this.getState()。

    48700

    详解九章算法的作者是谁_arrayset

    具体实现过程是在if代码块中,整体的目标是使得输入数字的二进制最高位及以后全为一,之后加1。结果必然只有最高位为1,其余全为0. 那么为什么恰好5次移位即可完成的,我用递归来辅助大家理解。...因此,可以用递归来表达整个的移位过程,默认不考虑0,输入n为移动次数,结果是不考虑位宽限制下的最高位移动n次后的1的总数量。 当输入n为0时,不移动,最高位1不动,总共1个1。...通过式子可以发现,当n = 5时,可以使得从最高位1开始的32位全为1.而int只有32位,也就是说可以使得从最高位开始所有的位都为1....另外的点是为什么使用head,而不是tail,用head-1这个操作。 这需要讲到ArrayDeque的架构。它有两个描述数组的变量,head和tail。...而ArrayDeque又不允许输入为null,这样数组内为null的槽为空槽,不为null的槽即为在使用的槽 pollLast public E pollLast() { int t =

    32520

    Java性能优化的50个细节,我必须分享给你!

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 24....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。 招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    38620

    Java性能优化的50个细节(典藏版)

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 ● 24....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    42220

    Java 性能优化的 45 个细节

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 23....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    34920

    Java 50个细节,可以提高程序性能

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例 简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 24....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    33020

    Java高级开发必会的50个性能优化的细节(珍藏版)

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 ● 24....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    46250

    Java 性能优化的 50 个细节(珍藏版)

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例 简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 24....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    94201

    Java性能优化的48条+七个案例

    在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...如: StringBuffer buffer = new StringBuffer(1000); 尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。...从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。...比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,如: public int state = this.getState()。

    33110

    必会的55个Java性能优化细节!一网打尽!

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 24....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    34600

    Java性能优化的45个细节(珍藏版)

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 24....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    52150

    代码优化那些事

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再 丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多 24....这里有个注意,给成员变量设置初始值但需要调用其他方法的时候,最好放在一个方法比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,如:public int state =

    39830

    Java性能优化的50个细节

    尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问...在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。...尽量早释放无用对象的引用 大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。...尽量使用System.arraycopy ()代替通过来循环复制数组 System.arraycopy() 要比通过循环来复制数组快的多。 24....从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。 招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。

    33140
    领券