JavaScript 隐式转换

下面这种写法的作用是将当前时间转换为时间戳。为什么?

var now = +new Date();

# ECMAScript 规范

# 一元 + 运算符

:将其操作数转换为 Number 类型并反转其正负。注意负的 +0 产生 -0,负的 -0产生 +0

产生式 UnaryExpression : - UnaryExpression 按照下面的过程执行 :

  1. 令 expr 为解释执行 UnaryExpression 的结果 .
  2. 令 oldValue 为 ToNumber(GetValue(expr)).
  3. 如果 oldValue is NaN ,return NaN.
  4. 返回 oldValue 取负(即,算出一个数字相同但是符号相反的值)的结果。

+new Date() 相当于 ToNumber(new Date())

# ToNumber()

ToNumber 运算符根据下表规则将参数值转换为数值类型的值

输入类型 结果
Undefined NaN
Null 0
Boolean true => 1, false => +0
Number 结果等于输入的参数(不转换)
String 参照注释
Object 1. 原始值为 ToPrimitive(输入参数,暗示数值类型)
2. 返回 ToNumber(原始值)

# ToPrimitive

ToPrimitive 运算符接受一个值,和一个可选的期望类型作参数。ToPrimitive 运算符把其值参数转换为非对象类型。如果对象可以被转换为不止一种原语类型,会转换为传入的期望类型参数。

输入类型 结果
Undefined 结果等于输入的参数(不转换)
Null 结果等于输入的参数(不转换)
Boolean 结果等于输入的参数(不转换)
Number 结果等于输入的参数(不转换)
String 结果等于输入的参数(不转换)
Object 返回该对象的默认值。对象默认值由传入的期望类型作为 hint 参数调用对象内部方法 [[DefaultValue]] 得到

ToPrimitive(obj,preferredType)

JS 引擎内部转换为原始值 ToPrimitive(obj,preferredType)函数接受两个参数,第一个 obj 为被转换的对象,第二个 preferredType 为希望转换成的类型(默认为空,接受的值为 Number 或 String)

在执行 ToPrimitive(obj,preferredType)时如果第二个参数为空并且 obj 为 Date 的事例时,此时 preferredType 会被设置为 String,其他情况下 preferredType 都会被设置为 Number 如果 preferredType 为 Number,ToPrimitive 执行过程如下:

  1. 如果 obj 为原始值,直接返回;
  2. 否则调用 obj.valueOf(),如果执行结果是原始值,返回之;
  3. 否则调用 obj.toString(),如果执行结果是原始值,返回之;
  4. 否则抛异常。

如果 preferredType 为 String,将上面的第 2 步和第 3 步调换,即:

  1. 如果 obj 为原始值,直接返回;
  2. 否则调用 obj.toString(),如果执行结果是原始值,返回之;
  3. 否则调用 obj.valueOf(),如果执行结果是原始值,返回之;
  4. 否则抛异常。
  • toString 用来返回对象的字符串表示
  • valueOf 方法返回对象的原始值,可能是字符串、数值或 bool 值等,看具体的对象。
  • 原始值指的是['Null','Undefined','String','Boolean','Number','Symbol']6 种基本数据类型之一