你不知道的JavaScript之强制类型转换(上)
(一)什么是类型转换
将值从一种类型转换为另一种类型称为类型转换,这是显式的情况,而隐式的情况称为强制类型转换。也可以这样区分:类型转换发送在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时。
(二)抽象值操作
1 ToString
对基本类型值时,会创建一个封装对象,再调用toString()。
null转为"null",undefined转为"undefined",true转为"true",数字转带""。
对象:除非重写toString(),否则返回内部属性[[Class]]的值,如"[object object]"
数组:将所有单元字符串以后再用","连接。如var a=[1,2]; a.toString();//"1,2"
JSON字符串化:JSON.stringfy() 对象遇到undefined,function,symbol会忽略;数组中返回null
JSON.stringfy(function(){}); //undefined
JSON.stringfy([1,undefined,function(){},2]); //"[1,null,null,2]"
2 ToNumber
true转为1,false转为0,undefined转为NaN,null转为0。
字符串:处理失败返回NaN
对象(包含数组):先转为相应的基本类型值,返回的是非数组,则按上面规则转为数字。即先valueOf()再toString()
不同类型对象的valueOf()方法的返回值
对象 返回值
Array 返回数组对象本身。
Boolean 布尔值。
Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function 函数本身。
Number 数字值。
Object 对象本身。这是默认情况。
String 字符串值。
Math 和 Error 对象没有 valueOf 方法。
注意:通过Object.create(null)创建的对象[[Prototype]]属性为null,没有valueOf()再toString(),因此无法强制类型转换。
3 ToBoolean
假值:undefined,null,false,+0,-0,NaN,"" 除此之外 其余均为真值。
(三)显式强制类型转换
1 字符串和数字之间的转换是通过String(...)和Number(...)来实现,但前面没有new关键字,并不创建封装对象。
2 一元运算符+:获取当前时间戳
var d = +new Date(); // 强制类型转换方法
var d = new Date().getTime(); // 显示方法
var d = Date().now(); // ES5静态方法
3 ~运算符:~x大致等同于-(x+1) 所以用来判断0或者false这种临界情况比较更简洁
4 解析和转换
解析允许字符串中含有非数字字符,按从左到右顺序,遇到非数字字符就停下。而转换不允许出现非数字字符,否则失败返回NaN
var a = "42";
var b = "42px"
Number(a); // 42
parseInt(a); // 42
Number(b); // NaN
parseInt(b); // 42
5显式转换布尔值时推荐使用Boolean(a)或!!a