【问题标题】:delete property vs creating new object删除属性与创建新对象
【发布时间】:2016-11-29 19:05:01
【问题描述】:

所以我有一个对象如下:

var data = [
    {
        unmatchedLines: [], //possible big array ~700+ lines per entry
        statusCode: 200,
        title: "title",
        message: "some message",
        details: [],
        objectDetails: []
    },
    {
        //same object here
    }
];

这个数组被服务调用填充,然后循环通过合并输出,然后将这个结果发送回前端。

function convertResultToOneCsvOutput(data) {
    var outPutObject = {
        unmatchedLines: [],
        responses: []
    };
    for(var i = 0; i < data.length; i++) {
        if(data[i].fileData) {
           outPutObject.unmatchedLines = outPutObject.unmatchedLines.concat(data[i].fileData);
        }

        outPutObject.responses.push({
            statusCode: data[i].statusCode,
            title: data[i].title,
            message: data[i].message,
            details: data[i].details,
            objectDetails: data[i].objectDetails,
        })
    }

    return outPutObject;
};

现在我首先使用delete 来从data 对象中删除unmatchedLines,这样我就可以这样做,而不是创建一个全新的对象并将其推送到输出:

 delete data[i].unmatchedLines;
 outPutObject.responses.push(data[i]);

但后来我读到delete 非常慢,并且偶然发现了一篇帖子说将它放到undefined 而不是使用delete 会更快。

我的问题:

到底用什么比较好? delete,设置为 undefined 还是像我现在正在做的那样自己创建一个新对象?

【问题讨论】:

标签: javascript performance


【解决方案1】:

两者都不是“更好”。

确实,当您 delete 对象中的属性时,在许多现代引擎上,将对象置于比您不从中删除该属性时更慢的“字典模式”,这意味着随后对该对象的属性查找(在您的情况下为data[i])将比delete 之前的速度慢。因此,将属性设置为 undefined(这并不完全相同)可能适用于那些非常罕见对象的属性访问速度很重要的情况。

【讨论】:

  • 只是出于兴趣,这种dictionary 模式在 GC 运行之前只是暂时的,还是在对象的生命周期内是永久的?
  • null 不比 undefined 好?
  • 创建新对象并推送它怎么样?这将是同一件事并设置undefined吗?
  • @ste2425:对象的生命周期。现代 JavaScript 引擎将对象转换为运行时生成的类的实例,在您添加属性时生成子类; 删除属性是不寻常的,会改变对象的性质。
  • @CeylanMumunKocabaş:不。你可以使用你想要的值,但null 并不比undefined 好。 undefinednull 有一点优势,因为读取属性的结果与您根本没有该属性时相同 (undefined),但同样,您可以使用任何您想要的值。
【解决方案2】:

这可能是真的,但它确实取决于列表的长度,但是:

这两种技术之间的任何性能差异都将是 在任何典型情况下都非常小。

(more info about delete)

无论如何:如果您真的需要额外的性能,您应该考虑处理克隆和不可变数据集 (more info about immutable performances)

【讨论】:

  • 这是额外的信息,反过来也很有用,我真的很想知道为什么要投反对票...
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 2019-05-16
  • 2017-04-01
  • 2016-08-28
  • 2015-12-28
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多