我正在阅读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关键字以获取用逗号分隔的变量列表。

该功能在规范中称为VariableDeclarationListhttp://www.ecma-international.org/ecma-262/7.0/index.html#sec-variable-statement

var关键字语法指定为:

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后跟VariableDeclarationList

VariableDeclarationList定义为:


变量声明或
VariableDeclarationList,VariableDeclaration


注意:这是一个递归定义。基本上,它定义了
无限列表的VariableDeclaration,VariableDeclaration,VariableDeclaration ...


VariableDeclaration定义为


BindingIdentifier后跟可选的Initializer或
BindingPattern后跟一个初始化器


注意:此BindingPattern定义适用于新的ES6解构分配([a,b,c] = ...)




BindingIdentifierBindingPatternInitializer的定义在规范的其他地方指定。

BindingIdentifier的定义基本上是一个变量名。因此有效的BindingIdentifiers是类似helloxy2的东西,而不是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/

10-09 06:16