在下面的代码中,如何将栏传递为
function (n) { return n; }
在if块中foo评估为true?
function foo(bar) {
if (bar) {
// true
} else {
// false
}
}
这令我感到困惑,所以非常感谢任何帮助。
答案 0 :(得分:6)
如果bar
绑定到匿名函数,那么它就是一个对象。 JavaScript中的对象是“真实的”。
JavaScript中唯一的'falsy'值是:
false
null
undefined
''
(空字符串)0
(数字为零)NaN
其他一切都是“真实的”,包括功能对象。
如果您打算调用匿名函数,则执行if (bar(5))
会使用参数5
调用您的匿名函数。然后你的匿名函数将返回n
(在这种情况下为5
)。由于5
不是假对象,因此也会转到true
分支。执行if (bar(0))
会进入else
分支,因为0
是假的。
答案 1 :(得分:5)
null
,0
,false
,空字符串或undefined
的任何内容将在true
语句中评估为if(something)
,这就是JavaScript中弱类型的工作方式。
如果您想要更具体,您可能需要查看typeof
operator来检查您期望的类型,或者使用另一个更强的支票:
if(bar === true) {
使用===
检查值和类型等价。
答案 2 :(得分:0)
如果你想知道它返回什么类型
,你可以使用typeof()答案 3 :(得分:0)
它总是返回true,因为bar不为null。如果if语句中的表达式不是逻辑表达式(例如if(x <7))则执行null检查。如果为null,则返回false,否则为true。
在您的示例中,您已将bar定义为函数{returns n;},因此这就是if语句评估为true的原因。
如果bar返回bool(true或false),则需要调用该函数并获取结果,而不是传递对函数的引用 - 这是使用括号完成的:
var exampleA = bar(false); // executes function bar and returns the result (false) in exampleA
var exampleB = bar; // stores a reference to the function bar in variable exampleB