2017-01-24 14 views
0

私はblog postを読み、次のコードスニペットに出くわした:ノード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; 

が、これはコンマ演算子の例です:

カンマ演算子は、両方のオペランドを(左から右に)評価し、2番目のオペランドの値を返します。

もしそうなら、私はまだ何が起こっているのかは分かりません。以下は有効だろう

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と呼ばれている:あなたはBNFやRBNF記法に慣れていない場合は

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] 

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-variable-statement

varキーワード構文は次のように指定されています。

  1. VariableStatementは次のように定義される:仕様は、上記の意味

    1. VariableDeclaration:VariableDeclarationList
  2. VariableDeclarationList続い

    1. ストリングvarのいずれかとして定義されていますまたは
    2. VariableDeclarationList、変数宣言
      • 注:これは再帰的な定義です。基本的には、 VariableDeclaration、VariableDeclaration、VariableDeclarationの無限のリストを定義しています...
  3. VariableDeclarationが任意イニシャライザまたはイニシャライザ

    • 注続い
    • BindingPattern続い

      1. BindingIdentifierのように定義される:このBindingPattern定義が新しいES6のためのものです非構造化代入([a、b、c] = ...)

BindingIdentifierBindingPatternInitializerの定義は、他の場所仕様で規定されています。

BindingIdentifierの定義は基本的に可変名です。有効なBindingIdentifiershelloまたはxまたはy2ですが、for(キーワードであるため)または1k(数字で始まるため)ではありません。

可変リストの定義を理解することは厳密には必要ではないので、私はBindingPatternの定義を今は無視します。

Initializerの定義は、記号=の後に式が続きます。基本的に=に続いて任意のjavascriptコード。

ので、VariableDeclaration(NOT varキーワード、それのほんの一部が)単に次のように定義されます

anyVariableName = anything 

または

anyVariableName // remember, Initializer is optional 

そしてvarキーワードがいずれかのように定義されます。

var VariableDeclaration 

または

var VariableDeclaration, VariableDeclaration, VariableDeclaration ... 

So.

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"]; 

その他の注意事項を:varキーワード構文の有効な例は、我々はその後、BindingPattern定義が含まれている場合

varキーワード構文の有効な例も含めるなど

var x; 

var x = 12; 

var x, 
    y = "hello", 
    z; 

var x = 0, 
    y, 
    z=100; 

含ま:

varキーワードがないと、VariableDeclarationも発生する可能性があります。たとえば:何varキーワードが存在しないため、この場合は

a = 40; // if this is the first time a is defined then it is 
     // automatically created as a global variable 

、表示され、任意のカンマがvar構文の一部ではないでしょう。どのvarキーワードを指定せずにコンマはコンマ演算子であることを意味します

a = 10, b = 50; // comma operator 
+0

Cスタイルの構文を継承する言語について私が気に入らないことの1つは、シンボルがその構文の一部に応じて異なる意味を持つことができることです。 – 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文のコンマはそうはい、それは複数のVARSに相当し、異なる変数を分離します。