2010-03-08 3 views
3
var x= 1; 
Number.prototype.test = function() { return this }; 
x.test() === x.test() // false 

Почему проверка === ложна?Javascript: прототип номера

+0

Попробуйте вывести (например, через console.log или alert, не знаете свой контекст) значение, которое оно возвращает. Да, я не знаю, как это поможет, но с чего начать. –

ответ

3

Потому что this будет объектом Number, а не исходным значением примитивного числа, и сравнением двух одинаково созданных объектов будет всегда возвращает ложь:

{"test":"Hello"} === {"test":"Hello"} // false 

// Check the typeof your vars 
var x= 1; 
Number.prototype.test = function() { return this }; 
x.test() === x.test() // false 
alert("x is a "+typeof(x)+", x.test() is an "+typeof(x.test())); 

Если вы ищете исправление, отлитый this ряда

var x= 1; 
Number.prototype.test = function() { return +this }; 
x.test() === x.test() // TRUE! 
alert("x is a "+typeof(x)+", x.test() is also a "+typeof(x.test())); 
+0

@eugene: хорошее место по ошибкам синтаксиса (пропущенная закрывающая скобка в каждом блоке кода). Спасибо за редактирование :) –

+0

Сравнение объектов всегда возвращает false? Теперь это уродливо ... Как проверить, если два объекта одинаковы? –

+0

@Bart: хорошее место, я имел в виду, что сравнение с одинаково созданными объектами вернет false. –

1

Каждый раз, когда вы вызываете .test(), создается новый экземпляр Number, это очень ожидаемое поведение, каждое бокс-решение работает таким образом. Вы можете попробовать одно и то же в C# и Java и получите абсолютно тот же результат. (Ну, у Java есть пул объектов Integer для небольших чисел, поэтому вы не получите абсолютно одинаковых результатов)

0

в то время как мы проверяем оператор ===, он будет проверять тот же тип, объект.

Здесь проблема может быть из-за создания разных объектов.