我的理解是变量指向值,虽然可以将同一个变量重新分配给多个值,但值本身是不可变的。在学习JavaScript时,“文字”的概念似乎经常出现,但我没有找到明确的解释来区分文字和值。事实上,一位作者将他们等同起来。
您如何将文字与价值进行比较?请提供简单的例子。
对于任何有兴趣的人,我发现this explanation非常有帮助。我现在看到它的方式,文字总是在评估后产生,而值可能更复杂(例如表达式),并且可以评估为不同于自己的东西。
答案 0 :(得分: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]
x
和y
都是同一个数组的名称,无论我们是尝试更改x
还是y
,我们实际上都在更改相同的基础阵列。你可以说变量x
和y
“指向”相同的数组,或者“保持对”相同数组的引用,或者其他什么,你基本上都在说同样的事情。
数字和字符串之类的东西无法改变,所以我们不必担心这种区别。但是数组和对象是可变的,所以我们这样做。变量是否存储指向数字或字符串的指针,或者实际存储数字或字符串本身与程序员无关,因为它表现得就像存储整个值的副本一样(但JS引擎内部会这样做)无论它认为哪个更快)。
答案 1 :(得分:2)
文字的含义只是一个常数值,例如1
或true
。
变量与文字相反;变量的值可以改变,而文字则不能。
答案 2 :(得分:2)
您使用文字来表示JavaScript中的值。这些是 您
literally
提供的固定值,而不是变量 脚本。
您可以查看此article。
答案 3 :(得分: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
有关===
的详细信息,请查看comparison operators的MDN页面和The Strict Equality Comparison Algorithm