替换检测空物体的polyfill

时间:2018-12-03 04:17:46

标签: javascript object

我在代码中找到了一些使用它的地方:

Object.keys(o).length === 0

这用于检测空对象-我们能否成功地将其替换为

JSON.stringify(o) === '{}'

这样做会提高性能吗?因为选择1对我来说似乎太过强大了

2 个答案:

答案 0 :(得分:1)

没有性能提升-相反。构造一个可能为空的数组比递归搜索所有键值对并从中构造一个字符串要轻得多。

即使所讨论的对象 是一个空的普通对象,JSON.stringify的速度也要慢一个数量级:

const o = {};
const p0 = performance.now();
for (let i = 0; i < 1e7; i++) {
  Object.keys(o).length === 0
}
const p1 = performance.now();
for (let i = 0; i < 1e7; i++) {
  JSON.stringify(o) === '{}'
}
const p2 = performance.now();

console.log(p1 - p0);
console.log(p2 - p1);

(对我而言,至少在FF上基于Chrome的浏览器上,JSON.stringify的速度仅慢3倍)

使用Object.keys循环,例如,看起来可能比使用for..in构造数组快一些,例如

function isEmpty(o) {
  for (const key in o) {
    return false;
  }
  return true;
}

const o = {};
const p0 = performance.now();
for (let i = 0; i < 1e7; i++) {
  Object.keys(o).length === 0
}
const p1 = performance.now();
for (let i = 0; i < 1e7; i++) {
  for (const key in o) {
    continue;
  }
}
const p2 = performance.now();

console.log(p1 - p0);
console.log(p2 - p1);

在我的机器上,以上for..in在FF上快一个数量级,在Chrome上快大约1/4。

(但请注意,逻辑并不完全相同,因为for..in还会遍历继承的键)

答案 1 :(得分:0)

JSON.stringify(o) === '{}'将对象序列化为字符串,并且其性能始终比Object.keys(o).length === 0高。对于积极的情况,它不会显示太大的差异,但是,请考虑具有多个键及其嵌套值的消极情况,或者仅是包含嵌套对象的单个键。