为什么不使用Object.prototype.toString()检查Redux中的普通对象?

时间:2018-07-30 09:35:08

标签: javascript reactjs redux

我是一个JavaScript初学者。当我阅读redux源代码时,utils/isPlainObject.js的代码段如下:

export default function isPlainObject(obj) {
  if (typeof obj !== 'object' || obj === null) return false
  let proto = obj
  while (Object.getPrototypeOf(proto) !== null) {
    proto = Object.getPrototypeOf(proto)
  }
  return Object.getPrototypeOf(obj) === proto
}

我认为,我可能会使用更简单的代码来实现它:

function isPlainObject(obj) {
  return Object.prototype.toString.call(obj, null) === '[object Object]'
}

那么,为什么不使用redux实现呢?

1 个答案:

答案 0 :(得分:3)

typeof obj !== 'object' || obj === null等之所以使用检查,是因为这是检查对象是否纯净的最简单方法,该空间不会留有错误行为的空间。

除了Object.prototype.toString可以被覆盖并因此影响依赖于它的代码这一事实之外,它的问题在于它不检查对象是否简单:

Object.prototype.toString.call(new class Foo {}, null) === '[object Object]'