[ECMA5原文]
(https://www.ecma-international.org/ecma-262/5.1/#sec-8.12.8)
ECMA6原文
第8章类型
第9章类型转换相关
ToNumber抽象操作 ToNumber(input)
- Undefined 返回NaN
- Null 返回+0
- Boolean true是1,false是+0
- Number 不变
- String 如果input不能使用StringNumbericLiteral解析,则返回NaN
- StringNumbericLiteral包含以下合法字符
- 十六进制表示 0x HexDigit或者0X hexDigit,hexDigit包含(0123456789abcdefABCDEF)
- 有标识的整数 “+” “-“
- 指数 “e”、”E”
- 小数点 “.”
- Object 返回ToNumber(ToPrimitive(input,Number))
ToString抽象操作 ToString(input)
- Undefined 返回”undefined”
- Null 返回’null’
- Boolean 返回’true’或则’false’
- Number 如下
- NaN 返回’NaN’
- +0或者-0 返回’0’
- 如果input小于0, 返回’-‘+ToString(-input)
- 如果input是无限的,则返回’Infinity’
- 否则转实际的值为String
- Object ToString(ToPrimitve(input,String))
ToBoolean抽象操作 ToBoolean(input)
- Undefined 返回false
- Null 返回 false
- Boolean 不变
- Number +0,-0,NaN返回false,其他返回true
- String 空字符串返回false,否则返回true
- Object 返回true
ToPrimitive操作(隐式装箱)
- Undefined 不变
- Null 不变
- Boolean 不变
- Number 不变
- String 不变
- Object 通过调用内部的DefaultValue方法得到,可以传递PreferredType参数(默认是default,还有string、number),具体如下,
- 如果有toString方法,并且toString返回的是一个primitive值,则直接返回这个值
- 如果有valueOf方法,并且valueOf返回的是一个值,则直接返回这个值
- 报TypeError错误
注意根据hint值不一样,下面的toString方法和valueOf方法顺序相反,如果没有hint,则hint默认是Number,另外如果数组对象实现了自己的DefaultValue的方法,则必须保证return的是primitive值
另外注意Object可以自行定义toPrimitive方法(ES6补充),如下demo
ToNumber,ToString对对象转换时都会调用ToPrimitve抽象操作,ToBoolean不会调用,直接返回true
举个例子123456789101112131415// An object with Symbol.toPrimitive property.var obj2 = { [Symbol.toPrimitive](hint) { if (hint == 'number') { return 10; } if (hint == 'string') { return 'hello'; } return true; }};console.log(+obj2); // 10 -- hint is "number"console.log(`${obj2}`); // "hello" -- hint is "string"console.log(obj2 + ''); // "true" -- hint is "default"
ToObject抽象操作
- Undefined 返回TypeError
- Null 返回TypeError
- Boolean 创建一个Boolean对象,并设置内部属性PrimitiveValue为该值
- Number 创建一个Number对象,并设置内部属性PrimitiveValue为改值
- String 创建一个String对象,并设置内部属性PrimitiveValue为改值
- Object 不变
第11章 表达式
11.4 一元操作符delete、void、typeof、++、–、+、-、~、!
typeof操作
- Undefined 返回’undefined’
- Null 返回’object’
- Boolean 返回 ‘boolean’
- Number 返回’number’
- String 返回’string’
- Object (native and does not implement [[Call]]) 返回’object’
- Object (native or host and does implement [[Call]]) 返回’function’
- Object (host and does not implement [[Call]]) 看实现
名词解释
- native object(ECMAScript定义实现的,例如Object、Date、Math、parseInt、eval等)
- host object(宿主环境实现的,例如window、document、location、history、setTimeout)
|
|
11.5 多元操作符*、/、%
11.6 加法操作符 +、-
11.7 位操作 <<、>>、>>>
11.8 关系操作 <、>、<=、>=
11.9 相等操作 ==、!=、===、!==
抽象相等比较算法(x == y)
如果类型相等
- 如果x是undefined return true
- 如果x是null return true
- 如果是Number
- NaN != NaN
- x和y的value相等,return true
- +0 == -0
- return false
- 如果是String
- 如果x和y是一样的长度和一样的字符串,return true,否则返回false
- 如果是Boolean
- 值一样true,否则false
- 如果Oobject
- 同一个引用return true,否则返回false
x或者y分别是null和undefined,return true
- x、y分别是number和string类型,将string类型转为number类型
- x、y中有一个boolean类型,则首先将boolean转为字符串再递归执行==,ToNumber(x) == y
- 如果x是String、Number,y是object,则执行x == ToPrimitive(y)
- 反之亦然
- return false
抽象不等操作 x != y
- 使r = x==y,如果r是true返回false,否则返回true
严格相等操作 x===y
- 如果类型不等直接返回false
- 如果是Undefined、Null类型,返回true
- 如果是Number类型,如果有NaN 返回false,+0===-0,相等返回true,其他返回false
- 如果是String类型,x和y完全相等返回true,否则返回false
- 如果是Boolean,x和y一样返回true,否则返回false
- 如果是引用类型,x和y引用同一个object返回true,否则返回false
严格不相等操作 x!==y
- 同上操作后,最后执行相反操作!(x===y)