var x= 1;
Number.prototype.test = function() { return this };
x.test() === x.test() // false
Почему проверка ===
ложна?Javascript: прототип номера
var x= 1;
Number.prototype.test = function() { return this };
x.test() === x.test() // false
Почему проверка ===
ложна?Javascript: прототип номера
Потому что 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()));
@eugene: хорошее место по ошибкам синтаксиса (пропущенная закрывающая скобка в каждом блоке кода). Спасибо за редактирование :) –
Сравнение объектов всегда возвращает false? Теперь это уродливо ... Как проверить, если два объекта одинаковы? –
@Bart: хорошее место, я имел в виду, что сравнение с одинаково созданными объектами вернет false. –
Каждый раз, когда вы вызываете .test()
, создается новый экземпляр Number, это очень ожидаемое поведение, каждое бокс-решение работает таким образом. Вы можете попробовать одно и то же в C# и Java и получите абсолютно тот же результат. (Ну, у Java есть пул объектов Integer для небольших чисел, поэтому вы не получите абсолютно одинаковых результатов)
в то время как мы проверяем оператор ===
, он будет проверять тот же тип, объект.
Здесь проблема может быть из-за создания разных объектов.
Попробуйте вывести (например, через console.log или alert, не знаете свой контекст) значение, которое оно возвращает. Да, я не знаю, как это поможет, но с чего начать. –