首先,在 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
字符串的初始化要求缓冲区适合“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