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

时间:2019-02-11
本文章向大家介绍判断原始值和引用值 及深度克隆,主要包括判断原始值和引用值 及深度克隆使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  1. 判断属性是原始值还是引用值
    原始值:String Number fucntion Boolean undefined
    引用值:Object Array Null
    判断方法 typeOf //引用值 object

  2. 如果是引用值判断是对象还是数组
    判断方法:
    2.1 construct

[].construct == Array / Object  
弊端此方法容易被改写 
     let arr = []; 
     arr.construct = Object  
     arr.construct == Array // false
     arr.construct == Object // true

2.2 instanceOf 运算符可以用来判断某个构造函数的prototype属性所指向的對象是否存在于另外一个要检测对象的原型链上。

 [] instanceOf Array // true
 [] instanceOf Object // true
 {} instanceOf Array // false
 {} instanceOf Object // true


2.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, target) {
    let toString = Object.prototype.toString,
      isArr = '[object Array]'
    //遍历orign
    for (let prop in origin) {
      //判断是否是其私有属性
      if (origin.hasOwnProperty(prop)) {
        //判断引用值和原始值
        if (typeof origin == 'object') {
          //判断是Array or Object
          //--------
          //if (toString.call(prop) == isArr) {
          //  target[prop] = []
         // } else {
          //  target[prop] = {}
         // }
         //-----
         target[prop] = toString.call(prop) == isArr ? []:{}
          //递归复制内部
          deepClone(origin[prop], target[prop])
        } else {
          target[prop] = origin[prop]
        }
      }
    }
  }