我正在阅读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;
答案 0 :(得分:3)
它不是逗号运算符。逗号是var
关键字语法的一部分。指定var
关键字以获取以逗号分隔的变量列表。
此功能在规范中称为VariableDeclarationList
:http://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定义为:
VariableDeclaration定义为
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
答案 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
语句中的逗号分隔了不同的变量,所以是的,它相当于多个变量。