我目前正在使用Marijn Haverbekes出色的书籍和#34; Eloquent JavaScript"来学习JavaScript。现在有一个练习,你必须编写一个返回嵌套列表的第n个元素的递归函数。如果没有这样的元素,该函数应该返回undefined
。解决方案如下所示:
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 :(得分: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'
答案 1 :(得分:0)
但是,我真的不知道if(!list){}的确如何。
它检查list
变量是否仍然具有除{false}之外的值,例如null
,undefined
,0
,false
,{{ 1}},NaN
或""
。如果列表有任何falsey值,则返回''
。
为什么如果list有一个元素n?
根据您分享的链接,列表的值为
undefined
表示var list = {
value: 1,
rest: {
value: 2,
rest: {
value: 3,
rest: null
}
}
};
包含子元素或rest
。
最终,它会有null
这个条件将断言并返回null
。