博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《编写高质量代码--改善JavaScript程序的188个建议》学习记录(三)
阅读量:5895 次
发布时间:2019-06-19

本文共 1090 字,大约阅读时间需要 3 分钟。

hot3.png

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

你可能感兴趣的文章
Spring Cloud 入门教程(二): 服务消费者(rest+ribbon)(Greenwich.RELEASE)
查看>>
iOS开发20:Navigation Bar的简单设置
查看>>
iOS开发24:使用SQLite3存储和读取数据
查看>>
GMF树形布局 2 实现展开/折叠
查看>>
Cocos2dx 2.0x Touch事件
查看>>
php判断是否登录
查看>>
Yii2 Unable to verify your data submission 错误-CSRF
查看>>
angularjs-paste-upload
查看>>
hadoop学习笔记
查看>>
解除 Linux 系统的最大进程数和最大文件打开数限制
查看>>
在 Linux 中删除超大文件的技巧
查看>>
Java类的修饰符判断:java.lang.reflect.Modifier
查看>>
使用优盘或者移动硬盘安装Ubuntu
查看>>
electron-创建一个hello world应用
查看>>
RXjs相关
查看>>
百练2973: Skew binary 数 之 Java 题解
查看>>
SaltStack配置管理
查看>>
linux基础命令 head
查看>>
在模板中将php数组转换成js对象
查看>>
使用java调用FFMPEG进行转码
查看>>