深入js系列-类型(显式强制转换)

什么是显式

这里的显式和隐式是以普遍的标准来进行讨论的,你能看出来是怎么回事,那么它对你是“显式”,相反你不知道的话,对你就是“隐式”

抽象操作

字符串、数字、布尔值之间类型转换的基本规则 ES5定义了一些操作,诸如ToString、ToNumber、ToBoolean、ToPrimitive抽象操作

1.ToString 负责处理非字符到字符串的强制类型转换

undefined => "undefined"
null => "null"
number => "number"  极大数和极小数用指数表示
boolean => "boolean"
Symbol => "Symbol"
Object => instance.toString || Object.prototype.toString //规则由抽象操作ToPrimitive抽象操作里完成  

2.ToNumber 非数字到数字的强制类型转换

undefined => NaN
null => 0
boolean => true 1 false 0
Symbol => 无法转换,本身用途是为了解决命令冲突
string => 数字常量规则,失败为NaN,且0开头的十六进制按照十进制处理
Object => 由抽象操作ToPrimitive抽象操作,检查该值是否有valueof方法并且返回基本类型,有就对返回值进行强制转换,没有就使用toString的返回值来强制转换,两者都没有得到基本值,会产生TypeError错误,更详细的转换规则会在ToPrimitive抽象操作详解

3.ToBoolean

3.1 假值(falsy value)

undefined
null
false
+0、-0、NaN
""
假值对象 document.all

假值对象是游览器废弃对象之后,为了分辨版本将其修改为假值对象,document.all就是其中一个例子

那为什么它要是假值呢?因为我们经常通过将document.all 强制类型转换为布尔值(比如
在if 语句中)来判断浏览器是否是老版本的IE。IE 自诞生之日起就始终遵循浏览器标准,
较其他浏览器更为有力地推动了Web 的发展。
if(document.all) { /* it’s IE */ } 依然存在于许多程序中,也许会一直存在下去,这对
IE 的用户体验来说不是一件好事。
虽然我们无法彻底摆脱document.all,但为了让新版本更符合标准,IE 并不打算继续支持
if (document.all) { .. }。
“那我们应该怎么办?”
“也许可以修改JavaScript 的类型机制,将document.all 作为假值来处理!”

3.2 真值 除假值列表之外的值

显式强制类型转换

1.1字符串和数字之间的显式转换

var a = 42;
var b = String( a );

var c = "3.14";
var d = Number( c );
b; // "42"
d; // 3.14

var a = 42;
var b = a.toString(); //直接调用toString

var c = "3.14";
var d = +c; // +作为一元运算符来将操作数强制转换为数字
b; // "42"
d; // 3.14

1.2.显式解析数字字符串 这里要注意的是,解析和转换还是有明显区别,转换不允许出现非数字字符串,看下面例子

var a = "42";
var b = "42px";
Number( a ); // 42
parseInt( a ); // 42
Number( b ); // NaN
parseInt( b ); // 42

2显式转换为布尔值 非布尔值转换到布尔值的情况

// 使用Boolean(),不过不常用
var a = "0";
Boolean( a ); // true
var b = [];
Boolean( b ); // true
var c = {};
Boolean( c ); // true
var d = "";
Boolean( d ); // false
var e = 0;
Boolean( e ); // false
var f = null;
Boolean( f ); // false
var g;
Boolean( g ); // false

//更加常用的方式 !!
!!a // boolean,里面的!将非布尔值转换到布尔值并取反,加一个!对取反的结果再次取反,得到原本的布尔值
posted @ 2019-03-21 20:26  兴趣使然的Geek  阅读(410)  评论(0编辑  收藏  举报