值类型 | 引用类型 | |
---|---|---|
基本类型:字符串(string)、数值(number)、布尔值(boolean)、undefined、null 、symbol | 对象(Object)、数组(Array)、函数(Function) | |
占用空间固定,保存在栈中 | 占用空间不固定,保存在堆中 | |
保存与复制 | 值本身 | 指向对象的一个指针 |
检测类型 | toString.call() typeof() |
toString.call() instanceof |
使用new()方法构造出的对象是引用型 |
-“Object.prototype.toString.call()”可以简写为“toString.call()” toString方法将数据由其他的形态转换成string形态(除了null和undefined),所以我们可以利用该特性做类型检测。
Object.prototype.toString.call("hello");//[object String]
- typeof 能判断类型有:number、string、boolean、symbol、undefined、function; object、array、null 的变量都返回 object
- instanceof用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。instanceof 运算符返回一个布尔值,表示对象是否为某个构造函数的实例
arr instanceof Array//true
- Array 为 js 的原生对象,它有一个静态方法:Array.isArray(),能判断参数是否为数组
浅拷贝 深拷贝
首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级,深拷贝后两个对象互不影响。
浅拷贝的方式
- 直接赋值 :B=A , 纯粹的浅拷贝, B的任何变化都会反映在A上。
- ES6:
Object.assign(target,source)
只实现第一层“深拷贝”,深层还是浅拷贝。除第一层外B的变化都会反映在A上。 - lodash: _clone()
深拷贝方式
- lodash: _.cloneDeep()
- 递归:使用递归进行深拷贝时比较灵活,但是代码较为复杂;
function deepCopy(A,B) {
for(item in A){
if(typeof item=="object"){
deepCopy(item,B[item]);
} else { B[item]=A[item]; }
} }
deepCopy(A,B);
B.data.num=5;
console.log(A.data.num); //10,A中属性值并没有改变,说明是深拷贝
- JSON.parse()和JSON.stringify
var B=JSON.parse(JSON.stringify(A));
JSON对象:JSON对象方法实现深拷贝时比较简单,但是当拷贝对象包含方法时,方法无法序列成字符串会被丢失;
网友评论