关于JS中的Object.create()与new Object()的区别

最近在写项目的过程中遇到了一个拷贝对象数组的问题,在调试的过程中发现了一些有意思的现象,写篇文章记录一下

测试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对象,并且打印时还显示出其类。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。