2013-06-27 65 views
2

我想知道是否有任何方法可以覆蓋typeof運算符的行爲。具體而言,我想在foo = "hi"bar = new String("hi")上調用typeof運算符時返回「字符串」。在Javascript中更改typeof運算符的行爲

typeof bar返回「對象」,但我希望它返回「字符串」。

我知道這可以通過聲明我自己的函數或訪問構造函數名稱來完成,但我想修改typeof運算符的行爲。

編輯 - 我正在尋找一些代碼,我可以在程序的開頭添加一些代碼,這些代碼修改了程序其餘部分中所有類型運算符的行爲。

+3

我99%確定你不能重寫'typeof' ...只是創建你自己的功能 – Ian

+0

想的太多..只是想確定..謝謝! – everconfusedGuy

+0

沒問題!不知道是否有人可以用文檔支持我,但... – Ian

回答

1

typeof是一個operator在JavaScript中,所以我很肯定你不能。爲了檢測,如果事情是一個字符串,你可以使用這樣的事情:

var s = "hello"; 
console.log(s.substr&&s.charAt&&s.toUpperCase==="".toUpperCase)//true 
s = new String("hello"); 
console.log(s.substr&&s.charAt&&s.toUpperCase==="".toUpperCase)//true 
0

不,你不能修改的typeof的行爲或任何其他運營商對這一問題。然而,下一個最好的解決方案是使用Object.prototype.toString如下:

function typeOf(value) { 
    return Object.prototype.toString.call(value).slice(8, -1); 
} 

現在,您可以按如下方式使用它(見演示 - http://jsfiddle.net/CMwdL/):

var foo = "hi"; 
var bar = new String("hi"); 

alert(typeOf(foo)); // String 
alert(typeOf(bar)); // String 

這部作品在下面給出的理由鏈接:http://bonsaiden.github.io/JavaScript-Garden/#types.typeof

+0

爲什麼downvote? –

+1

我知道如何解決這個問題,如果我可以聲明我自己的功能(正如我的問題所述)。我只想知道我是否可以修改typeof運算符本身的行爲 – everconfusedGuy

+0

我沒有downvote,儘管 – everconfusedGuy

0

您無法更改Javascript運算符,但是您可以檢查它是字符串還是帶有instanceof的字符串對象。

var strObj = new String('im a string') 
var str = 'im a string' 

alert(strObj instanceof String); //true 
alert(typeof strObj == 'string'); //false 
alert(str instanceof String); //false 
alert(typeof str == 'string'); //true 
alert(strObj instanceof String || typeof strObj == 'string'); //true 
alert(str instanceof String || typeof str == 'string'); //true 

當然,這是更簡單和更短的創建自己的功能,但如果你想使用本機JS,就是那樣:alert(str instanceof String || typeof str == 'string');

+0

願意解釋自己嗎? –

+0

同樣的事情發生在我身上。我認爲這裏觸發了快樂的孩子。如果沒有發表評論解釋爲什麼他們低估了答案,真的不應該允許人們倒下一個沒有其他低估的答案。 –

+0

@AaditMShah完全同意你的看法。國際海事組織,只有三種答案:好評,像我一樣工作,如果用戶是善良的,就會被提升;錯誤誰應得到一個downvote。正如我所看到的,我們的答案都在工作...... –

相關問題