【问题标题】:String concaternation in javascriptjavascript中的字符串连接
【发布时间】:2020-12-05 13:00:54
【问题描述】:

我尝试构建一个 JSON 对象,该对象最终将保存到一个文件中。但是我发现如果我使用接近一个“元素+=元素”,它会抛出“无效的字符串长度”字符串。但是对于方法 2,我可以连接一个很长的字符串并保存一个文件。 (该文件大约为 50mb)。所以我想知道我的第一种方法有什么问题?

const person = {
    id: 1,
    name: "john"
}
personJson = JSON.stringify(person);
personJson = personJson + ',';

let element = personJson;
for (let index = 0; index < 500; index++) {
     element += element; 
}
let element = personJson;
for (let index = 0; index < 100000; index++) {
     element = element + personJson; 
}

【问题讨论】:

  • 没有 JSON 对象这样的东西。 JSON 始终是一个字符串。不要尝试自己编码 JSON。 JSON.stringify([ person1, person2, person3 ]) 可以正常工作
  • 不是对象或数组是js中的引用类型,所以它使用堆内存。如果我将 100000 个对象添加到数组中,那么反序列化为 JSON 会增加显着的内存使用量吗?或者,我序列化一个对象并将其连接 1000 次(cos 字符串在 js 中是 premetiive 类型,使用更少的内存)并保存到一个使用更少内存的文件?

标签: javascript string concatenation string-concatenation


【解决方案1】:

在这两种方法中,您都会产生不同的结果,即 假设personJson包含字符串"ab"

  1. element = element + element; 正在产生结果

    "ab" + "ab"
    
    "abab" + "abab"
    
    "abababab" + "abababab"
    

等等…… 这就是字符串长度呈指数增长的原因。

  1. element = element + personJson;

    "ab" + "ab"
    
    "abab" + "ab"
    
    "abababab" + "ab"
    

等等…… 这使您的字符串长度线性增长。

为了更好地理解,运行下面的代码并查看结果:

const person = {
    id: 1,
    name: "john"
}
personJson = JSON.stringify(person);
personJson = personJson + ',';

let element = personJson;
for (let index = 0; index < 500; index++) {
     element += element;
     console.log(element.length); 
}

【讨论】:

    【解决方案2】:

    正如评论中指出的,这可能不是编码 JSON 的最佳方式。

    关于它发生的原因,这是因为你的第一个循环实际上每次迭代都将大小乘以 2,所以它呈指数增长。它很快就达到了远高于你的第二个循环的大小,最后超过了javascript engine 允许的字符串的最大大小。

    index = 0 ; length = 23
    index = 1 ; length = 46
    index = 2 ; length = 92
    ...
    index = 24 ; length = 385875968
    index = 25 ; length = 771751936
    

    【讨论】:

      【解决方案3】:

      您可以创建一个对象数组,只要您想添加到数组中。喜欢:

      const persons= [] ;
      persons.push({id:1 , name: 'Shayan' });
      persons.push({id:2 , name: 'john' });
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2010-11-25
        • 2014-04-29
        • 2023-03-08
        相关资源
        最近更新 更多