簡體   English   中英

JavaScript 變量 === undefined 不起作用

[英]JavaScript variable === undefined not working

我有這個功能:

isset = function(obj){
  alert(obj !== undefined);
 }

然后,當我做isset(defined_variable)其中defined_variable已經宣布,該警告框顯示真實的,但是當我做isset(undefined_variable)其中undefined_variable未聲明,警告框不顯示在所有的,而我預期的警告對話框顯示 我究竟做錯了什么? 我試過使用typeof但結果是一樣的。

那是因為 undefined 和 undeclared 之間存在差異。

var foo; // foo is undefined.
// bar is undeclared.

console.log(foo === undefined); // true
try {
  console.log(bar === undefined);
} catch (e) {
  console.error('I had an error!'); // gets invoked.
}

foo = 'something';
console.log(foo === undefined); // false

但是當我在未聲明 udefined_variable 的情況下執行 isset(undefined_variable) 時,警報框根本不顯示,而我希望警報框顯示 false

因為它會在您的控制台中引發錯誤(檢查您的控制台),表明您正在比較的這個變量未定義。

未捕獲的 ReferenceError: 'c' 未定義

我嘗試使用isset( c )並且沒有首先聲明c

當您取消引用一個未聲明的變量(意味着您嘗試使用一個以前從未寫過的符號)時,您會收到一個Reference error


有幾種方法可以解決這個問題,但是您無法確定 javascript 中的局部變量是什么。 因此,您的問題只能針對全局變量或給定范圍對象動態解決。

沒有函數可以動態處理局部作用域。


如果您在瀏覽器上下文中,則可以使用window前綴(有關更多上下文,請參閱有關 javascript 中的全局對象的 SO 答案

這不會修改您的isset功能代碼:

isset(window.undefined_variable)

還有另一種方式,需要更改isset函數,但使用相同的原理(仍在瀏覽器上下文中):

isset('undefined_variable_name_wrawppped_in_a_string')

function isset(name) {
    return name in window;
}

我們不能真正在isset使用typeof ,這很可悲,因為它很方便,因為它不會在從未聲明變量時拋出Reference Error 我們仍然可以使用某種形式的 eval 來完成它,但由於我不希望我們去那里,所以我不會實現它。

但是現在,如果您想檢查多個嵌套屬性怎么辦?

function isset (memoryPath, root) {
    var nodeNames = memoryPath.split('.');
    var expectedDepthReached = nodeNames.length;
    var depthReached = 0;
    var nodeName;
    var node = root;

    // we are gonna read it from left to right
    // using Array.prototype.pop()
    // reversing it will alow us to do so
    nodeNames.reverse();

    do {
        nodeName = nodeNames.pop();
        node = node[nodeName];

        if (node) {
            depthReached++;
        }
    } while (node);

    return depthReached === expectedDepthReached;
}

還有一個例子:

window.myGlobals = {
    path: {
        to: {
            a: {
                variable: true
            }
        }
    }
};

isset('myGlobals.path.to.a.variable', window), // true
isset('myGlobals.path.foo', window) // false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM