4

我只是在阅读David Flanagan的 JavaScript:权威指南。我真的很喜欢,我很高兴我的第一本 Javascript 书就是这本。:)

但是,我无法理解这一段(3.7 Immutable Primitive Values and Mutable Object References):

undefinedJavaScript 中的原始值( 、 null、布尔值、数字和字符串)和对象(包括数组和函数)之间存在根本区别。原语是不可变的:没有办法改变(或“变异”)原语值。这对于数字和布尔值是显而易见的——<strong>改变数字的值甚至没有意义。然而,对于字符串来说,它并不那么明显。由于字符串类似于字符数组,因此您可能希望能够更改任何指定索引处的字符。

可能由于我缺乏CS背景(自学和所有......),我只是错过了一些东西,但是有人可以帮我解释一下吗?

特别是我强调的部分:为什么改变数字的值没有意义?


到目前为止我的想法:

  • 也许他正在严格区分(在其他语言中可以称为)“变量”和“值”的概念。那么好吧,将 3 的值更改为 4 的值确实没有意义(这样3 == 4),但是下一句这样的解释失败了:这样的操作对字符串比对数字更有意义......?
4

4 回答 4

6

你说得对,改变字符串文字的是没有意义的——这就是他实际上所说的;他只是说这可能不像这种情况那么明显3 == 4,因为您可以引用字符串中的单个字符(然后可能会认为您可以通过更改特定字符来更改字符串)。

考虑这个例子:

var s = 'hello world';
s[0] = 'H';

直观上看,这似乎是将单词大写,但字符串是不可变的,因此不起作用

检查s我们仍然看到的输出:s > 'hello world'

于 2012-08-07T18:33:53.180 回答
2

这正是你如何诠释它。例如,更改 3 的值是没有意义的3 == 4

就字符串而言,在某些语言(如 C)中可以看到其值的可变性,但在其他语言(如 Java)中则不然。因此,它们是不可变的并不一定那么明显。这两种选择都有支持和反对的论据。

于 2012-08-07T18:31:30.763 回答
1

基本上,你对区别的把握比作者强,或者至少比作者给你的功劳要强。您的“到目前为止的想法”是完全正确的,但他认为许多新用户也希望能够更改字符串原语。你没有,这意味着你的期望与语言的实际行为方式相匹配,而不是与他认为你会期望的事情相匹配。

于 2012-08-07T18:31:07.233 回答
1

字符串在 JavaScript 中是不可变的。他说字符串“不太清楚”,因为它对许多人来说没有多大意义(也许它对你有用,很明显)。我能提供的最佳解释是您定义字符串:“Bob”。您可以将整个东西重命名为“Cob”,但您不能将“B”物理更改为“C”,因为在内部,“B”只是一个数字(字符表示)。所以你基本上是在做“B”=“C”。或 SomeNumber = AnotherNumber。

于 2012-08-07T18:32:22.743 回答