【问题标题】:undefined and NaN, convert to boolean value implicitly vs explicitlyundefined 和 NaN,隐式与显式转换为布尔值
【发布时间】:2018-01-03 21:39:40
【问题描述】:

我目前正在通过《你不懂 js》这本书来学习 javascript。

在“type & grammer”一节中,作者在讨论隐式与显式布尔转换时提到了

//come up with a function that make sure only one argument is truthy

//implicit convertion
function onlyOne() {
  var sum = 0;
  for (var i=0; i < arguments.length; i++) {
      // skip falsy values. same as treating
      // them as 0's, but avoids NaN's.
      if (arguments[i]) {
          sum += arguments[i];
      }
  }
  return sum == 1;
}

//explicit convertion
function onlyOne() {
  var sum = 0;
  for (var i=0; i < arguments.length; i++) {
      sum += Number( !!arguments[i] );
  }
  return sum === 1;
}

这个实用程序的显式强制形式“更好”吗?它确实避免 NaN 陷阱,如代码 cmets 中所述。但是,最终,它 取决于你的需要。我个人认为是前一个版本,靠 隐式强制更优雅(如果你不会通过 undefinedNaN),而显式版本是不必要的更多 详细。

我的问题是,作者在说什么NaN陷阱?我认为当undefinedNaN 转换为布尔值时,无论是隐式转换还是显式转换,它们都会导致false。并且将undefinedNaN 传递给隐式函数是可以的,对吧?

【问题讨论】:

  • 嗯,第一个例子显然不适用于所有真值。
  • @MinusFour true 值是除了 `NaN、undefined、null、+0、-0、""、false" 之外的所有值,那么第一个例子中什么样的truthy 值不适用呢?
  • 任何对象,或任何非空字符串。
  • 这是一个非常糟糕的显式与隐式布尔值测试示例。
  • 代码应为if (arguments[i]) sum++sum += +!!arguments[i]sum += Number(Boolean(arguments[i]))(或可能隐含数字转换),但不能混合使用。

标签: javascript boolean undefined nan


【解决方案1】:

我认为一个真正的显式检查的例子是......

function onlyOne() {
  var sum = 0;
  for (var i=0; i < arguments.length; i++) {
      sum += Boolean( arguments[i] );
  }
  return sum == 1;
}

这当然会避免/防范 NaN 并且如果没有参数存在应该返回 false;如果没有论点是真实的,当然 - 如果不止一个论点是真实的。

【讨论】:

    【解决方案2】:

    第二个例子总是避免 NaN,因为 Number(!!string) 和 Number(!!object) 都被转换为 1 enter image description here

    【讨论】:

    • 对不起,总是避免。我的坏!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2011-02-26
    • 2016-07-10
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多