CiSharper
@CiSharper

Почему this ведет себя по разному при сравнении с числом?

Почему при сравнении с приведением типов выводится false? В каком моменте он преобразовывает из строки в число?

Number.prototype.x = function(){ return this === 123; };
(123).x();  // return false

Number.prototype.x = function(){ return this == 123; };
(123).x();  // return true


На сервисе playcode.io вообще оба true выводит.
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Когда вы пытаетесь обратится к свойству/методу примитивного типа, он оборачивается в объект (Number, String и.т.д.), выполняется ваш метод или возвращается свойство, после чего объект удаляется. Поэтому в this у методов всегда будет ссылка на "объект обертка". Этот как
let num = new Number(123);
num === 123; // false
num == 123; // true
typeof num; // object

UPD: в строгом режиме, this внутри метода будет примитивным типом number. Почему это так, пока не знаю, не могу найти в спецификации такого. Вероятно это потому, что в строгом режиме this не преобразуется автоматически (например в не строгом режиме, с null/undefined в глобальный объект). Пример
// не строгий режим
function func() {
	console.warn(this);
}

func.call(100); // выведет [Number: 100] объект, т.е. есть преобразование

строгий
"use strict"

function func() {
	console.warn(this);
}

func.call(100); // выведет 100, примитивный number. т.е. преобразования нет


Поэтому код и работает в вашей песочнице, т.к. там строгий режим включен по умолчанию.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mosesfender
@mosesfender
Меланхолик, параноик, падал с коек
Очевидно, в первом случае typeof this != 'number'.
Number.prototype.x = function(){ return Number(this) === 123; };
(123).x();  // return true
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы