对于已经在javascript中声明的检测未定义变量,至少有两种不同的方式。
var bar; // declared variable
if (typeof bar !== "undefined") {
// make something with bar
}
if (bar) {
// make something with bar
}
我的问题:
1)两方面在所有方面都是相同的吗?
2)如果不是最好的那个?
答案 0 :(得分:2)
不,他们不平等。如果变量为false或falsy ,则if(bar)
也将失败。将第一种方法与typeof
答案 1 :(得分:2)
if (bar) {
将返回false。
例如,如果bar为0,那么if(bar)
将评估为false。值为false
的栏也将评估为false。
答案 2 :(得分:1)
我认为这是程序员偏好,但我不喜欢未定义的变量。如果它们未定义,我将为它们分配一些值。
如果您的情况是变量是对象的引用,或者它尚未引用:
var my_ref; // undefined
function ref(that_obj) {
my_ref = that_obj;
}
console.log(my_ref); // undefined
ref({"some": "object"});
console.log(my_ref); // {"some": "object"}
我的偏好是将其初始化为false
。如果false
永远不是预期值,那么这仅适用。要使用的其他值为-1
或数字null
。
另一个例子:
function my_func(arg1, arg2, arg3) {
if (has_no_value(arg3)) {
arg3 = "default value";
}
console.log(arg1, arg2, arg3);
}
my_func("first", "lol"); // first lol default value
另外,我建议创建一个检查undefined-ness(在我的情况下为has_no_value
)的函数,因为在typeof arg3 === "undefined"
中很容易出错
if(arg3)
为false,其中包含undefined null 0 "" false NaN
如果您想查看false
做if (false === arg3)
类型强制在JavaScript中与==和!=运算符一起使用。从 维基百科:“有两种类型的转换:隐式和 明确。隐式类型转换的术语是强制。最多 显式类型转换的常见形式称为铸造。“什么 这意味着在它们之前将true和false转换为数字 与一个数字进行比较。与以下任何值进行比较时:0, 在JavaScript中,null,undefined,'',true和false, Douglas Crockford : 好的部件,建议使用===或!==运算符。在 JSLint,有一个“Disallow ==和!=”选项,需要使用 在所有情况下都是===和!==。
答案 3 :(得分:0)
第二个是测试虚假值,这些值不一定表示未定义。
答案 4 :(得分:0)
考虑一下:
var bar;
bar = 0;
alert (typeof bar !== "undefined") // alerts true
alert(bar == true) // alerts false