前言
近期偶然看到 +new Date() 语法,奇怪的知识又增加了。
控制台输出一下代码
+new Date()
// 1617352224387 获取到当前的时间戳
+
运算符(数值运算符);会将表达式转换为数字。针对右侧表达式的值
进行数字转换,类似于 Number()
的转换规则, ToNumber
。返回一个新值,不会改变原始变量值。
Number()的转换规则:
String to Number
字符串转为数字
空字符串转为 0
纯数字的字符串会直接转为数字
不是纯数字的字符,转为 NaN
Array to Number
数组转为数字
空数组转为 0
存在一个元素且元素为数字(或纯数字系的字符串)时; 直接转为数字
其他情况;转为 NaN
Null to Number
转为 0
Object to Number
除数组以为的引用数据类型转为数字
如果有ToPrimitive(time) 配置,按照ToPrimitive转换,否则,结果都转为 NaN
Symbol
转为数字,会抛出错误,不支持转数字的操作
+'1' // 1
+'a1' // NaN
+0 // 0
Number('1') // 1
Number('a1') // NaN
Number(0) // 0
所以言归正传,分析一下:
以上代码分为两步:
- 由于
new
关键字得优先级高于+
运算符,所以第一步转换为
var time = new Date()
+time
time是个日期对象,根据转换规则,所以相当于:ToPrimitive(time)
根据ToPrimitive
的转换规则:time.valueOf()
,time.valueOf()
就是 原始值 得到的是个时间戳。