Почему число литералов не имеет доступа к методам Number?

Если вы посмотрите на спецификацию ECMAScript 3, вы увидите, что примитивные типы значений Null и Undefined не содержат Null и Undefined Objects.

>> Null
ReferenceError: Null is not defined

Другие примитивные типы значений Number, String и Boolean имеют сопутствующие объекты Number, String и Boolean, которые вы можете ссылаться на глобальные области.

>>Number
function Number() { [native code] }
>>Boolean
function Boolean() { [native code] }

Цель этих примитивных типов значений заключается в предоставлении таких методов, как toString и valueOf для их соответствующих примитивных типов значений:

>>var n = 1;
>>n.toString();
"1" 

совпадает с

>>var n = 1;
>>Number.prototype.toString.call(n);
"1"

Булевы и строки также работают следующим образом:

>>var b = true;
>>b.toString(); 
"true"
>>Boolean.prototype.toString.call(b);
"true"

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

>>Boolean.prototype.toString.call(n); 
TypeError: Boolean.prototype.toString is not generic
>>Number.prototype.toString.call(b)
TypeError: Number.prototype.toString is not generic

Интересно, что для типов логических и строковых литералов вы можете вызвать эти методы непосредственно из литерала:

>>true.toString();
"true"
>>Boolean.prototype.toString.call(true)
"true"
>>"moo".toString();
"moo"
>>String.prototype.toString.call("moo")
"moo"

Примитивные значения null и undefined, так как у них нет сопутствующих объектов Null и Undefined, они не могут выполнять следующие действия:

>>Null
ReferenceError: Null is not defined
>>null.toString()
TypeError: Cannot call method 'toString' of null

Номер типа примитивного значения ведет себя как сочетание двух. Вы можете вызвать toString в литерале, если вы непосредственно используете метод объекта прототипа Number:

>>Number.prototype.toString.call(1);
"1"

Но вы не можете получить доступ к методу из самого литерала, как вы можете, со строками и булерами:

>>1.toString()
SyntaxError: Unexpected token ILLEGAL

Почему числовые литералы ведут себя иначе, чем логические и строковые, хотя есть объект Number?

Ответ 1

Вы можете получить к нему доступ так же, как и другие проблемы с синтаксическим анализом, чтобы сделать это, используйте несколько иной синтаксис:

(1).toString()

Числа могут иметь десятичные числа, поэтому синтаксис для окончания в десятичном разряде является немного неоднозначным, когда вы идете на разбор кода, используйте скобки, чтобы они были действительными. Это немного яснее, когда вы видите, что это также верно:

(1.).toString()

Однако с помощью всего лишь 1.toString() он пытается разобрать число с десятичной точкой, и он терпит неудачу.

Ответ 2

Думаю, вы найдете ответ на свой вопрос в этом ответе на другой вопрос о переполнении стека. Подводя итог Theo:

[T] Парсер ожидает, что число точкой, являющейся точкой с плавающей точкой буквальный. [...] [Y] вам нужно добавить еще одну точку, чтобы она работала [.]

Ответ 3

Null (capital N) - это имя переменной. Зарезервированные слова чувствительны к регистру. null - объект null. typeof null === "object" //true