一、赋值、浅拷贝、深拷贝的区别
- 赋值:拷贝了对象的引用,修改其中一个对象的属性值,另一个对象也会受到影响
- 浅拷贝:对基本数据类型赋值,引用类型将引用地址赋值给对应变量,修改基本数据类型的值互不影响,修改其中一个对象引用数据类型的值,另一个对象也会受到影响
- 深拷贝:对其对象的各个属性进行完全拷贝,修改其中一个对象的值,另一个对象不受影响
基本类型变量栈空间的值就是变量本身的值,引用类型变量栈空间的值是对应堆空间地址。所以直接赋值的话,直接从栈空间访问,所以两个变量的值(堆空间地址)是一样的,本质就是同一片内存。浅拷贝相当于把地址对应的内存空间完全一致的复制了一份,所以里面的引用类型地址也是一样的,深拷贝则是把这一整个地址链上的内存完全的复制了一份。
二、ES参数值传递
ES中规定参数只能按值传递,不能按引用传递。传递复杂数据类型时传递的是引用类型的参数而不是按照引用传递,注意二者存在区别,引用类型的参数在函数内部被重写后,函数执行完毕即被销毁,外部访问不到,而对引用传递变量的修改则会反映到外部的变量上。
三、Array
- Array.from()
ES6新增,用于将类数组结构转换为数组实例,作用如下:
(1)将字符串拆分为单字符数组
(2)将集合和映射转化为一个新数组
(3)对现有数组进行浅复制
(4)将任何可迭代对象转化为数组
(5)将arguments对象转化为数组
(6)将带有必要属性的自定义对象转化为数组 - Array.of()
ES6新增,用于将一组参数转化为数组实例 - 数组空位
ES6重新规范定义了如何处理空位,ES6新增方法普遍将这些空位当作存在的元素,只是值为undefined,而ES6之前的方法会忽略掉这些空位 - splice()
splice()方法是在原有数组上直接做修改,用法如下:
(1)删除:传入开始位置和要删除的元素数量
(2)插入:传入开始位置、0和要插入的元素数量
(3)替换:开始位置、要替换的元素数量和要插入的任意多元素