undefined和NaN,隐式转换为布尔值vs显式

时间:2017-07-28 00:19:19

标签: javascript boolean undefined nan

我正在按照“你不认识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陷阱。但是,最终,它   取决于您的需求。我个人认为以前的版本,依靠   隐含强制更优雅(如果你不会过去   undefinedNaN),显式版本不必要地更多   冗长。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为真正明确检查的一个例子是......

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

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

相关问题