首先,在 C 中“一个字符串是一个字符数组,最后一个 elem = '\0'”。它们是可变的。
如果您像这样在 C 中声明并初始化一个字符串:
char str[] = "Foo";
您基本上要做的是保留 4 个字节(可能是 8 位字节,如果它伤害了您,请不要介意)。单词 str 用作指向该数组第一个元素的指针。所以,如果你这样做:
str[0] or *(str) = 'G'
然后它将改变该地址处的值而不是创建新数组。您可以通过打印出 str 的地址来验证它。在这两种情况下,它将是相同的。
现在在 JavaScript 字符串是原始类型的情况下。对字符串的所有操作都是按值而不是按引用完成的。所以,这样做会产生真。
var str1 = "foo";
var str2 = "foo";
str1 === str2; => true
string 的初始化要求一个缓冲区以适合“foo”并将名称 str1 绑定到它。使它们不可变的原因是您无法更改该缓冲区。所以,你不能这样做:
str1[0] = 'G'
在非严格模式下,执行此命令不会产生警告或错误,但不会更改 str1。您可以通过以下方式验证
console.log(str1) => "foo"
但如果你这样做:
str1 = "goo"
您实际上在做的是要求一个新的缓冲区来适应“goo”并将标识符 str1 绑定到它。包含“foo”的旧缓冲区没有变化。
那么,“foo”会发生什么?
Java Script 有一个自动垃圾收集器。当它看到一些不再可以被任何标识符引用的内存块时,或者......然后它认为该内存是空闲的。
数字,布尔值也是如此。现在,关于包装对象!每当您尝试像这样访问字符串上的属性时:
str1.length;
JavaScript 做什么它使用 String 类创建一个新对象并调用字符串上的方法。一旦函数调用返回,对象就会被销毁。下面的代码进一步解释了它:
var str = "nature";
str.does = "nurtures"; //defining a new property;
console.log(str.does) => undefined
因为对象已经被销毁了。试试这个!
var str = new String("Nature");
str.does = "nurtures";
console.log(str) => ??
这个 str 真的是一个对象......
结论:在 C 中,在单个作用域中,变量名用作指针。所以,int、float、string 都是可变的。但是在 Java Script 中,原始类型变量名称用作值而不是引用
参考资料:C++ 入门加版,Java Script The Definitive Guide,C by Stephen Kochan