なに? 文字列が汚れていませんか?
はい、できます。//.....-
console.log(typeof str); // string
console.log(str.length); // 15
console.log(str); // ""
, 30 ?
! 30 !
. — «- ». , - - , . , , . , , , .
,
. . V8, , , . Google Chrome -, Node.js. , .
UPD4: Firefox , ,
.
, , , AJAX JavaScript, , - :
var news = [];
function checkNews() {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/WarAndPeace', true); //
xhr.onload = function() {
if (this.status != 200) return;
//
var m = this.response.match(/<div class="news">(.*?)<.div>/);
if (!m) return;
var feed = m[1]; //
if (!news.find(e=>e==feed)) { //
news.push(feed);
document.getElementById('allnews').innerHTML += '<br>' + feed;
}
};
xhr.send();
}
setInterval(checkNews, 55000);
, , , . , . 200-300 — , , , . , 2 ! , Chrome .
- . - ! … ! ? ! . , , .
! — , . , JS, . — .
Retainers.
sliced string?
, , ! ??
- , , , . . , , - ,
.
:
- -> ->, «», .
:
function MemoryLeak() {
let huge = "x".repeat(15).repeat(1024).repeat(1024); // 15
let small = huge.substr(0,25); //
return small;
}
var arr = [];
var t = setInterval(e=>{ // 25 15 ?
let str = MemoryLeak();
//str = clearString(str);
console.log(' :',str.length + ' ');
arr.push(str);
console.log(' :',JSON.stringify(arr).length+' ');
},1000);
//clearInterval(t);
25 . ? , . , GC ( ) , . . , , — .
1.5 , . GC , , . , .
«» . GC , .
, , , :
str = str - 0;
— . , , , :
obj[str] = 123;
str = null; //
. , , . , . :
function clearString(str) {
return str.split('').join('');
}
, , .
// , .
let m = big_data.match(/\sMY_OPTIONS_(\w+) = (\w+)\s/);
if (m) obj[m[1]] = clearString(m[2]); //- .
. , , V8 , 13 . , , . Firefox
12. :
function clearString(str) {
return str.length < 12 ? str : str.split('').join('');
}
, 13 V8, 12-24 Firefox, .
? ?!
, . . . , .
, , . ?
. , , , , replace(), trim() .. , - /, .
nickname = clearString(nickname); //- .
long_live_obj.name = nickname; // , .
. .
let cleared = clearString(xhr.response); //
function clearString(str) {
return str.split('').join('');
}
function clearString2(str) {
return JSON.parse(JSON.stringify(str));
}
function clearString3(str) {
// ' ' + str
//
return (' ' + str).slice(1);
}
function Test(test_arr,fn) {
let check1 = performance.now();
let a = []; // .
for(let i=0;i<1000000;i++){
a.push(fn(test_arr[i]));
}
let check2 = performance.now();
return check2-check1 || a.length;
}
var huge = "x".repeat(15).repeat(1024).repeat(1024); // 15Mb string
var test_arr = [];
for(let i=0;i<1000000;i++) {
test_arr.push(huge.substr(i,25)); // .
}
console.log(Test(test_arr,clearString));
console.log(Test(test_arr,clearString2));
console.log(Test(test_arr,clearString3));
Chrome 73console.log(Test(test_arr,clearString)); //700
console.log(Test(test_arr,clearString2)); //300
console.log(Test(test_arr,clearString3)); //280
UPD:
Opera Firefox @WanSpi//Opera
console.log(Test(test_arr,clearString)); // 868.5000000987202
console.log(Test(test_arr,stringCopy)); // 493.80000005476177
console.log(Test(test_arr,clearString2)); // 435.4999999050051
console.log(Test(test_arr,clearString3)); // 282.60000003501773
//Firefox ( , )
console.log(Test(test_arr,clearString)); // 210
console.log(Test(test_arr,stringCopy)); // 2077
console.log(Test(test_arr,clearString2)); // 632
console.log(Test(test_arr,clearString3)); // 185
UPD2:
Node.js @V1tolfunction clearString4(str) {
// Buffer Node.js
//- 'utf-8'
return Buffer.from(str).toString();
}
:
//763.9701189994812 //clearString
//567.9718199996278 //clearString2
//218.58974299952388 //clearString3
//704.1628979993984 // Buffer.from
UPD3
:function clearStringFast(str) {
return str.length < 12 ? str : (' ' + str).slice(1);
}
. 15 , 2 . 150 , 1500 , . .
:
jsperf.com/sliced-string