js常用工具函数

常用工具函数

  • 数组判断

    • const isArray = (arg) => {
      	return Array.isArray(arg)
      }
      
    • const isArray = (arg) => {
      	return Object.prototype.toString.call(arg) === '[object Array]'
      }
      
    • const isArray = (arg) => {
      	delete Array.prototype.toString
      	return arg.toString() === '[object Array]'
      }
      
  • 对象判断

    • const isObject = (arg) => {
      	return Object.prototype.toString.call(arg) === '[object Object]'
      }
      
    • const isObject = (arg) => {
      	return typeof arg === 'object' && arg.constructor === Object
      }
      
  • 深拷贝

    • const deepClone = (arg) => {
      	if (isObject(arg)) {
      		let newArg = {}
      		let keys = Object.keys(arg)
      		for (let i = 0; i < keys.length; i++) {
      			let k = keys[i]
      			let v = arg[k]
      			let v1 = deepClone(v)
      			newArg[k] = v1
      		}
      		return newArg
      	} else if (isArray(arg)) {
      		let newArg = []
      		for (let i = 0; i < arg.length; i++) {
      			let v = arg[i]
      			let v1 = deepClone(v)
      			newArg.push(v1)
      		}
      		return newArg
      	} else {
      		return arg
      	}
      }
      
    • const deepClone = (c, p) => {
      	let c = c || {}
      	for (let k in p) {
      		if (typeof p[k] === 'object') {
      			c[k] = p[k].constructor === Array ? [] : {}
      			deepClone(c[k], p[k])
      		} else {
      			c[k] = p[k]
      		}
      	}
      	return c
      }
      
  • 对象删除

    • const removeProperty = (target,propertyToRemove) => {
          const {[propertyToRemove]: _, ...newTarget} = target
          return newTarget
      }
      
      
  • 判断是否相等

    • const equals = (m, n) => {
      	if (isArray(m) && isArray(n)) {
      		if (m.length !== n.length) {
      			return false
      		}
      
      		for (let i = 0; i < m.length; i++) {
      			let mVal = m[i]
      			let nVal = n[i]
      			if (!equals(mVal, nVal)) {
      				return false
      			}
      		}
      		return true
      	} else if (isObject(m) && isObject(n)) {
      		let mkeys = Object.keys(m)
      		let nkeys = Object.keys(n)
      		if (mkeys !== nkeys) {
      			return false
      		}
      		for (let i = 0; i < mkeys.length; i++) {
      			let km = mkeys[i]
      			let kn = nkeys[i]
      			let mVal = m[km]
      			let nVal = n[kn]
      			if (km !== kn) {
      				return false
      			}
      			if (!equals(mVal, nVal)) {
      				return false
      			}
      		}
      		return true
      	} else {
      		return m === n
      	}
      }
      
  • 判断对象和数组可以使用Object的原型方法toString, 对于对象来说 Object.prototype.toString().call(arg) === arg.toString(), 对于数组和函数来说,作为Object的原型都重写了toString方法,可通过delete删除重写的toString,在使用toString方法

  • toString: 每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。

posted @ 2021-11-25 17:38  Mmonologue  阅读(39)  评论(0)    收藏  举报