节点JS逗号分配

时间:2017-01-24 07:29:58

标签: javascript node.js

我正在阅读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;

2 个答案:

答案 0 :(得分:3)

它不是逗号运算符。逗号是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表示法。上述规范意味着:

  1. VariableStatement定义为:

    1. 字符串var后跟VariableDeclarationList
  2. VariableDeclarationList定义为:

    1. VariableDeclaration或
    2. VariableDeclarationList,VariableDeclaration
      • 注意:这是一个递归定义。基本上它定义了一个 一个无限的VariableDeclaration,VariableDeclaration,VariableDeclaration ......
      • 列表
  3. VariableDeclaration定义为

    1. BindingIdentifier后跟可选的初始化程序或
    2. BindingPattern后跟初始化程序
      • 注意:此BindingPattern定义用于新的ES6解构分配([a,b,c] = ...)
  4. 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
    

答案 1 :(得分:0)

不,它不是逗号运算符。

var a="1,2,3", b=[1,2,3]; // No comma operators in this line

if (a == b)
  alert("Yes"), a = null; // Comma operator

if (a += 10, b) // Comma operator
  b[1,2] = a;   // Comma operator

a = (1,2,b[3]); // Comma operator

var语句中的逗号分隔了不同的变量,所以是的,它相当于多个变量。