JavaScript - 从两个文字/变量初始化变量

ngS*_*.py 1 javascript typescript

请考虑以下情况:

案例 1:使用文字和变量初始化变量,我之前从未声明或初始化过这些变量。

var x = 10, i;
Run Code Online (Sandbox Code Playgroud)

当我打印 的值时x,它会打印10。我想知道,这在语法上是如何正确的?这是出乎意料的事情。这是一个错误吗?

案例 2:使用我之前声明或初始化过的变量和文字初始化变量。

var i = 10;
var x = i, 10;
Run Code Online (Sandbox Code Playgroud)

然后,我尝试了上面的方法,认为如果CASE 1可以工作,那么上面的方法也应该有效。但是,我很惊讶,它没有用。相反,它给出了一个错误:Uncaught SyntaxError: Unexpected number

CASE 3:初始化一个变量,有两个文字。

var x = 10, 10;
Run Code Online (Sandbox Code Playgroud)

我在上面尝试过,但它给我带来了同样的错误:Uncaught SyntaxError: Unexpected number. 现在我很困惑。

CASE 4:初始化一个变量,有两个变量,我之前已经声明或初始化过。

var i = 10;
var j = 20
var x = i, j;
Run Code Online (Sandbox Code Playgroud)

上述案例给了我预期的结果,即10.

但是,在上述所有情况之后,为什么即使首先,JavaScript 在语法上也允许这样做呢?也有一个我以前从未声明过的变量?我很困惑。有什么问题吗,比如一个错误?或者对此有什么解释吗?

笔记:

  1. 以上所有情况都在 Chrome 的控制台中进行了尝试,也在 VS Code 中进行了尝试。
  2. 结果是一样的,当我尝试使用 TypeScript 时。

T.J*_*der 5

你的困惑源于一个误解:

案例 1:用一个常量和一个变量初始化一个变量,我以前从未声明或初始化过。

var x = 10, i;
Run Code Online (Sandbox Code Playgroud)

那不是该代码的作用。在var声明中,逗号不是逗号运算符,¹ 它是您声明的变量之间的分隔符。您的代码完全等同于:

var x = 10;
var i;
Run Code Online (Sandbox Code Playgroud)

案例二...

案例三...

Case 2 和 Case 3 给你一个错误,因为10它不是一个有效的变量名,但这就是var语句在逗号后面所期望的。

案例 4:初始化一个变量,有两个变量,我之前已经声明或初始化过。

var i = 10;
var j = 20
var x = i, j;
Run Code Online (Sandbox Code Playgroud)

上述案例给了我预期的结果,即 10。

......但不是因为你想的原因。有效的原因是您可以var根据需要多次重新声明变量。上面的代码完全等同于:

var i = 10;
var j = 20
var x = i;
var j;
Run Code Online (Sandbox Code Playgroud)

的重新声明j没有效果,它只是完全被忽略了。(对于较新的letor 则不是这样,const如果您尝试重新声明变量,它们会给您一个声明错误。)

如果 var x = i, j使用逗号运算符,则预期结果将是xhad 20, not 10(有关详细信息,请参见下文)。


¹ “...不是逗号运算符...”在表达式中,,是 JavaScript 中的运算符,但除非您将事物组合在一起,否则()这不是,变量声明(或数组或对象文字,函数参数列表)中的含义,或函数参数列表)。但只是为了完整性:

var a;
a = 1, 3;
Run Code Online (Sandbox Code Playgroud)

...使用逗号运算符,它是 JavaScript 的奇数运算符之一:它评估其左侧操作数,丢弃结果值,然后评估其右侧操作数并将该结果值作为其结果。所以上面的,a是用值初始化的3。逗号运算符表达式中的左侧操作数仅对副作用有用。(通常,使用逗号运算符往往会导致代码不清晰,因此最好避免使用。)