Почему, когда я выполняю этот оператор JavaScript, который создает новый объект Number (используя новый оператор), результат отличается в Chrome и FireFox?

Я новичок в JavaScript, и у меня есть следующие сомнения: я провожу эксперимент с концепцией встроенного конструктора функций.

Итак, я пытаюсь создать новый объект Number, используя оператор new.

Если я открою Инструменты разработчика Chrome и в Консоли выполню это действие:

var a = new Number(3);
undefined
a;
Number {[[PrimitiveValue]]: 3}

как видите, сначала я создаю новый объект Number с помощью оператора new, а затем запускаю этот объект и получаю его значение: Number {[[PrimitiveValue] ]: 3

Проблема в том, что если я делаю то же самое в FireBug внутри FireFox, я получаю что-то другое, я получаю это:

var a = new Number(3);
undefined
a;
Number {}

Итак, используя FireFox, делая то же самое, создается впечатление, что создается объект Число, но этот объект пуст и не содержит 3. > как в Chrome.

Почему? Как это возможно? Что мне не хватает?

Еще одно сомнение связано с тем, как именно работает предыдущее создание объекта, когда я выполняю:

var a = new Number(3);

Хорошо, я использую концепцию конструкции функции, связанную с оператором new. Из того, что я знаю (но поправьте меня, если я делаю неправильное утверждение), когда я выполняю функцию с использованием оператора new, происходит следующее:

  1. Создается новый пустой объект. Таким образом, в этом случае создается новый объект Number, который должен означать объект JavaScript, в котором переменная proto установлена ​​на ссылку Number. объект, поэтому этот объект будет иметь доступ ко всем методам, определенным для Number (в соответствии с прототипом концепции наследования, реализованной в JavaScript).

  2. Переменная this, помещенная в контекст выполнения этой функции, устанавливается на ссылку на новый созданный объект.

  3. Параметр используется для установки свойства объекта. Таким образом, в этом случае значение будет 3.

Почему, когда я делаю:

var a = new Number(3);

Я получаю значение undefined? Это может быть связано с тем, что эта функция Number не возвращает никакого значения?

Правильно ли я рассуждаю или я что-то упускаю?


person AndreaNobili    schedule 31.12.2015    source источник
comment
Лучший способ понять это — взглянуть на спецификацию JavaScript для типа Number. Я не читал его некоторое время, но, насколько я понимаю, при реализации таких примитивных типов было немного места для интерпретации. Просто имейте в виду, что существует разница в концепции более высокого уровня примитивных типов, являющихся экземплярами объекта, и фактической реализации.   -  person nbering    schedule 31.12.2015
comment
Потому что не делай этого. В JavaScript вам не нужно использовать конструктор Number. Просто объявите var a = 3; и все готово.   -  person Robusto    schedule 31.12.2015


Ответы (2)


так как Niet уже по-разному отвечал на разные реализации консолей.

Эта часть вашего утверждения неверна

Создается новый пустой объект. Таким образом, в этом случае создается новый объект Number, который должен означать объект JavaScript, в котором переменная proto установлена ​​​​в ссылку на объект Number, поэтому этот объект будет иметь доступ ко всем методам, определенным для Number.

__proto__(нестандартный) будет установлен на Number.prototype, а не на Number.

person Ramanlfc    schedule 31.12.2015
comment
Хорошо, потому что Number.prototype что именно содержит? все методы, которые число может использовать? - person AndreaNobili; 31.12.2015
comment
Number.prototype — это фактический объект, ваш объект наследует свойства от . все методы вроде toFixed() исходят из этого - person Ramanlfc; 31.12.2015
comment
Я понимаю, что мой объект наследуется от Number.prototype. Но почему из нее, а не из номера? Что содержит? - person AndreaNobili; 31.12.2015
comment
Number - это просто функция (сама по себе объект), она использует prototype (не __proto__) для установки __proto__ ссылки объекта при создании объектов. прочитайте эту замечательную статью: pixelstech.net/article/ - person Ramanlfc; 31.12.2015

Способ представления объектов в консоли зависит от реализации. Хотя Chrome показывает числовое значение, это не имеет ничего общего с самим объектом, а скорее с тем, как Chrome выдает его обратно.

Вы заметите, что a.valueOf() вернет 3 в обоих случаях.

Кроме того, IE отображает: [object Number] {}

person Niet the Dark Absol    schedule 31.12.2015