Skip to content

判断是否属于一个纯对象

javascript
const isPlainObject = (val) => {
  if (kindOf(val) !== 'object') {
    return false;
  }

  const prototype = getPrototypeOf(val);
  return prototype === null || prototype === Object.prototype;
}

先来看一下两个方法,这是在ES6中新增的方法

javascript
Object.getPrototypeOf(xx)  // 读取传入参数的原型对象
Object.setPrototypeOf(xx)  // 写入传入参数的原型对象

这里如果有想对原型和原型链不太熟悉的,可以看一下我前段时间总结的一片文章 :https://juejin.cn/post/7126061672032108551

继续来看一下代码比对

javascript
Object.getPrototypeOf({}) === Object.prototype   // true
Object.getPrototypeOf(new Object()) === Object.prototype // true
Object.getPrototypeOf(Object.create(null))  // null
Object.getPrototypeOf(Object.create(null))  // null

image.png

javascript
Object.getPrototypeOf(123) === Object.prototype // false
// 上面两个说明 空对象的原型 和数值的原型是不同的

Object.getPrototypeOf(123) === Number.prototype // true
Object.getPrototypeOf(Number.prototype) === Object.prototype // true
// 重新再来看数值的原型,以及数值的原型的原型,这里便形成了原型链,也就是有了继承的关系

image.png

从上面的代码和原型关系图可以简单的看出来,通过 { }new Object() 创建的对象,原型为Object.prototype,而通过Object.create(null)的原型竟然为null,就更加的纯粹 Object.create(null) 创建的对象