DAY11 手写js系列(八)

2022/4/6

# DAY11 手写js系列(八)

# 39. Object方法entries

用处:将对象转成键值对数组

使用for in 会进行原型链搜索,要使用hasOwnProperty()方法判断是否是只属于自己的属性和方法。

Object.prototype.my_entries = function (obj) {
  var res = []
  for (var key in obj) {
    obj.hasOwnProperty(key) && res.push([key, obj[key]])
  }
  return res
}

//console.log(Object.my_entries(obj)) //[ [ 'name', 'zs' ], [ 'age', 19 ], [ 'score', 59 ] ]

# 40. Object方法fromEntries

用处:跟entries相反,将键值对数组转成对象

Object.prototype.my_fromEntries = function (arr) {
  var obj = {}
  for (let i = 0; i < arr.length; i++) {
    let k = arr[i][0]
    obj[k] = arr[i][1]
  }
  return obj
}

# 41.Object方法keys

用处:将对象的key转成一个数组合集

Object.prototype.my_keys = function (obj) {
  let keys = []
  for (let k in obj) {
    obj.hasOwnProperty(k) && keys.push(k)
  }
  return keys
}

# 42.Object方法values

用处:将对象的所有值转成数组合集

Object.prototype.my_values = function (obj) {
  let values = []
  for (let k in obj) {
    obj.hasOwnProperty(k) && values.push(obj[k])
  }
  return values
}

# 43.instanceof

用处:A instanceOf B,判断A是否经过B的原型链

function my_instanceof(obj, Fn) {
  if (typeof obj !== 'object' || !obj) return false
  if (obj.__proto__ !== Fn.prototype) {
    return my_instanceof(obj.__proto__, Fn)
  } else {
    return true
  }
}

# 44.Object方法is

Object.is(NaN,NaN) // true

Object.is(-0,+0) // false

Object.is(null,null) // false

Object.prototype.my_is = function (a, b) {
  if (a === b) {
    return a !== 0
  }
  // Na结果应该为true
  return a !== a && b !== b
}

# 45.Object方法Object.assign

  • assign接收多个对象,并将多个对象合成一个对象
  • 这些对象如果有重名属性,以后来的对象属性值为准
  • assign返回一个对象,这个对象 === 第一个对象
Object.prototype.my_assign = function (target, ...args) {
  if (target === null || target === undefined) {
    console.error('Uncaught TypeError: Cannot convert undefined or null to object')
  }
  target = Object(target)
  for (let obj of args) {
    for (let key in obj) {
      obj.hasOwnProperty(key) && (target[key] = obj[key])
    }
  }
  return target
}