00 vue源码里面常见方法

 

toRawType 获取数据的原始类型

 function toRawType(value) {
    return Object.prototype.toString.call(value).slice(8, -1)
  }
  toRawType(1) //Number
  toRawType(true) //Boolean
  toRawType('abc') //String
  toRawType(undefined) //Undefined
  toRawType(null) //Null
  toRawType(() => { }) //Function
  toRawType({ name: 'zs' }) //Object
  toRawType([1, 2, 3]) //Array
  toRawType(Math) //Math
  toRawType(new Date()) //Date
    toRawType(new Promise((resolve, reject) => { })) //Promise 
    function fn() {console.log(toRawType(arguments))} fn() //Arguments
 

 判断是否是Promise对象

function isPromise(val) {
    return isDef(val) && typeof val.then === 'function' && typeof val.catch === 'function'
    // 或者
    // return Object.prototype.toString.call(val).slice(8, -1) === 'Promise'
  }
   isPromise(new Promise((resolve, reject) => { })) //true
   isPromise(Promise.resolve(1)) //true
   isPromise(Promise.reject(2)) //true

 

从数组里面删除item

 const arr = ['a', 'b', 'c', 'd', 'e']
  // Remove an item from an array. 从数组里面删除值
  function remove(arr, item) {
    const index = arr.indexOf(item) //找不到就是-1
    if (index !== -1) return arr.splice(index, 1)
  }
  remove(arr,'b')

 

缓存函数cached

//创建缓存函数cached
  function cached(fn) {
    const cache = Object.create(null); //创建一个空对象cache cache.__proto=null 节约内存
    return function (str) {
      return cache[str] || (cache[str] = fn(str)) //这行代码等价于下面2行代码 
      // cache[str] = cache[str] || fn(str)
      // return cache[str]

    }

  }
  //缓存函数的应用1
  var capitalize = cached(function (str) { //将来再传入相同的字符串,就直接返回不用计算 
    return str.charAt(0).toUpperCase() + str.slice(1)
  });
  //缓存函数应用2
  var camelizeRE = /-(\w)/g;
  var camelize = cached(function (str) {
    return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
  });

 

toArray  支持截取索引

 function toArray(list, start = 0) {
    const r = []
    for (let i = 0; i < list.length - start; i++) {
      r[i] = list[start + i]
    }
    return r
  }

 

 looseEqual 值一样就返回true

 function isObject(val) {
    return typeof val === 'object' && val !== null
  }
  function looseEqual(a, b) {
    if (a === b) { return true }
    var isObjectA = isObject(a);
    var isObjectB = isObject(b);
    if (isObjectA && isObjectB) {
      try {
        var isArrayA = Array.isArray(a);
        var isArrayB = Array.isArray(b);
        if (isArrayA && isArrayB) { //都是数组
          return a.length === b.length && a.every(function (e, i) {
            return looseEqual(e, b[i])
          })
          // 如果是日期类型
        } else if (a instanceof Date && b instanceof Date) {
          return a.getTime() === b.getTime()
        } else if (!isArrayA && !isArrayB) {
          var keysA = Object.keys(a);
          var keysB = Object.keys(b);
          return keysA.length === keysB.length && keysA.every(function (key) {
            return looseEqual(a[key], b[key])
          })
        } else {
          /* istanbul ignore next */
          return false
        }
      } catch (e) {
        /* istanbul ignore next */
        return false
      }
    } else if (!isObjectA && !isObjectB) { //都不是对象
      return String(a) === String(b) //转为字符串比较
    } else {
      return false
    }
  }
 

 

posted on 2020-12-18 14:41  章画  阅读(143)  评论(0编辑  收藏  举报

导航