【发布时间】: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 中所述。但是,最终,它 取决于你的需要。我个人认为是前一个版本,靠 隐式强制更优雅(如果你不会通过undefined或NaN),而显式版本是不必要的更多 详细。
我的问题是,作者在说什么NaN陷阱?我认为当undefined 和NaN 转换为布尔值时,无论是隐式转换还是显式转换,它们都会导致false。并且将undefined 和NaN 传递给隐式函数是可以的,对吧?
【问题讨论】:
-
嗯,第一个例子显然不适用于所有真值。
-
@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