文章目录

  • 一、字符串不可变
  • 1、字符串类型不可变性说明
  • 2、字符串不可变的好处
  • 二、字符串不可变 - 示例分析
  • 1、字符串不可变示例分析
  • 2、完整代码示例
  • 3、字符串拼接性能测试 - 拼接 10 次字符串
  • 4、字符串拼接性能测试 - 拼接 10000000 次字符串




String 字符串对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String






一、字符串不可变




1、字符串类型不可变性说明



在 JavaScript 中 , 一个字符串 一旦被创建 , 之后就不能更改该字符串的值 ;

尝试修改一个字符串变量时 , 实际上是在内促中开辟出了一块新的内存空间 , 并在该控件中创建了一个新的字符串 , 赋值给原来的字符串变量 ;

每次修改字符串 , 都需要消耗更多的内存 , 但是从线程安全 , 性能优化 角度出发 , 字符串不可修改获益更大 ;



2、字符串不可变的好处



字符串不可变的好处 :

  • 线程安全 : 多个线程操作 同一个字符串 , 由于字符串不可变 , 不会出现数据竞争或数据不一致的问题 ;
  • 优化性能 : 对字符串进行 拼接 , 截取 , 查找 等操作时 , 由于字符串不可变 , 可以提高字符串相关操作的性能 ;
  • 内存回收 : 字符串不可变 , 一旦修改直接废弃原来的字符串创建新字符串 , 废弃的字符串一旦没有引用指向它们 , 其占用的内存会被直接回收 ;





二、字符串不可变 - 示例分析




1、字符串不可变示例分析



解析下面的代码 :

// 创建字符串
        var str = 'Tom';
        // 输出 : Tom
        console.log(str);

        // 修改字符串变量值
        str = 'Jerry';
        // 输出 : Jerry
        console.log(str2);



创建字符串并赋值给变量 : 声明 str 变量 , 就是在 内存中 , 开辟了一块内存空间 , 内存空间中存放字符串 'Tom' 字面量值 , 将该字符串初始化给 str 变量 , 则 str 变量的引用指向 内存中 'Tom' 字面量值 所在的空间 ;

var str = 'Tom';

【JavaScript】内置对象 - 字符串对象 ② ( 字符串类型不可变性 | 字符串不可变的好处 | 字符串不可变 - 示例分析 )_javascript


此时 , 执行 console.log(str); 代码 , 打印上述字符串变量 str , 打印出 Tom 字符串值 ;


重新为字符串变量赋值 : 再次为 str 字符串变量赋值 , 原来在内存空间中的 'Tom' 字符串保持不变 , 而是在内存空间中重新创建一个新的字符串 'Jerry' , 让 str 变量指向新的 'Jerry' 字符串所在的内存空间 ;

str = 'Jerry';

原来的 'Tom' 字符串 以及 该字符串所占用的内存空间 , 仍然保留 ;

【JavaScript】内置对象 - 字符串对象 ② ( 字符串类型不可变性 | 字符串不可变的好处 | 字符串不可变 - 示例分析 )_字符串_02

每次对字符串进行 赋值 , 拼接 , 切割 操作 , 会在内存中产生大量的新的字符串 , 如果没有来得及进行内存回收 , 可能造成内存泄漏 ;



2、完整代码示例



代码示例 :

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <!-- 设置 meta 视口标签 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JavaScript</title>
    <style></style>
    <script>
        // 创建字符串
        var str = 'Tom';
        // 输出 : Tom
        console.log(str);

        // 修改字符串变量值
        str = 'Jerry';
        // 输出 : Jerry
        console.log(str2);
    </script>
</head>

<body>
</body>

</html>

执行结果 :

【JavaScript】内置对象 - 字符串对象 ② ( 字符串类型不可变性 | 字符串不可变的好处 | 字符串不可变 - 示例分析 )_开发语言_03



3、字符串拼接性能测试 - 拼接 10 次字符串



<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <!-- 设置 meta 视口标签 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JavaScript</title>
    <style></style>
    <script>
        // 创建字符串
        var str = '';

        // 字符串拼接
        for (var i = 0; i < 10; i++) {
            str += i + ' ';
        }

        // 输出 : 
        console.log(str);
    </script>
</head>

<body>
</body>

</html>

执行效果 : 字符串拼接 循环 10 次 , 马上就能刷新出来 ;

【JavaScript】内置对象 - 字符串对象 ② ( 字符串类型不可变性 | 字符串不可变的好处 | 字符串不可变 - 示例分析 )_javascript_04

【JavaScript】内置对象 - 字符串对象 ② ( 字符串类型不可变性 | 字符串不可变的好处 | 字符串不可变 - 示例分析 )_ecmascript_05



4、字符串拼接性能测试 - 拼接 10000000 次字符串



<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <!-- 设置 meta 视口标签 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JavaScript</title>
    <style></style>
    <script>
        // 创建字符串
        var str = '';

        // 字符串拼接
        for (var i = 0; i < 10000000; i++) {
            str += i + ' ';
        }

        // 输出 : 
        console.log(str);
    </script>
</head>

<body>
</body>

</html>

执行效果 : 字符串拼接 循环 10000000 次 , 需要等待一段时间才能刷新出来 ; 大量使用字符串操作 , 会降低网页性能 ;

【JavaScript】内置对象 - 字符串对象 ② ( 字符串类型不可变性 | 字符串不可变的好处 | 字符串不可变 - 示例分析 )_javascript_06

【JavaScript】内置对象 - 字符串对象 ② ( 字符串类型不可变性 | 字符串不可变的好处 | 字符串不可变 - 示例分析 )_ecmascript_07