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

if (elem) { // or !elem

or

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

or

if (elem != null) {

当前回答

这些答案(除了Fred Gandt解决方案)要么不正确,要么不完整。

假设我需要我的variableName;携带一个未定义的值,因此它是以var variableName等方式声明的;这意味着它已经初始化;-如何检查是否已申报?

或者更好——我如何立即检查“Book1.chapter22.paragraph37”是否存在一次调用,但不会引起引用错误?

我们通过使用最强大的JasvaScript运算符in运算符来实现

"[variable||property]" in [context||root] 
>> true||false

其他回答

您可以使用typeof运算符。

例如

var dataSet;

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

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

变量dataSet为:undefined。

在ReactJS中,事情有点复杂!这是因为它是一个编译环境,遵循ESLint的无undef规则,因为react-scripts@2.0.3(2018年10月1日发布)。这里的文档对任何对此问题感兴趣的人都有帮助。。。

在JavaScript中,在ES6之前,变量和函数声明被提升到作用域的顶部,因此可以在代码中的正式声明之前使用标识符。。。。当ES6的[新]规则遇到对尚未声明的标识符的引用时,将发出警告。

因此,虽然有可能有一个未定义(或“未初始化”)的变量,但在ReactJS中有一个没有关闭esint规则的未声明变量是不可能的。

这可能非常令人沮丧——GitHub上有太多的项目只是利用了ES6之前的标准;并且在没有任何调整的情况下直接编译这些基本上是不可能的。

但是,对于ReactJS,可以使用eval()。如果你有一个未声明的变量,比如。。。

if(undeclaredvar) {...}

您可以简单地将此部分重写为。。。

if(eval('typeof undeclaredvar !== "undefined"')) {...}

例如。。。

if(eval(“false”)){console.log(“否!”);}if(eval(“true”)){console.log(“是!”);}

对于那些将GitHub存储库导入ReactJS项目的人来说,这只是检查是否声明了变量的唯一方法。在结束之前,我想提醒您,如果使用错误,eval()存在安全问题。

最高答案是正确的,请使用typeof。

然而,我想指出的是,在JavaScript中,undefined是可变的(出于某种不道德的原因)。所以只需检查varName!==undefined有可能不会总是像您期望的那样返回,因为其他库可能已经更改了undefineed。一些答案(比如@skalee's)似乎更倾向于不使用typeof,这可能会让人陷入麻烦。

处理此问题的“旧”方法是将undefined声明为一个var,以抵消任何潜在的undefined/override。然而,最好的方法仍然是使用typeof,因为它将忽略其他代码中对undefined的任何重写。特别是如果你正在编写代码,以供在野外使用,谁知道页面上还有什么其他内容。。。

检查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运算符不同,此方法不检查对象的原型链。

您需要运算符的类型。明确地:

if (typeof variable !== 'undefined') {
    // the variable is defined
}