这边用这篇文章来做总结一下
会用一些範例帮大家複习观念
範例一
var a = 1;var b = new Number(1);console.log(a == b); // trueconsole.log(a === b); // false
可以看到在 宽鬆相等 的时候型别会自己转换,所以 建构式建构出来的 包裹物件 数字 1 是等同于 原始型别 的数字 1。
但 严格相等 的比较状况下,就会将 建构式建构出来的 包裹物件 视为是物件,型别不相等因而回传 false的结果。
範例二
console.log(1 || 0); // 1
使用逻辑运算子 ||
会回传经过判断为第一个为 truthy 的值,就回传第一个值,否则就回传第二个。
这边依照这个概念判断,1 为 truthy 就直接回传 1 。
範例三
var a = 1;var b = 2;var c = 0;console.log(a && b && c); // 0
使用逻辑运算子 &&
为二元运算子,一次只会处理左右两个运算元,且其相依性为 左到右。
又,&&
会判断第一个值为 falsy 会直接回传,不然就回传第二个的值,所以~ 这边 a = 1 是 truthy, 他就直接回传 b = 2。
接着表达式就变成 2 && 0 ,这时候一样 2 是 truthy ,所以直接回传 的结果。
如果上面的逻辑没问题的话,再看看一样用範例三的範例来进行说明:
console.log(c || c && c || a);
这边同时有 &&
以及 ||
这两个逻辑运算子,在优先度来说,&&
比 ||
还高,所以会先执行 c && c
,并且回传结果为 0。 之后才进行 c || 0
的判断结果, 因为第一个 c 是 falsy,所以回传第二个值。
之后 0 || a
,很明显 0 就是 falsy,所以回传 a 的值,也就是 1。
console.log(c || 0 || a);console.log(0 || a);console.log(a); // 1
好,依照上面的逻辑,我们再来看一下这个练习题,也是延续範例三的变数设定喔
console.log(a && b || c && a);
这边直接公布答案是 2。
大家可以自己推演看看喔。
範例四
var a = 1 + 1 === 1;console.log(a); // false
这题很明显就是在考优先序的部分,因为 +
的优先序大于 ===
,所以自然 2 === 1
会回传 false。
範例五
console.log(1000 < 10000 < 10); // true
这边就是考大家相依性的问题 <
的相依性是从左到右,并且是二元运算子。
所以她的比对流程会是
1000 < 10000 回传 truetrue < 10 型别转换Number(true) => 回传 11 < 10 // tureconsole.log(true);
所以结果就是true。
範例六
var a = '1';var b = 2;var c = (a > b) ? a * b : sum(a, b);function sum (a, b) { return a + b;}console.log(c); // '12'
这边的逻辑首先先从 (a > b)
这个判断开始看,在比对的时候虽然 a 是字串 1 ,但会被转型为 数字 1,接着 1 > 2 会回传 false,所以会执行 sum(a, b)。
而这个sum又会回传依照传入的 a , b进行处理。
又因为 字串'1' + 数字2 => 会转型为字串'12'。
所以最后印出来的结果就是 '12'。
这个篇文章就用这六个範例帮大家複习第三章学习到的观念跟知识,没有问题的话就可以往下进行噜~汪汪