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 } }