Javascript 基础篇五:强制类型转换(后篇)

强制类型转换基本概念和用法已经在前篇介绍完了。
后篇介绍涉及到强制类型转换常见的但又不容易引起注意的点。

一、逻辑运算符

|| (或)和 && (与)

|| 和 && 经常和条件语句混在一起使用,作为一个判断条件。但是它返回的真的是布尔值吗?如果不是,为啥子可以判断呢?

实际上, || 和 && 会对第一个操作数进行判断,如果不是布尔值,就进行 ToBoolean 操作(参照前篇)让它变成布尔值。这里就进行了第一次强制类型转换。

逻辑运算符返回的不是布尔值,而是操作数。判断完第一个操作数,就决定了返回的操作数是哪一个。

|| (都可以)运算符判断出第一个操作数,如果是 true,就说明条件已经达到,返回第一个操作数就行;反之如果是 false,说明条件没有达到,还得看看后面的那个操作数行不行,于是返回第二个操作数。

//a是true,返回a;a是false,返回b
a ? a : b

&& (缺一不可)运算符判断出第一个操作数,如果是 true,就返回第二个操作数看看。如果是 false,说明已经有一个不行了,于是直接就pass掉了,返回第一个操作数。

//a是true,返回b;a是false,返回a
a ? b : a

根据前篇介绍,返回的操作数放在了条件语句 if(…) 中,又进行了一次布尔值的隐形强制类型转换,强制转换成布尔值。

if(a && b);	//true or false

所以总结下来,这个条件语句中,逻辑运算符 || 和 && 返回的是操作数,进行了至多两次至少一次强制类型转换。

用途:

1、|| 设置函数参数默认值。

function (a) {
	a = a || "defaultValue"
}
//a为true就用a,false就用第二个,所以设置的第二操作数,就是第一操作数false的情况下的默认值。

2、&& 设置关卡(守护运算符)。

function() {
	console.log(a);
}

a && foo();	
// a为true,才可以执行后面的函数。反之false不执行后面的函数。

二、Symbol符号

符号字符串:显式可以,隐式报错。
符号数字:显式隐式都不行。
符号布尔值:显式隐式都可以。

三、宽松相等和严格相等

== 和 === 基本上大家都很熟了,区别是:一个是类型可等可不等,一个是类型必须相等。

为啥子类型可等可不等还能进行比较?

实际上,就涉及到了强制类型转换了: == 可以进行强制类型转换,而 === 不可以。

== 比较两个不同类型值:进行了隐式强制类型转换,将其中的一个或两个转化为相同类型进行比较。
== 比较两个对象时:这个时候就和 === 是一样的了,不进行强制类型转换。

== 既然涉及到强制类型转换,那么对于不同的类型到底怎么换?

1、字符串和数字比较

进行 ToNumber 操作转数字。

2、其他类型和布尔值比较

都进行 ToNumber 操作转数字。

这里就坑爹了。

var a = "42";
var b = true;
a == b;	//false

如果不强调是转为数字进行比较,都会怀疑人生!怎么了,你累了,说好的,真值(“42”)呢?吓得我都唱起来了。

原因也很明了了,因为比较之前就把双方都转成了数字。变成了:

//"42" -> 42; true -> 1
42 == 1;	//false

所以告诫广大朋友们,珍爱生命,远离布尔值宽松相等。

如果要用到其他类型和布尔值的比较,就用前面说的,类型转换加上条件语句来替代一下布尔值的宽松相等。

if(!!a) {};
if(Boolean(a)) {};
3、null和undefined比较

在 == 中 null 和 undefined 相等(与其自身也相等)。

var a = doSomething();
if(a == null) {};

只有在函数返回 null 和 undefined 时,等式才成立(假值也不行)。

这个比较可以用来进行安全处理,还是很实用的。

4、对象和非对象比较

执行 ToPrimitive 操作转换,拆封,隐式强制类型转换,最后还是要转换成数字类型。

var a = null;
var b = Object(a);
a == b;	//false

var a = undefined;
var b = Object(a);
a == b;	//false

var a = NaN;
var b = Object(a);
a == b;	//false

null 和 undefined 没有对应的封装对象,所以不能够被封装。
NaN 能够被封装为数字对象,但拆封之后 NaN == NaN 为 false。

5、其他情况

数组的 valueOf() 返回数组本身,所以在进行了 ToPrimitive 操作的情况下要注意。

[] == ![];	//true
2 == [2];	//true
" " == [null];	//true

![ ] 进行了 ToBoolean 规则,转成了布尔值 false。而 [ ] == false。所以成立。
[2] -> “2”
[null] -> " "

所以 == 两边的值实在是容易出错,碰上两边值中有 [ ]、" "、0 时尽量不使用 ==。

四、抽象关系比较

仅针对 <

1、双方调用ToPrimitive操作,结果出现非字符串,根据 ToNumber 规则强制类型转换成数字进行比较。
2、如果双方都是字符串,则按字母进行比较。
3、<= 是小于或者等于(不大于)

规范规定:a<=b 即 ! ( a > b ) 被处理为 ! ( b < a ) 所以会进行强制类型转换。

总结:

处理强制类型转换一定要小心小心再小心,不然很可能出现意想不到的结果。ღ( ´・ᴗ・` )比心

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值