哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))

if (elem) { // or !elem

or

if (typeof elem !== 'undefined') {

or

if (elem != null) {

当前回答

检查window.hasOwnProperty(“varname”)

一种替代过多类型答案的方法;

用var varname=value声明的全局变量;全局范围内的语句

可以作为窗口对象的财产访问。

因此,hasOwnProperty()方法

返回一个布尔值,指示对象是否将指定的属性作为自己的属性(而不是继承它)可用于确定

“varname”的var已全局声明,即是窗口的属性。

//因此,在全球范围内建立了窗口的财产var foo=“whatever”,//stringbar=false,//bool巴兹;//未定义//window.qux不存在console.log([window.hasOwnProperty(“foo”),//truewindow.hasOwnProperty(“bar”),//truewindow.hasOwnProperty(“baz”),//truewindow.hasOwnProperty(“qux”)//false] );

hasOwnProperty()的优点在于,在调用它时,我们没有使用一个尚未声明的变量,这当然是问题的一半。

虽然不总是完美或理想的解决方案,但在某些情况下,这只是工作!

笔记

当使用var定义变量时,上述情况是正确的,而不是let which:

声明一个块作用域局部变量,可选地将其初始化为一个值。与var关键字不同,var关键字全局定义变量,或局部定义整个函数,而不考虑块范围。在程序和函数的顶层,let与var不同,它不会在全局对象上创建属性。

为了完整性:根据定义,常量实际上不是可变的(尽管它们的内容可以是可变的);更相关的是:

与var变量不同,全局常量不会成为窗口对象的财产。常量的初始值设定项是必需的;也就是说,必须在声明它的同一语句中指定它的值。常量的值不能通过重新分配来更改,也不能重新声明。const声明创建对值的只读引用。这并不意味着它所持有的值是不可变的,只是变量标识符不能被重新分配。

由于let变量或常量永远不是继承了hasOwnProperty()方法的任何对象的财产,因此不能使用它来检查它们是否存在。

关于hasOwnProperty()的可用性和使用:

object派生的每个对象都继承hasOwnProperty()方法。[…]与in运算符不同,此方法不检查对象的原型链。

其他回答

您可以使用typeof运算符。

例如

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

上面的代码段将返回如下输出

变量dataSet为:undefined。

我很惊讶这还没有被提及。。。

以下是使用此['var_name']的一些其他变体

使用此方法的好处是,它可以在定义变量之前使用。

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

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==)?

很难区分undefined和null。Null是一个值,当您想要指示变量没有特定值时,可以将其赋值给该变量。未定义是一个特殊值,它将是未分配变量的默认值。


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);

这取决于您是否只关心变量是否已定义,或者是否希望它具有有意义的值。

检查类型是否未定义将检查变量是否已定义。

==空或!==null将仅检查变量的值是否完全为null。

==空或!=null将检查该值是否未定义或为null。

if(value)将检查变量是否为undefined、null、0或空字符串。