繁体   English   中英

文字和价值观是一回事吗?

[英]Are literals and values the same thing?

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

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

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

文字是价值的表征。 但价值观不是文字。

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

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

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

对象文字: {foo: bar} 这将是完全有效的调用truefalse “布尔文字,”但我不认为我曾经听到有人居然说。


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

我的理解是变量指向值,而同一个变量可以重新赋值给多个值,值本身是不可变的。

“指向”是一个重要的术语,在编程时具有精确的含义,但这在JavaScript中并不常见(因为您没有明确的指针)。

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

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

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

然而:

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

现在xy代表一个可变值,我们可以改变它:

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引擎内部将会这样做)无论它认为哪个更快)。

literal的含义只是一个常量值,例如1true

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

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

你可以看看这篇文章

“简单”的答案是

如果变量的值是基元并且文字表示基元,则可以使用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规范

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM