- if(a) 准确地检查 javascript 是什么?它可以检查未定义吗?它可以检查null吗?它可以检查一个空字符串吗?
- 我们什么时候需要使用 typeof a == 'undefined' 或者它可以被 if(a) 覆盖?
6 回答
if
在布尔上下文中计算a
并使用结果来确定要执行的代码分支。undefined
,null
并且空字符串都false
在布尔上下文中计算。
typeof a === "undefined"
检查名称是否已定义很有用a
(例如,当前范围内是否存在具有该名称的变量)。如果没有这个结构,a
如果没有定义,直接访问会抛出异常。
取自ECMAscript 语言规范,if 语句的工作方式如下:
12.5 if 语句
产生式 IfStatement : if ( Expression ) 语句的评估如下:
- 令exprRef为计算表达式的结果。
- 如果ToBoolean(GetValue(exprRef))为 false,则返回(正常、空、空)。
- 返回 Statement 的评估结果。
意味着,在这种情况下,它会尝试这样的toBoolean
转换:
表 11 - ToBoolean 转换
Undefined: false
Null: false
Boolean: 结果等于输入参数(无转换)。Number:如果参数为+0、-0或NaN
,则 结果为false;否则结果为真。String:如果参数为空字符串(长度为零),则 结果为假;否则结果为真。 对象:真
它检查不是假的值,即,false
和/或空字符串。当您对某个值是否未定义感到好奇时很有用,因为无法区分虚假值。0
undefined
null
typeof a == 'undefined'
if (a)
条件语句只会检查“真”或“假”。在未定义的情况下,不满足条件并且控制不会进入循环。
typeof 返回操作数的类型。有关详细信息,您可能希望查看此链接
以下值在 javascript 条件下被视为 false:false、null、undefined、''、0、NaN
h2co3 的答案实际上几乎是正确的,你不能在没有 typeof 的 if 中检查未定义的变量,因为这会导致脚本错误。
如果你这样做:
<script>
if (a) alert('hello');
</script>
你会得到一个脚本错误并且 if 不会被评估(在没有显示警报的意义上结果是相同的,但那是因为线程执行由于脚本错误而结束。)
如果你想确保 a 被定义,你需要使用 typeof 测试。