JavaScript检查变量是否存在(被定义/初始化)


Answers

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

Question

检查变量是否被初始化的哪种方法是更好的还是正确的? (假设变量可以容纳任何东西(string,int,object,function等))

if (elem) { // or !elem

要么

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

要么

if (elem != null) {



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

typeof window.console === "undefined"

是相同的

window.console === undefined

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

请注意,我们只在全局范围内查找console (这是所有浏览器中的window对象)。 在这个特定的情况下,这是可取的。 我们不希望在别处定义console

@BrianKelley在他的伟大答案中解释了技术细节。 我只是添加了一些不足的结论,并将其消化为更易于阅读的内容。




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

elem != null

不像一个简单的if (elem) ,它允许0falseNaN'' ,但是拒绝null或者undefined ,这是对一个参数或者一个对象属性的一个很好的通用测试。

其他检查也不正确,他们只是有不同的用途:

  • if (elem) :可以用来保证elem是一个对象,或者如果为false ,则0等被认为是“默认”值(因此相当于undefinednull )。

  • 在指定的null对未初始化的变量或属性具有不同的含义的情况下,可以使用typeof elem == 'undefined'

    • 这是唯一的检查, 不会抛出一个错误,如果elem没有声明 (即没有var声明,不属于window ,或不是一个函数参数)。 在我看来,这是相当危险的,因为它可以让人误入歧途。 为了避免这种情况,请参阅下面的方法。

另外有用的是严格比较undefined

if (elem === undefined) ...

但是,由于全局undefined可以被另一个值覆盖,因此最好在使用它之前将当前范围中undefined的变量声明为:

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

要么:

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

这种方法的第二个优点是JS缩小器可以将undefined变量减少为单个字符,每次都可以节省几个字节。




检查一个对象hasOwnProperty()

另一种类型的答案,是使用hasOwnProperty()当然检查一个对象(几乎所有在JS)有一个属性, 变量(等)。

hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定的属性作为自己的(未继承)属性。

每个Object的继承对象都继承hasOwnProperty()方法。 此方法可用于确定对象是否具有指定的属性作为该对象的直接属性; 与in运算符不同,此方法不检查对象的原型链。

// Globally established (therefore) properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
// window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ),             // true
    window.hasOwnProperty( "bar" ),             // true
    window.hasOwnProperty( "baz" ),             // true
    window.hasOwnProperty( "qux" ),             // false
    { foo: [], bar: 0 }.hasOwnProperty( "bar" ) // true
] );

hasOwnProperty()在于,在调用它的时候,我们不使用一个可能还没有定义的变量 - 这当然是第一个问题的一半。

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




我在上面的答案中看不到这个,所以我想在这里推荐一下。

function isDefined(x) { return !!x }

if( isDefined(x) ) {
    //The variable is defined
}

!x将返回true如果x是nullundefined ,那么!! x只会返回true,如果f既不是undefined也是null。

我意识到这也是空的情况,但这是公正的警告。




最强大的“是它定义”检查与typeof

if (typeof elem === 'undefined')

如果你只是检查一个定义的变量来指定一个默认的,为了方便阅读一个班轮,你可以经常这样做:

elem = elem || defaultElem;

这通常很好用,请参阅: javascript中设置默认值的习惯用法

还有一个使用typeof关键字的班轮:

elem = (typeof elem === 'undefined') ? defaultElem : elem;



我根据对象使用两种不同的方法。

if( !variable ){
  // variable is either
  // 1. empty string i.e. '';
  // 2. Integer 0;
  // 3. undefined;
  // 4. null;
}

有时我不想评估一个空字符串为falsey,那么我使用这种情况

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

如果你需要相反的话,那么在第一个实例中变量变成!!变量,并且在无效函数===成为!=而函数名称变为notInvalid。




if (typeof console != "undefined") {    
   ...
}

或更好

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

适用于所有浏览器




要检查一个变量是否已被声明/设置,我做了这个肮脏的伎俩。

我还没有找到一种方法来提取代码到一个函数,即使与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");
}



未定义,布尔,字符串,数字功能

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

}

对象,数组

if( foo instanceof Array ) { 

}



这取决于实际情况。 如果你正在检查的东西可能或可能不是全局定义在你的代码之外(如jQuery),你想要的:

if (typeof(jQuery) != "undefined")

(不需要严格的平等,typeof总是返回一个字符串。)但是如果你有一个函数的参数可能被传递或者不被传递,它们总是被定义的,但是如果被省略,则为空。

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"



如果你想要定义的块做某事然后使用这个

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

如果你想要未定义的块做某事或分配或定义变量,那么使用这个

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



Null是JavaScript中的一个值, typeof null返回"object"

因此,如果您传递空值,接受的答案将不起作用。 如果您传递空值,则需要为空值添加额外的检查:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}



在许多情况下,使用:

if (elem) { // or !elem

会为你做这个工作...这将检查下面这些情况:

  1. undefined :如果这个值没有被定义,并且是undefined
  2. null :如果它为空,例如,如果DOM元素不存在...
  3. 空字符串''
  4. 0 :数字零
  5. NaN :不是一个数字

所以它会涵盖所有的情况,但总是有些奇怪的情况,我们也想要覆盖,例如一个带空格的字符串,就像这个,这个在javascript中定义,因为它在字符串中有空格。 ..例如在这种情况下,你使用trim()添加一个检查,如:

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

我也创建下面的图像来快速简要回答一下答案: