【问题标题】:Is const array in java script behaves like const array in C in memory allocation and assignment behaviour?java 脚本中的 const 数组在内存分配和分配行为中的行为是否类似于 C 中的 const 数组?
【发布时间】:2020-11-27 22:53:18
【问题描述】:

在 C 中,以下代码在 .rodata 部分分配两个字符串文字。 arr[0]="ABC";.rodata 中分配另一个字符串文字,然后将其地址分配给arr[0]

const char *arr[2]={"1234", "5678"}
arr[0]="ABC";                      
puts(arr[0]); //ABC                

在 javaScript 中,下面的代码 sn-p 的行为是否和前面一样?

const arr=['1234', '5678'];
arr[0]='ABC';
console.log(arr[0]); //ABC

【问题讨论】:

    标签: javascript arrays c memory memory-management


    【解决方案1】:

    在 javaScript 中,下面的代码 sn-p 的行为是否和前面一样?

    是的,粗略地说,但是 C 和 JavaScript 通常非常不同,尽管有一些表面上的语法相似性,并且 const 的其他用途不是 JavaScript 的 const 所做的事情。例如,如果您使用了char * const arr[2]={"1234", "5678"}(它不会让您重新分配arr[0]),那么就无法使用JavaScript 的const 来做到这一点。 (你可以做类似的事情,只是不能用const:const arr = Object.freeze(["1234", "5678"]);

    所有 const 在 JavaScript 中的含义(与 let 相比)¹ 是您无法更改变量 arr 的内容。您可以更改 arr 引用的数组的状态,但不能让 arr 引用不同的数组(或完全是其他数组)。

    也就是说,你可以做你在问题中显示的内容:

    const arr=['1234', '5678'];
    arr[0]='ABC';
    console.log(arr[0]); //ABC

    ..但你不能这样做:

    const arr=['1234', '5678'];
    arr = ["ABC"]; // TypeError: Assignment to constant variable
    console.log(arr[0]);

    它对内存管理的唯一影响是,如果 const 出现的作用域是长期存在的(如全局作用域或模块作用域),则常量引用的数组在作用域被销毁之前无法释放。使用let,您可以为变量分配其他内容,然后可以对数组进行垃圾收集。通常,您只在长期存在的范围内使用const 来表示您希望“永远”拥有的东西。但是短期作用域中的 const (例如不创建闭包的函数调用)没有这种含义。当作用域消失时,作用域绑定所引用但未被其他任何对象引用的任何对象都将变为可垃圾回收。


    ¹ vs var 这也意味着它具有块范围并参与 TDZ,就像 let 一样。 constlet 除了 const 创建不可变的东西之外是相同的。 varconstlet 不同(在现代 JavaScript 代码中没有位置)。

    【讨论】:

    • @NAND - 抱歉,我误读了你的 C 示例(尽管它非常清晰和简单——我的错!)。我已经修正了开头的段落。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2019-12-20
    • 2011-06-25
    • 2014-12-09
    相关资源
    最近更新 更多