我非常了解undefined和null之间的区别以及JavaScript将任何内容强制转换为布尔值的事实,特别是null为false。
我的问题是:为什么FF 9和IE 9都会触发第二个警报? (这是一个基于更复杂脚本的小型测试脚本。它仅用于说明问题......)
我期待着。运算符优先级和表达式返回null,然后将其转换为布尔值false。添加括号,!(context.isNull)没有区别。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test</title>
</head>
<body>
<script type="text/javascript">
var context = this;
var isNull = null;
var aFunc = function() {
alert(context.isNull);
if (!context.isNull) {
alert("Is !context.isNull really true?");
}
};
aFunc();
</script>
</body>
</html>
答案 0 :(得分:1)
context.isNull
this.isNull
是window.isNull
,null
,布尔值为false。然后,您添加!
,将其反转,从而产生整体true
表达式,从而评估您的if
正文。
答案 1 :(得分:0)
编辑:我错过了上下文=此部分..正如其他提到的,context = this =&gt; context = window。
另外,var isNull = null;在全球范围内暗示=&gt; window.isNull = null。
将是,
if (!context.isNull) => if (!window.isNull) =>
if (!null) => if (!false) => if(true)
if(!context.isNull)=&gt; if(!undefined)=&gt; if(!false)=&gt;如果(真)
答案 2 :(得分:0)
因为this.isNull
会评估为null
。 !null
是真实的。
答案 3 :(得分:0)
我认为您期望!null
成为null
?这是有道理的 - 在SQL中使用了那种three-valued logic - 但这不是它在JavaScript中的工作方式。在JavaScript中,!
强制将其参数解释为布尔值,如您所知,null
在被解释为布尔值时变为false
。
答案 4 :(得分:0)
当置于布尔上下文中时,null
值将评估为false
。 unary negation运算符!
将null
转换为布尔值 - false
- 然后将布尔值布尔值转换为其相反的值:{{1} }。所以true
做了两件事 - 它是演员和翻转。
答案 5 :(得分:0)
isNull是一个局部变量。它不是当前由“this”表示的对象的属性,如果你添加this.isNull = null或context.isNull = null,你将获得你想要的东西。
我认为他得到了一个真实的结果,因为context.isNull未定义,因为undefined被视为错误的结果反转它
考虑到这也会产生警报:
var aFunc = function() {
alert(context.isNull);
if (!context.foo) {
alert("Is !context.isNull really true?");
}
};
答案 6 :(得分:0)
首先,“谢谢!”对每个回复的人。
我很尴尬。在漫长的一天中,这是星期五晚上,我颠倒了我脑海中的逻辑。它正在做它应该做的事情。问题是实际的代码正在检查现有的东西,我向后编写了我的测试用例。
如果将null转换为false,则返回false,false为true,因此执行“if”代码。我(脑死亡)选择的字段名称掩盖了这个问题。
原因
var context = this;
是真正的代码位于构造函数中。然后,在创建函数时“关闭”字段“上下文”,这保留对正在构造的对象的引用。当函数附加到另一个对象(通常作为事件处理程序)时,这很重要,这样函数体就可以访问原始对象的内容。当然,在这个例子中,“this”指的是全局对象,它没有多大用处。