5

我的理解是变量指向值,虽然同一个变量可以重新分配给多个值,但值本身是不可变的。在学习 JavaScript 时,“文字”的概念似乎经常出现,但我还没有找到一个明确的解释来区分文字。事实上,一位作者将它们等同起来。

您如何将文字与值进行比较?请提供简单的例子。

对于任何感兴趣的人,我发现这个解释非常有帮助。我现在看到的方式,文字总是在评估后产生自己,而值可能更复杂(例如表达式)并且可以评估为不同于自身的东西。

4

4 回答 4

5

好吧,文字是值的表示。但是值不是文字。

例如,数字文字可以是45. 那是一个四个字符,然后是一个五个字符。但是当 JavaScript 解释器看到这个时,它知道把它变成一个数值——一个Number代表浮点数的 JS 0x4046800000000000(根据我在网上找到的一些十进制到 IEEE754 二进制转换器)。

字符串文字是"something like this"(一些用引号括起来的字符)。数组文字是[something, like, this](用方括号括起来的逗号分隔表达式)。

“文字”是句法概念。它们是向 JS 解释器识别值的方法。您可以使用 获得相同的数组new Array(something, like, this),但这不是文字,因为它没有使用文字语法。

对象字面量:{foo: bar}. true调用和“布尔文字”是完全有效的false,但我认为我从未听过任何人真正这么说。


以上是你的问题的答案。下面的一些支持信息可能会使您的学习过程不那么痛苦:

我的理解是变量指向值,虽然同一个变量可以重新分配给多个值,但值本身是不可变的。

“指向”是一个沉重的术语,在您编程时具有精确的含义,但在 JavaScript 中并不经常出现(因为您没有显式指针)。

JavaScript 中有可变值和不可变值。例如,字符串是不可变的。数字也是如此。您不能更改字符串"foo"。如果我说

var x = "foo";
var y = x;

我无法做任何事情来x改变y. 尽管在内部我们知道这不是正在发生的事情,但我们可以假装当我们分配一个不可变类型(如字符串或数字)时,它每次都会复制该值(实际上并非如此,因为那样效率低下,但在语义上它对我们来说看起来是一样的)。

然而:

var x = [1, 2, 3];
var y = x;

现在x和都y代表一个可变值,我们可以改变它:

x.push(4);
console.log(y); // [1, 2, 3, 4]
y.push(5);
console.log(x); // [1, 2, 3, 4, 5] 

两者xy都是同一个数组的名称,无论我们试图改变x还是y,我们实际上都在改变同一个底层数组。你可以说变量xy“指向”同一个数组,或者“持有对”同一个数组的引用,或者其他什么,你基本上是在说同样的事情。

数字和字符串之类的东西是不能改变的,所以我们不必担心这种区别。但是数组和对象是可变的,所以我们这样做。变量是否存储指向数字或字符串的指针或实际存储数字或字符串本身与程序员无关,因为它的行为就像它们存储整个值的副本(但在内部 JS 引擎将执行它认为更快)。

于 2013-08-17T14:00:11.097 回答
2

字面量的含义只是一个常量值,例如1, 或true

变量与文字相反;变量的值可以改变,而文字的值不能。

于 2013-08-17T13:56:39.420 回答
2

您使用文字来表示 JavaScript 中的值。literally这些是您在脚本中提供的固定值,而不是变量。

你可以看看这篇文章

于 2013-08-17T13:57:13.770 回答
0

“简单”的答案是

如果变量的值是原始的并且字面量代表原始的,你可以有variable === literal

var x = 1;
x === 1;             // true

如果变量是非原始的variable !== literal,即使它们是等价的

var x = new Number(1);
x === 1;             // false
x === new Number(1); // false
// or
var a = [1, 2];
a === [1, 2];        // false

但是,如果将非原始变量与非原始变量进行比较,只要它们指向内存中的同一位置,===就会返回;true

var b = a;           // `a` as above
a === b;             // true

有关更多信息===,请查看比较运算符的 MDN 页面和严格相等比较算法的 ES5 规范

于 2013-08-17T14:13:17.363 回答