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) {



如果你想要定義的塊做某事然後使用這個

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

如果你想要未定義的塊做某事或分配或定義變量,那麼使用這個

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



在大多數情況下,你會使用:

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變量減少為單個字符,每次都可以節省幾個字節。




這取決於實際情況。 如果你正在檢查的東西可能或可能不是全局定義在你的代碼之外(如jQuery也許):

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

(不需要嚴格的平等,typeof總是返回一個字符串。)但是如果你有一個函數的參數可能被傳遞或者不被傳遞,它們總是被定義的,但是如果被省略,則為空。

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



在許多情況下,使用:

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()) {
///

我也創建下面的圖像來快速簡要回答一下答案:




我在上面的答案中看不到這個,所以我想在這裡推荐一下。

function isDefined(x) { return !!x }

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

!x將返回true如果x是nullundefined ,那麼!! x只會返回true,如果f既不是undefined也是null。

我意識到這也是空的情況,但這是公正的警告。




在問題中概述的特定情況下,

typeof window.console === "undefined"

是相同的

window.console === undefined

我更喜歡後者,因為它更短。

請注意,我們只在全局範圍內查找console (這是所有瀏覽器中的window對象)。 在這個特定的情況下,這是可取的。 我們不希望在別處定義console

@BrianKelley在他的偉大答案中解釋了技術細節。 我只是添加了一些不足的結論,並將其消化為更易於閱讀的內容。




最強大的“是它定義”檢查與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。




檢查一個對象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()在於,在調用它的時候,我們不使用一個尚未定義的變量 - 這當然是第一個問題的一半。

雖然並不總是 完美理想的解決方案,但在某些情況下,這只是工作!




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

或更好

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

適用於所有瀏覽器




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

因此,如果您傳遞空值,接受的答案將不起作用。 如果您傳遞空值,則需要為空值添加額外的檢查:

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



未定義,布爾,字符串,數字功能

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

}

對象,數組

if( foo instanceof Array ) { 

}



要檢查一個變量是否已被聲明/設置,我做了這個骯髒的伎倆。

我還沒有找到一種方法來提取代碼到一個函數,即使與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");
}