2017-03-23 4 views
3

なぜこれが起こるのか誰かが私に説明することができますか?そして、誰かがこの行動の名前を知っているなら、タイトルを編集してください。表現で奇妙な振る舞いJavaScript

const arr = ['RIPA'], varB = "RIPB"; 
let _params; 
_params && Array.isArray(_params) ? arr.push(..._params) : 
arr.push(_params); 

_params && console.log("I will never appear"); 
varB && console.log("I will appear"); 

arr.push(varB); 
console.log('array',arr); 
console.log("Type of the _params --> ", typeof _params); 

出力:このコードで

array [ 'RIPA', undefined, 'RIPB' ] 
Type of the _params --> undefined 

jsBIN: https://jsbin.com/bawepasivo/edit?js,console
repl.it: https://repl.it/GaHX

_paramsがあるのか​​、可能であればundefined実行する&&式が最初のfalseと最後の信頼できる値を返す場合、2番目の式を返します。

+0

'arr.push(_params)'は 'arr'の' undefined'をプッシュしました – Mistalis

+0

あなたの質問は正確には何か、それは少し不明です。 '_params && Array.isArray(_params)'は 'false'と評価され、' arr.push(_params); 'が呼び出され、' undefined'を 'arr'にプッシュします。 – Stijn

+0

しかし、&&式は最初の偽値を返します。私の考えでは、コンパイラは式の2番目の部分を決して実行できません。 –

答えて

2

あなたの式は次のように実行され、その結果、arr.push(_params);です:

(_params && Array.isArray(_params)) ? arr.push(..._params) : arr.push(_params);

しかし、あなたはおそらく、この意味:あなたは括弧を追加する必要が

_params && (Array.isArray(_params) ? arr.push(..._params) : arr.push(_params));

を。

1
false && false     ? never executed  : _params is undefined 
_params && Array.isArray(_params) ? arr.push(..._params) : arr.push(_params); 

他の方法:

if (_params && Array.isArray(_params)) { // (false && false) === false 
    arr.push(..._params); // it will be never executed 
} else { 
    arr.push(_params); // _params is undefined 
} 
+0

A、私は別の角度で表現を見た、私はこのように見た '_params &&(Array.isArray(_params)?arr.push(... params):arr.push(_params));' –

0
let _params; // undefined 

_params && Array.isArray(_params) ?falseある、いわゆるコードがarr.push(undefined);