哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))
if (elem) { // or !elem
or
if (typeof elem !== 'undefined') {
or
if (elem != null) {
哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))
if (elem) { // or !elem
or
if (typeof elem !== 'undefined') {
or
if (elem != null) {
当前回答
尝试捕捉
如果根本没有定义变量(例如:定义全局变量的外部库尚未加载-例如谷歌地图),您可以使用try-catch块检查这一点,无需中断代码执行,如下所示(不需要使用严格模式)
尝试{未定义变量;}捕获(e){console.log('检测到:变量不存在');}console.log('但代码仍在执行');未定义变量;//没有try-catch包装器代码在此处停止console.log('代码执行停止。您不会在控制台上看到此消息');
奖金:(参考其他答案)为什么==比==更清楚(来源)
如果(a==b)
如果(a===b)
其他回答
测试未声明(未定义)变量的捷径是
if (typeof variable === "undefined") {
...
}
我发现它对于检测在浏览器外部运行的脚本(没有声明窗口变量)非常有用。
我根据对象使用两种不同的方式。
if( !variable ){
// variable is either
// 1. '';
// 2. 0;
// 3. undefined;
// 4. null;
// 5. false;
}
有时我不想将空字符串求值为false,所以我使用这种情况
function invalid( item ){
return (item === undefined || item === null);
}
if( invalid( variable )){
// only here if null or undefined;
}
如果你需要相反的东西,那么首先!变量变为!!变量,并且在无效函数中==变为!=函数名变为notInvalid。
typeof运算符将检查变量是否真的未定义。
if (typeof variable === 'undefined') {
// variable is undefined
}
与其他运算符不同,typeof运算符在与未声明的变量一起使用时不会引发ReferenceError异常。
但是,请注意,typeof null将返回“object”。我们必须小心避免将变量初始化为null的错误。为了安全起见,我们可以使用以下方法:
if (typeof variable === 'undefined' || variable === null) {
// variable is undefined or null
}
有关使用严格比较==而不是简单相等==的更多信息,请参阅:JavaScript比较中应该使用哪个相等运算符(==vs==)?
为了检查变量是否已被声明/设置,我使用了这个肮脏的技巧。
即使使用eval,我也没有找到将代码提取到函数的方法。点击下面的评论,了解原因。
"use strict";
// var someVar;
var declared;
try {
someVar;
declared = true;
} catch(e) {
declared = false;
}
if (declared) {
console.log("someVar is declared; now has the value: " + someVar);
} else {
console.log("someVar is not declared");
}
如何检查变量是否存在
这是一个非常可靠的解决方案,用于测试变量是否存在并已初始化:
var setOrNot = typeof variable !== typeof undefined;
它最常用于与三元运算符结合使用,以在某个变量尚未初始化的情况下设置默认值:
var dark = typeof darkColor !== typeof undefined ? darkColor : "black";
封装问题
不幸的是,您不能简单地将检查封装在函数中。
你可能会想到这样做:
function isset(variable) {
return typeof variable !== typeof undefined;
}
然而,如果您正在调用例如isset(foo),并且尚未定义变量foo,这将产生引用错误,因为您无法将不存在的变量传递给函数:
未捕获引用错误:未定义foo
测试函数参数是否未定义
虽然我们的isset函数不能用于测试变量是否存在(原因如上所述),但它确实允许我们测试函数的参数是否未定义:
var a = '5';
var test = function(x, y) {
console.log(isset(x));
console.log(isset(y));
};
test(a);
// OUTPUT :
// ------------
// TRUE
// FALSE
即使没有将y的值传递给函数测试,我们的isset函数在这种情况下也能很好地工作,因为在函数测试中y是一个未定义的值。