Если вы посмотрите на спецификацию 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?