這段JavaScript運行良好,沒有"use strict";
。但是,我怎樣才能檢查一個全局變量是否存在嚴格模式,以及它有什麼類型,而不會遇到錯誤undeclared variable
?嚴格模式下的變量類型的對象?
if (!(typeof a === 'object')) {
a = ... /* complex operation */
}
這段JavaScript運行良好,沒有"use strict";
。但是,我怎樣才能檢查一個全局變量是否存在嚴格模式,以及它有什麼類型,而不會遇到錯誤undeclared variable
?嚴格模式下的變量類型的對象?
if (!(typeof a === 'object')) {
a = ... /* complex operation */
}
我發現了一個有效的方法來檢查全局變量a
是否存在,而沒有在JavaScript中觸發警告。
hasOwnProperty()
方法返回一個布爾值,指示對象是否具有指定的屬性。
hasOwnProperty()
當所請求的變量名稱不存在於全局空間中時不會觸發警告!
'use strict';
if (!window.hasOwnProperty('a')) {
window.a = ...
// Or
a = ...
}
爲了確保a
是一個對象使用
'use strict';
if (!(window.hasOwnProperty('a') && typeof a === 'object')) {
window.a = ...
// Or
a = ...
}
這是'if(typeof(a)!=='undefined')...'的非常複雜的替代方案。 –
問題是你有一個非聲明的變量...你必須把這第一個:var a = {};
。但是,這裏是我如何檢查這些事情。
var utils = {
//Check types
isArray: function(x) {
return Object.prototype.toString.call(x) == "[object Array]";
},
isObject: function(x) {
return Object.prototype.toString.call(x) == "[object Object]";
},
isString: function(x) {
return Object.prototype.toString.call(x) == "[object String]";
},
isNumber: function(x) {
return Object.prototype.toString.call(x) == "[object Number]";
},
isFunction: function(x) {
return Object.prototype.toString.call(x) == "[object Function]";
}
}
var a = ""; // Define first, this is your real problem.
if(!utils.isObject(a)) {
// something here.
}
你甚至不必明確地給它一個值。你可以簡單地做'var a;' – 2015-07-21 13:51:43
是的,你是對的。我提出了一些價值,因爲如果他正在檢查他有什麼樣的變量是因爲他已經有了價值......如果不是這樣,這是沒有意義的。但是,事實確實如此,問題在於他從不聲明變量。 –
我想檢查變量IS ALREADY是否被聲明,以及它是否是一個對象。 – powtac
創建隱式全局變量在嚴格模式下是錯誤的。你必須明確地創建了全球:
window.a = ... /* complex operation */
typeof a
應該仍然像以前一樣工作。
換句話說:沒有辦法檢查如果一個變量已經在嚴格模式下聲明瞭? – powtac
是什麼讓你覺得呢?我說*「'typeof a'仍然應該像以前一樣工作」,我的意思是「非嚴格」模式。對不起,如果不明確。 –
你必須定義'前手了'地方。也許在最外層的範圍內,如果你想讓它像全球一樣行事。 – 2015-07-21 13:48:10
@Jamen我發現了一個解決方案:http://stackoverflow.com/a/32247052/22470 – powtac