+new Date; //1478845373322
javascript有个奇特的语法,即 构造函数没有参数时可以不用带()。
不过最好还是使用ES5中新加入的 静态方法:Date.now()。
2. ~运算符
按位运算符只适用于32位整数,运算符会强制操作数使用32位格式。这是通过抽象操作ToInt32实现的。
ToInt32 首先执行ToNumber 强制类型转换,比如“123”会先转换为123,然后再执行ToInt32。
按位运算符有6个: & 按位与 | 按位或 ^ 按位异或 ~ 取反 >> 右移 << 左移
但这严格来说并不是强制类型转换(因为返回值类型并没有发生变化),但按位运算符(例如 | 或~)和某些数字一起使用时会产生类似强制类型转换的效果,返回另外的数字。
例如 | 运算符 0|x仅执行ToInt32转换。但以下特殊字符无法以32格式呈现,因此ToInt32返回0。
0|-0;//0
0|NaN;//0
0|Infinity;//0
0|-Infinity;//0
~ 首先将值强制类型转换为32位数字,然后执行按位运算符操作“非”(对每个字符进行反转)。
另外一种说法,源自早期的计算机科学和离散数学:~返回2的补码。
~x等同于 -(x+1);
~5; //-6
3. 字位截除 ~~
~~中第一个 ~ 执行ToInt32并反转字位,然后第二个 ~ 再进行一次字位反转,将所有的字位反转为原值,最后得到的仍是ToInt32的结果。
~~只适用于32位数字,且它对负数的处理与Math.floor(...)不同。
Math.floor(-88.9); //-89
~~-88.9; //-88
~~可以将值截除为一个32位整数,x|0也可以。但最好是使用~~,出于运算符优先级的考虑。
4. 显式解析数字字符串
解析允许字符串中含有非数字字符串,从左到右解析,遇到非数字字符则停止,而转换不允许出现非数字字符,否则会失败并返回NaN。
var a="56";
var b="56px";
Number(a); //56
parseInt(a); //56
Number(b); //NaN
parseInt(b); //56
ES5之前的parseInt32(...) 有一个坑,如果没有第二个参数来指定转换的基数,它会根据字符串的第一个字符来自行决定基数。
如果第一个字符是x或者X,则转换为十六进制数字。如果是0,则转换为八进制数字。
ES5开始,parseInt32(...) 默认转换为十进制。
5. 显式转换为布尔值 Boolean(...)
一元运算符!显式的将值类型转换为布尔值,但同时会将真值转换为假值,假值转换为真值。所以显式强制类型转换为布尔值常用的做法是!!,第二个!会将结果反转为原值。
var a="0";
var b=[];
var c={};
!!a; //true
!!b; //true
!!c; //true
下面这段代码:
var a=56;
var b=a?true:false;
a 首先被强制转换为布尔值才能进行条件判断,成为“显式的隐式”。建议使用Boolean(a)和!!a来进行显式的强制类型转换。