删除属性与创建新对象

Tik*_*kes 3 javascript performance

所以我有一个如下对象:

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

此数组由服务调用填充,然后循环以合并输出,然后将此结果发送回前端.

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;
};
Run Code Online (Sandbox Code Playgroud)

现在,我是第一次使用delete,以摆脱unmatchedLines来自data对象,这样,在创造一个全新的对象,并推动这一到输出我可以做的代替:

 delete data[i].unmatchedLines;
 outPutObject.responses.push(data[i]);
Run Code Online (Sandbox Code Playgroud)

但后来我读到delete这篇文章非常缓慢,偶然发现一篇文章说要把这个用来undefined代替使用delete会更快.

我的问题:

到底有什么好用的?delete,设置undefined或创建一个新的对象,就像我现在正在做的那样?

T.J*_*der 8

两者都不"更好".

确实,当你delete来自一个对象的属性时,在许多现代引擎上将对象放入一个较慢的"字典模式",而不是从你没有删除它的属性,这意味着该对象的后续属性查找(data[i]在你的情况下)将比他们之前更慢delete.因此,在对象的属性访问速度很重要的极少数情况下,将属性设置为undefined(这不是完全相同的)可能是适当的.

  • @ ste2425:对象的生命周期.现代JavaScript引擎将对象转换为运行时生成的类的实例,在添加属性时生成子类;*删除*属性是不寻常的,并改变了对象的性质. (3认同)
  • 只是出于兴趣,这种"字典"模式只是暂时的,直到GC运行或者它是对象生命周期的永久性事物? (2认同)
  • @CeylanMumunKocabaş:不.你可以使用你想要的值,但是`null`并不比`undefined`好.`undefined`比`null`有一点优势,因为读取属性的结果是相同的(`undefined`),就像你根本没有属性一样,但同样,你可以使用你想要的任何值. (2认同)