2013-06-27 3 views
2

Я хотел бы знать, есть ли способ переопределить поведение оператора typeof. В частности, я хочу вернуть «строку», когда оператор typeof вызывается как на foo = "hi", так и на bar = new String("hi").Изменение поведения оператора typeof в Javascript

typeof bar возвращает «объект», но я хочу, чтобы он возвращал «строку».

Я знаю, что это может быть сделано путем объявления моей собственной функции или доступа к имени конструктора, но я хочу изменить поведение оператора typeof.

EDIT - Я ищу код, который я могу добавить, например, в начале программы, которая изменяет поведение всех операторов typeof в остальной части программы.

+3

Я на 99% уверен, что вы не можете переопределить 'typeof' ... просто создайте свою собственную функцию – Ian

+0

Мысль столько же. Просто хотелось быть уверенным ... спасибо! – everconfusedGuy

+0

Нет проблем! Не уверен, что кто-то может поддержать меня с документацией, но ... – Ian

ответ

2

Это невозможно. Поведение собственных операторов не может быть изменено.

Ссылки по теме:

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

Я не уменьшал ни одного значения – 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 Полностью согласен с вами. ИМО, есть только 3 типа ответа: Хорошие, которые поддерживаются; Работа, которая, как и моя, будет поддерживаться, если пользователь добр; и неправильно, кто заслуживает нисходящего. Как я вижу, оба наших ответа работают ... –