2016-07-07 8 views
0

私は現在、Marijn Haverbekesの優れた本「Eloquent JavaScript」を使用してJavaScriptを学習しています。ここでは、ネストされたリストのn番目の要素を返す再帰関数を記述する必要があるこのエクササイズがあります。そのような要素がない場合、関数はundefinedを返すと想定されます。このソリューションは次のようになります。JavaScript:要素のリストを確認する

function nth(list, n) { 
    if (!list) 
    return undefined; 
    else if (n == 0) 
    return list.value; 
    else 
    return nth(list.rest, n - 1); 
} 

これまでのところすべてがわかりやすいようです。しかし、私は実際には正確にif (!list) {}が何を得るかは分かりません。この状態はどのくらい正確に評価されますか? listの要素がnの場合はどうしてそうですか?

完全に運動し

は、ここで見つけることができます: http://eloquentjavascript.net/04_data.html#p_7AnSuS26HF

+0

'(もし!リスト)'チェックFrédé[email protected]空のリスト –

+0

うん、リスト枝、それは再帰的にトラバースているため –

答えて

2

この

if (!list) 

がリストのとき

if (list === false || list === 0 || list === '' || list === null || list === undefined || list !== list /* NaN */) ... 

!listがでどうなるというのが簡単な方法ですより短い要素。

// 4 is larger than the list length here, (2) 
// !list will happen 
nth({value: 'a', rest: {value: 'b', rest: null}}, 4) 
//=> undefined 

// 1 is not larger than the list length 
// !list will not happen 
// instead, n === 0 happens after recursing 1 time 
nth({value: 'a', rest: {value: 'b', rest: null}}, 1) 
//=> 'b' 
+0

'リスト=== NaN'常に' false'を –

+0

@MaxZuber wups。一定。 – naomik

+0

'isNan(list)'は 'list 'をNumber型にキャストするので、望ましくない結果を招きます。もう一度 –

0

しかし、私が本当にあれば(!リスト){}がありません正確に何を得ることはありません。

list変数はまだそのようなnullundefined0falseNaN""又は''としてfalsey値以外の値を有することが確認。リストに偽の値がある場合は、undefinedを返します。

リストに要素nがあるのはなぜですか?あなたが共有しているリンクを1として

、リストの値は、いずれかの意味restが子要素を持っているか、それがnullを持って

var list = { 
    value: 1, 
    rest: { 
    value: 2, 
    rest: { 
     value: 3, 
     rest: null 
    } 
    } 
}; 

です。

最終的には、nullとなり、この条件がアサートされ、undefinedが返されます。

関連する問題