![](/img/trans.png)
[英]JavaScript - “variable undefined” in one part of loop, working in a different part
[英]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.