JavaScript对ECMAScript的实现可能因浏览器而异,但是对于Chrome,许多字符串操作(substr,slice,regex等)仅保留对原始字符串的引用,而不是复制该字符串。这是Chrome中的一个已知问题(错误#2869)。要强制复制字符串,可以使用以下代码:
var string_copy = (' ' + original_string).slice(1);
该代码通过在字符串的前面附加一个空格来工作。此串联会在Chrome的实现中产生一个字符串副本。然后可以引用空格后的子字符串。
解决方案的问题已在此处重新创建:http : //jsfiddle.net/ouvv4kbs/1/
警告:加载时间很长,请打开Chrome调试控制台以查看进度打印输出。
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 );
substrings.push(substring);
};
for (var i = 0; i < 10; i++) {
console.log(10 * (i + 1) + 'MB processed');
var huge_string = randomString(10 * 1000 * 1000 );
extractSubstring(huge_string);
}
setInterval(function() {
var i = Math.round(Math.random() * (substrings.length - 1));
document.body.innerHTML = substrings[i].substr(0, 10);
}, 2000);
.substr()
,.substring()
,.slice()
,以及相关的正则表达式函数都返回一个新的字符串。调用的其他代码是否myClass.myFunc()
保留了对您的巨大字符串的引用?如果您的实际代码更复杂,是否会意外地将大字符串保留在闭包中?