删除运算符与分配给undefined或null

时间:2018-07-16 08:44:35

标签: node.js v8

foo.v = {
  rolo: 'a',
  cholo: 'b',
  yolo: 'c'
};

我有一个长期的有状态流程,并且为某些类型的请求创建新对象。我的问题是,是否在内存中有像v这样的对象。

就内存重新分配而言,这样做的表现是否更好:

delete foo.v.cholo;

还是有时候更好:

foo.v.cholo = undefined

我读到V8的肠子中,delete运算符使对象发生变异,并防止它们像垃圾一样容易被垃圾收集。参见:

https://github.com/google/google-api-nodejs-client/issues/375

我也考虑使用Map而不是对象,我尝试将delete运算符与Map.prototype.delete进行比较,但是delete运算符在此处的性能更高,也许我的测试不是很好:

{
    const obj = {};

    const start = Date.now();

    for(let i =0; i < 1000000; i++){
        obj['foo'] = true;
        delete obj['foo'];
    }

    console.log('done after:', Date.now() - start);

}



{
    const m = new Map();

    const start = Date.now();

    for(let i =0; i < 1000000; i++){
        m.set('foo',true);
        m.delete('foo');
    }

    console.log('done after:', Date.now() - start);

}

1 个答案:

答案 0 :(得分:1)

V8开发人员在这里。 foo.v.cholo = undefined绝对比delete foo.v.cholo更有效,因为它不会改变对象的形状(=数字,属性和属性的内部位置)。垃圾收集不受影响。使用undefined还是null作为换出值都没关系。

一般经验法则:尽可能避免使用delete

在以下情况下尤其如此:

  • 您拥有一组相同的属性,这些属性有时存在而有时不存在
  • 访问所关注对象的(任何)属性时,您会关心性能

如果,另一方面,您有大量可能出现的属性名称(相对不太可能重新出现),例如在“查询字符串” =>“响应”缓存中,那么最好使用Map而不是普通对象。