判断原始值和引用值 及深度克隆

一 .判断原始值 和 引用值

  1. 判断属性是原始值还是引用值
    原始值: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}]))
 
```

发布了45 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/cmchenmei/article/details/86995847