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

if (elem) { // or !elem

or

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

or

if (elem != null) {

当前回答

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

以下是使用此['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!

其他回答

我更喜欢这种方法,因为它的准确性和简洁性:

变量x如果(x===无效0){console.log(“x未定义”)}其他{console.log(“x已定义”)}

正如在其他评论和回答中提到的,undefined不能保证是undefineed。因为它不是关键字,所以可以在全局范围以外的范围中将其重新定义为变量。这里有一个小例子可以说明这种细微差别:

var undefined='bar'console.log(`在全局范围内:${undefined}`)函数foo(){var undefined=“已定义”变量x如果(x===未定义){console.log(`x===undefined`)}其他{console.log(`x!==undefined`)}如果(x===无效0){console.log(`x===void 0`)}其他{console.log(`x!==void 0`)}}foo()

请参阅void以了解兼容性(IE5支持!?!!哇!)。

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

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

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

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

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

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

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

在问题中概述的特定情况下,

typeof window.console === "undefined"

与相同

window.console === undefined

我更喜欢后者,因为它更短。

请注意,我们只在全局范围内查找控制台(这是所有浏览器中的窗口对象)。在这种特殊情况下,这是可取的。我们不希望在其他地方定义控制台。

@BrianKelley在他出色的回答中解释了技术细节。我只是补充了不足的结论,并将其消化为更容易阅读的内容。

在大多数情况下,您会使用:

elem != null

与简单的if(elem)不同,它允许0、false、NaN和“”,但拒绝null或undefined,这使它成为一个很好的通用测试,用于检查参数或对象属性的存在。


其他检查也没有错,它们只是有不同的用途:

if(elem):如果elem被保证是一个对象,或者如果false、0等被认为是“默认”值(因此相当于undefined或null),则可以使用。typeof elem==“undefined”可用于指定的null对未初始化的变量或属性具有不同含义的情况。如果没有声明elem(即没有var语句,不是window的属性,或者不是函数参数),这是唯一不会抛出错误的检查。在我看来,这是相当危险的,因为它会让错别字不知不觉地溜走。要避免这种情况,请参阅以下方法。


与未定义的严格比较也很有用:

if (elem === undefined) ...

但是,由于全局undefined可以用另一个值重写,因此最好在使用变量之前在当前范围中声明变量undefined:

var undefined; // really undefined
if (elem === undefined) ...

Or:

(function (undefined) {
    if (elem === undefined) ...
})();

此方法的第二个优点是JS minifiers可以将未定义的变量减少为单个字符,每次都可以节省几个字节。