2016-07-07 94 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

完整的锻炼; Tibial可以在这里找到: http://eloquentjavascript.net/04_data.html#p_7AnSuS26HF

+0

'如果(!列表)'检查空列表 –

+0

@FrédéricHamidi呀,列表选项,因为它是经过递归 –

回答

2

if (!list) 

是说当列表

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

!list会发生的简写方式短于n元素。

// 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'转换为数字类型,所以会导致不希望的结果。再次使用'list!== list'代替 –

0

不过,我真的不明白究竟如果(!列表){}做什么。

它检查list变量仍具有值比falsey值如nullundefined0falseNaN""''其他。如果列表有任何错误值,则返回undefined

为什么它是真的,如果列表有一个元素n?

按照你分享的链接列表的价值是

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

这意味着要么rest有子元素,或者它有null

最终,它将有null这是什么条件将声明并返回undefined