ECMA 5规范

[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

举个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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)
1
2
3
4
console.log(typeof Function); // function
console.log(Object.constructor);
console.log(Function.constructor);
console.log(typeof Function.prototype); // Function

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)