一 .判断原始值 和 引用值
- 判断属性是原始值还是引用值
原始值:String Number function Boolean undefined
引用值:Object Array Null
判断方法 typeOf //引用值 object
二 .判断 对象 和 数组
1. constructor
[].constructor == Array / Object
弊端此方法容易被改写
let arr = [];
arr.constructor = Object
arr.constructor == Array // false
arr.constructor == Object // true
2. instanceof
运算符可以用来判断某个构造函数的prototype属性所指向的對象是否存在于另外一个要检测对象的原型链上。
[] instanceof Array // true
[] instanceof Object // true
{} instanceof Array // false
{} instanceof Object // true
3 Object.prototype.toString.call() 建议
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call({}) //"[object Object]"
Object.prototype.toString.call(null) //"[object Null]"
注意,这里的call改变this的指向是必不可少的,如果缺少
Object.prototype.toString([]) //"[object Object]"
Object.prototype.toString({}) //"[object Object]"
Object.prototype.toString(null) //"[object Object]"
深度克隆
这里只介绍一种方式,更多深度克隆,可见文档深度克隆
function deepClone(origin) {
if(typeof origin !== 'object') return origin
let toString = Object.prototype.toString,
isArr = '[object Array]'
let target = toString.call(origin) == isArr ? []:{}
//遍历orign
for (let prop in origin) {
//判断是否是其私有属性
if (origin.hasOwnProperty(prop)) {
//判断引用值和原始值
if (typeof origin[prop] == 'object') {
//递归复制内部
target[prop] = deepClone(origin[prop])
} else {
target[prop] = origin[prop]
}
}
}
return target
}
console.log(deepClone([1,2,3,4,5,{a:2}]))
```