var str = "hello ";
str = str + "world";
上述方法的內存過程:
1、為a分配棧內存
2、創建堆內存存入字符串"hello",並將堆地址賦值到a的棧內。
3、創建堆內存存入字符串"world"。
4、創建存儲結果的堆內存。
5、把str的值復制到結果中。
6、把"world"復制到結果中。
7、更新str的值,使它指向結果。
每次完成字符串連接都會執行步驟 3 到 6,使得這種操作非常消耗資源。
如果重復這一過程幾百次,甚至幾千次,就會造成性能問題。
解決方法是
用 Array 對象存儲字符串,然后用 join() 方法生成結果
var arr = new Array();
arr[0] = "hello ";
arr[1] = "world";
var str = arr.join("");
//性能更優
var buffer = new StringBuffer ();
buffer.append("hello ");
buffer.append("world");
var result = buffer.toString();
注:字符串數據被存儲到堆,然后把字符串的引用地址存儲在字符串變量中。同時為了避免錯誤操作,js解釋器強制約定字符串在堆存儲的數據是不可變的。相當於設置字符串在堆區存儲的數據是只讀的。