5

typeofオペレーターの動作をオーバーライドする方法があるかどうかを知りたいです。typeof具体的には、演算子が と の両方で呼び出されたときに「文字列」を返したいと考えていfoo = "hi"ますbar = new String("hi")

typeof bar「オブジェクト」を返しますが、「文字列」を返したいです。

typeofこれは、独自の関数を宣言するか、コンストラクター名にアクセスすることで実行できることはわかっていますが、演算子の動作を変更したいと考えています。

編集 -プログラムの先頭に追加して、プログラムの残りのすべての typeof 演算子の動作を変更できるコードを探しています。

4

4 に答える 4

5

それは不可能です。ネイティブ オペレータの動作は変更できません。

関連リンク:

于 2013-06-27T03:02:45.410 に答える
2

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');.

于 2013-06-27T03:05:51.737 に答える
1

typeof は 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
于 2013-06-27T02:54:24.503 に答える
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

于 2013-06-27T02:58:00.997 に答える