【问题标题】:JavaScript: Checking a list for elementsJavaScript:检查元素列表
【发布时间】:2016-11-09 11:56:35
【问题描述】:

我目前正在使用 Marijn Haverbekes 的优秀书籍“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

【问题讨论】:

  • if (!list) 检查空列表
  • @FrédéricHamidi 是的,列表分支,因为它是递归遍历的

标签: javascript arrays list function


【解决方案1】:

这个

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'

【讨论】:

  • list === NaN 总是false
  • @MaxZuber wups。固定。
  • isNan(list)list 转换为 Number 类型,因此会导致不希望的结果。使用list !== list 而不是
【解决方案2】:

但是,我真的不明白 if (!list) {} 到底做了什么。

它检查list 变量是否还有一个非虚假值,例如nullundefined0falseNaN""''。如果列表有任何错误值,则返回undefined

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

根据您分享的链接,列表的值为

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

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

最终,它将具有null,这就是该条件将断言并返回undefined

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2021-09-25
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多