概述
强制类型转换基本概念和用法已经在前篇介绍完了。
后篇介绍涉及到强制类型转换常见的但又不容易引起注意的点。
一、逻辑运算符
|| (或)和 && (与)
|| 和 && 经常和条件语句混在一起使用,作为一个判断条件。但是它返回的真的是布尔值吗?如果不是,为啥子可以判断呢?
实际上, || 和 && 会对第一个操作数进行判断,如果不是布尔值,就进行 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 ) 所以会进行强制类型转换。
总结:
处理强制类型转换一定要小心小心再小心,不然很可能出现意想不到的结果。ღ( ´・ᴗ・` )比心
最后
以上就是大方柠檬为你收集整理的Javascript 基础篇五:强制类型转换(后篇)总结:的全部内容,希望文章能够帮你解决Javascript 基础篇五:强制类型转换(后篇)总结:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复