我正在阅读blog post并遇到以下代码片段:
var fs = require('fs'),
filenames,
i,
processId;
filenames = fs.readdirSync(".");
for (i = 0; i < filenames.length; i++) {
console.log(filenames[i]);
}
console.log("Ready.");
processId = process.getuid();
我很好奇:
var fs = require('fs'),
filenames,
i,
processId;
这是逗号运算符的示例:
逗号运算符计算两个操作数(从左到右)并返回第二个操作数的值。
如果是这样,我仍然不真正了解发生了什么。以下语句与编写类似内容的语句是否相同:
var fs = require('fs')
var filenames;
var i;
var processId;
以下内容是否有效:
var foo = require('./foo.js'),
bar = require('./bar.js'),
baz = require('./baz.js'),
input = "some string",
i,j,k;
并评估为:
var foo = require('./foo.js'),
var bar = require('./bar.js');
var baz = require('./baz.js');
var input = "some string";
var i;
var j;
var k;
最佳答案
不是逗号运算符。逗号是var
关键字语法的一部分。指定var
关键字以获取用逗号分隔的变量列表。
该功能在规范中称为VariableDeclarationList
:http://www.ecma-international.org/ecma-262/7.0/index.html#sec-variable-statementvar
关键字语法指定为:
Syntax
VariableStatement[Yield]:
var VariableDeclarationList[In, ?Yield];
VariableDeclarationList[In, Yield]:
VariableDeclaration[?In, ?Yield]
VariableDeclarationList[?In, ?Yield], VariableDeclaration[?In, ?Yield]
VariableDeclaration[In, Yield]:
BindingIdentifier[?Yield] Initializer[?In, ?Yield]opt
BindingPattern[?Yield] Initializer[?In, ?Yield]
如果您不熟悉BNF或RBNF表示法。上面的规范表示:
VariableStatement定义为:
字符串
var
后跟VariableDeclarationListVariableDeclarationList定义为:
变量声明或
VariableDeclarationList,VariableDeclaration
注意:这是一个递归定义。基本上,它定义了
无限列表的VariableDeclaration,VariableDeclaration,VariableDeclaration ...
VariableDeclaration定义为
BindingIdentifier后跟可选的Initializer或
BindingPattern后跟一个初始化器
注意:此BindingPattern定义适用于新的ES6解构分配([a,b,c] = ...)
BindingIdentifier
,BindingPattern
和Initializer
的定义在规范的其他地方指定。BindingIdentifier
的定义基本上是一个变量名。因此有效的BindingIdentifiers
是类似hello
或x
或y2
的东西,而不是for
(因为它是关键字)或1k
(因为它以数字开头)。我现在将忽略
BindingPattern
的定义,因为严格理解变量列表定义不是必需的。Initializer
的定义是符号=
后跟一个表达式。基本上=
后跟任何javascript代码。因此,
VariableDeclaration
(不是var
关键字,只是其中一部分)被简单定义为:anyVariableName = anything
要么
anyVariableName // remember, Initializer is optional
并且
var
关键字定义为:var VariableDeclaration
要么
var VariableDeclaration, VariableDeclaration, VariableDeclaration ...
所以。
var
关键字语法的有效示例包括var x;
var x = 12;
var x,
y = "hello",
z;
var x = 0,
y,
z=100;
等等
当我们包含
BindingPattern
定义时,var
关键字语法的有效示例还包括:var x=10,
[a,b,c] = [100,200,300],
i,
j;
var {x,y,z} = {x:10,y:20,z:30},
a = 2,
b,
c,
[i,j,k]=["hello","cruel","world"];
补充说明:
请注意,没有
VariableDeclaration
关键字也可能发生var
。例如:a = 40; // if this is the first time a is defined then it is
// automatically created as a global variable
在这种情况下,由于没有
var
关键字,因此出现的任何逗号都不属于var
语法的一部分。这意味着没有var
关键字的逗号是逗号运算符:a = 10, b = 50; // comma operator
关于javascript - Node JS逗号分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41822419/