我正在按照“你不认识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
陷阱。但是,最终,它 取决于您的需求。我个人认为以前的版本,依靠 隐含强制更优雅(如果你不会过去undefined
或NaN
),显式版本不必要地更多 冗长。
我的问题是,作者在谈论什么NaN
陷阱?我想当undefined
和NaN
转换为布尔值时,无论是隐式还是显式转换,它们都会导致false
。将undefined
和NaN
传递给隐式函数是对的,对吗?
答案 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;如果没有任何论据是真实的,当然 - 如果不止一个论点是真实的。