《编写高质量代码--改善JavaScript程序的188个建议》学习记录(三)

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回收程序回收
    


转载于:https://my.oschina.net/sunshinewyf/blog/618880

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值