Why does Boolean primitive not call prototype toString()?

寵の児 提交于 2019-12-04 02:03:38

Because the specifications says so. http://www.ecma-international.org/ecma-262/6.0/index.html#sec-tostring In this table the String values of primitives are defined. Only for Objects ToPrimitive is used.


The table tells us thatToString for an Object o is ToString( ToPrimitive(o, "string"))

The Specification tells us that if ToPrimitive is called with an Object we have to follow these steps:

1. If PreferredType was not passed, let hint be "default".
2. Else if PreferredType is hint String, let hint be "string".
3. Else PreferredType is hint Number, let hint be "number".
4. Let exoticToPrim be GetMethod(input, @@toPrimitive).
5. ReturnIfAbrupt(exoticToPrim).
6. If exoticToPrim is not undefined, then
  a. Let result be Call(exoticToPrim, input, «hint»).
  b. ReturnIfAbrupt(result).
  c. If Type(result) is not Object, return result.
  d. Throw a TypeError exception.
7. If hint is "default", let hint be "number".
8. Return OrdinaryToPrimitive(input,hint).

@@toPrimitive beeing set is a special case so we now have to look at OrdinaryToPrimitive

1. Assert: Type(O) is Object
2. Assert: Type(hint) is String and its value is either "string" or "number".
3. If hint is "string", then
  a. Let methodNames be «"toString", "valueOf"».
4. Else,
  a. Let methodNames be «"valueOf", "toString"».
5. For each name in methodNames in List order, do
  a. Let method be Get(O, name).
  b. ReturnIfAbrupt(method).
  c. If IsCallable(method) is true, then
    i. Let result be Call(method, O).
    ii. ReturnIfAbrupt(result).
    iii. If Type(result) is not Object, return result.
6. Throw a TypeError exception.

So this means that the return value of ToPrimitive(o, "string") is o.toString() and toString(o.toString()) is the same as o.toString().

  • "true" is a boolean.
  • A "Boolean" instance is an object, not a boolean.
  • So the instance is not obliged to use the prototype.
  • "Boolean" object is just an abstraction in js for using boolean type.

Boolean.prototype.toString=function toString(){
  return this?'1':'0';
};

var object = {
  'true':'true',
  'false':'false',
  '1':'1',
  '0':'0'
};

console.log('primitive', object[true]);
console.log('instance', object[new Boolean(true)]);
console.log('bool type:', typeof(true));
console.log('Boolean type:', typeof(new Boolean(true)));
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!