最近在写项目的过程中遇到了一个拷贝对象数组的问题,在调试的过程中发现了一些有意思的现象,写篇文章记录一下
测试demo
以上代码的调试结果如下
调试结果1
代码调试结果表明:
1.虽然以上三种方法都可以创建一个新的内存地址生成新的对象数组,但这三种方法都是浅拷贝,并不能实现真的深拷贝。
2.new Array与 new Object方法区别在于,new Object方法遇到数组时,会自动进行数组解构,而Array则需要手动增加遍历器。
3.最有意思的一点,new Object与Object.create方法生成的数组,很明显存在差异,我们都知道JS复杂数据类型在被console.log调用时,会先调用其valueOf()方法将其转化为字符串再输出,而数组的valueOf则会将其转化成一个类似于初始格式的字符串,但我们使用Object.create()造出的新数组,打印结果却是Array {}。
经过调试才发现,Object.create()的作用是将传入的参数直接作为新生成对象的原型创造一个对象,因此创造出来的数组其实保存的值都在其原型上。
可以通过以下方法验证:
测试属性
代码调试结果如下:
调试结果
可以看到,新生成的数组对象本身并没有0这个属性,也就是说,在做索引的时候,它调用的是其原型对象的属性。
而通过代码调试,我还发现了另一个有趣的现象,那就是一个对象在调用其valueOf方法的时候被转化成的字符串,会显示其所在的类
ES6提供了修改一个对象的原型对象的方法Object.setPrototypeOf(),我们可以发现,在修改之前原始的数组打印结果是一个数组的形式,而将其原型对象改为Date之后,它就变成了一个普通的js对象,并且打印时还显示出其类。