Js字符串 在字符串的复制和传递过程中,JavaScript解释器都是以引用方式来实现对字符串的操作,将字符串数据 存储到堆区,然后把字符串的引用地址存储在字符串变量中,同时为了避免错误操作,由于JavaScript解释器强制字符串在堆区存储的数据是不可变的,这就相当于设置了字符串在堆区存储的数据为“只读”内容,因此,没有一种JavaScript语法和方法或者属性可以改变字符串的原字符 当进行字符串的复制和传递的过程中,只是在栈区复制和传递字符串的引用地址,这种模拟使用引用的方法进行操作加快了内存的计算速度,不必把所有字符串都读取到栈区进行操作,这样大大节省了大量时间,提高了运行效率。 例如: var a = "javascript"; var b = a; b = b.toUpperCase(); alert(a); alert(b); 在上面的代码中,最终变量a和b的值是不同的,虽然它们都引用同一个字符串,JavaScript对于字符串的复制和传递仅仅是简单的采用引用的方法,操作对象为堆区字符串的地址,也就是复制和传递地址,但是,一旦编辑字符串本身的值时,JavaScript就会把堆区的地址读取到栈区进行独立操作, 操作完毕,要把结果赋值给原变量,JavaScript需要再把字符串数据写回堆区,但是没有覆盖原值所在的区域,而是新开了一个区域进行存储,并把新空间的地址传递给栈区的变量进行存储,也就是说,在堆区新建了一个副本,如果不把结果赋值给变量,就待在栈区等待JavaScript垃圾回收,而原变量的值并没有改变,所以在上面的代码中,修改b的字符串后,还要把结果字符串赋值给变量b。 所以在操作字符串的时候,应该注意下面的一些问题: (1)字符串的复制(赋值),传递仅是对字符串的引用进行操作,而不是对字符串本身的值进行操作 (2)修改字符串的值,不是在堆区原值本身上进行修改,而是通过副本进行修改 (3)修改的字符串副本与原值没有任何联系,如果不把修改的值复制给原值变量,就不会对原值产生影响 (4)当把修改的字符串复制给原值变量时,会重新建立一个新的引用,并把修改值存储到堆区新的位置 (5)修改字符串的值,需要使用值得方法进行操作,而不用修改对字符串的引用 (6)当把修改的字符串复制给原值变量时,会重新建立一个新的引用,并把修改值存储在堆区新的位置 (7)原值引用的区域,如果还被其他变量引用,则继续保留,否则会被JavaScript回收程序回收