如何强制JavaScript深度复制字符串?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何强制JavaScript深度复制字符串?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2278字,纯文字阅读大概需要4分钟。
内容图文
![如何强制JavaScript深度复制字符串?](/upload/InfoBanner/zyjiaocheng/702/414cde0803f84565ad9990699ba88e0e.jpg)
我有一些javascript代码,如下所示:
var myClass = {
ids: {}
myFunc: function(huge_string) {
var id = huge_string.substr(0,2);
ids[id] = true;
}
}
稍后使用一些大字符串(100 MB)调用该函数.我只想保存我在每个字符串中找到的短ID.但是,Google Chrome的子字符串函数(在我的代码中实际为正则表达式)只返回一个“切片字符串”对象,该对象引用原始对象.因此,在对myFunc进行一系列调用后,我的chrome选项卡内存不足,因为临时的huge_string对象无法进行垃圾回收.
如何创建字符串id的副本,以便不维护对huge_string的引用,并且可以对huge_string进行垃圾回收?
解决方法:
JavaScript的ECMAScript实现因浏览器而异,但对于Chrome,许多字符串操作(substr,slice,regex等)只保留对原始字符串的引用,而不是复制字符串.这是Chrome(Bug #2869)中的已知问题.要强制使用该字符串的副本,以下代码可以正常工作:
var string_copy = (' ' + original_string).slice(1);
此代码的工作原理是在字符串的前面附加一个空格.此串联导致Chrome实现中的字符串副本.然后可以引用空格后面的子串.
此解决方案的此问题已在此处重新创建:http://jsfiddle.net/ouvv4kbs/1/
警告:需要很长时间才能加载,打开Chrome调试控制台以查看进度打印输出.
// We would expect this program to use ~1 MB of memory, however taking
// a Heap Snapshot will show that this program uses ~100 MB of memory.
// If the processed data size is increased to ~1 GB, the Chrome tab
// will crash due to running out of memory.
function randomString(length) {
var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var result = '';
for (var i = 0; i < length; i++) {
result +=
alphabet[Math.round(Math.random() * (alphabet.length - 1))];
}
return result;
};
var substrings = [];
var extractSubstring = function(huge_string) {
var substring = huge_string.substr(0, 100 * 1000 /* 100 KB */);
// Uncommenting this line will force a copy of the string and allow
// the unused memory to be garbage collected
// substring = (' ' + substring).slice(1);
substrings.push(substring);
};
// Process 100 MB of data, but only keep 1 MB.
for (var i = 0; i < 10; i++) {
console.log(10 * (i + 1) + 'MB processed');
var huge_string = randomString(10 * 1000 * 1000 /* 10 MB */);
extractSubstring(huge_string);
}
// Do something which will keep a reference to substrings around and
// prevent it from being garbage collected.
setInterval(function() {
var i = Math.round(Math.random() * (substrings.length - 1));
document.body.innerHTML = substrings[i].substr(0, 10);
}, 2000);
内容总结
以上是互联网集市为您收集整理的如何强制JavaScript深度复制字符串?全部内容,希望文章能够帮你解决如何强制JavaScript深度复制字符串?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。