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

一 .判断原始值 和 引用值

  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}]))
 
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值