2015-07-21 37 views
0

這段JavaScript運行良好,沒有"use strict";。但是,我怎樣才能檢查一個全局變量是否存在嚴格模式,以及它有什麼類型,而不會遇到錯誤undeclared variable嚴格模式下的變量類型的對象?

if (!(typeof a === 'object')) { 
    a = ... /* complex operation */ 
} 
+0

你必須定義'前手了'地方。也許在最外層的範圍內,如果你想讓它像全球一樣行事。 – 2015-07-21 13:48:10

+0

@Jamen我發現了一個解決方案:http://stackoverflow.com/a/32247052/22470 – powtac

回答

0

我發現了一個有效的方法來檢查全局變量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 = ... 
} 
+0

這是'if(typeof(a)!=='undefined')...'的非常複雜的替代方案。 –

0

問題是你有一個非聲明的變量...你必須把這第一個: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. 
} 
+1

你甚至不必明確地給它一個值。你可以簡單地做'var a;' – 2015-07-21 13:51:43

+0

是的,你是對的。我提出了一些價值,因爲如果他正在檢查他有什麼樣的變量是因爲他已經有了價值......如果不是這樣,這是沒有意義的。但是,事實確實如此,問題在於他從不聲明變量。 –

+0

我想檢查變量IS ALREADY是否被聲明,以及它是否是一個對象。 – powtac

1

創建隱式全局變量在嚴格模式下是錯誤的。你必須明確地創建了全球:

window.a = ... /* complex operation */ 

typeof a應該仍然像以前一樣工作。

+0

換句話說:沒有辦法檢查如果一個變量已經在嚴格模式下聲明瞭? – powtac

+0

是什麼讓你覺得呢?我說*「'typeof a'仍然應該像以前一樣工作」,我的意思是「非嚴格」模式。對不起,如果不明確。 –