2017-01-24 2 views
0

Я читал blog post и наткнулся на следующий фрагмент кода:Node JS назначение запятой

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

Пожалуйста, не меняйте свой вопрос! – Qwertiy

+0

Особенно, когда публикуются некоторые ответы. – Qwertiy

ответ

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 нотации. Спецификация выше означает:

  1. ВыраженияПрисваивания определяется как:

    1. Строка var с последующим СпискаОбъявленияПеременных
  2. СпискаОбъявленияПеременных определяется либо как:

    1. ОбъявленияПеременной или
    2. СпискаОбъявленияПеременный, ОбъявлениеПеременная
      • Примечания: это рекурсивное определение. В основном он определяет бесконечный список VariableDeclaration, VariableDeclaration, VariableDeclaration ...
  3. ОбъявленияПеременный определяются как

    1. BindingIdentifier с последующим дополнительным инициализатором или
    2. 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 ... 

So. Допустимые примеры синтаксиса в 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 
+0

Одна из вещей, которые мне не нравятся в языках, наследующих синтаксис C-стиля, состоит в том, что символы могут иметь разные значения в зависимости от того, какой синтаксис он является частью. – slebetman

+0

Была ли моя интерпретация правильной? Не могли бы вы привести небольшой пример? – mbigras

+0

@mbigras: Я не думал, что пример необходим, поскольку вы сами предоставили себе свой вопрос. – slebetman

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 заявлении разделяет различные переменные, так что да, это эквивалент нескольких Варс.