JavaScript 有许多的运算子,在这里就挑了几个比较常见,却又老是感到模糊的来研究。
这边为MDN归纳的简单范例:
// 前面为赋值运算子的范例,後方为运算子的意义
x = y // 赋值 x = y
x += y // 加法赋值 x = x + y
x -= y // 减法赋值 x = x - y
x *= y // 乘法赋值 x = x * y
x /= y // 除法赋值 x = x / y
x %= y // 余数赋值 x = x % y
x **= y // 指数赋值 x = x ** y
x &= y // 位元 AND 赋值 x = x & y
x ^= y // 位元 XOR 赋值 x = x ^ y
x |= y // 位元 OR 赋值 x = x | y
// 以下是我比较少见到的赋值运算子
x <<= y // 左移赋值 x = x << y
x >>= y // 右移赋值 x = x >> y
x >>>= y // 无号右移赋值 x = x >>> y
以上范例程序码,可以大概看出赋值运算子的规则,下面则是我自己实际操作某些运算子,看起来更浅显易懂:
// 这里是 =、+、+=、++、-- 的范例
let a = 1;
let b = 2;
a = 50;
a = a + 10;
a += 10;
// 总共是70
a += 10;
// 这里是80
a ++;
a ++;
// 这里是82
a --;
// 这里变回81
console.log(a); // a = 81
对赋值运算子试着做一点延伸,不只可以在数字上运作,譬如让数字相加、相减、赋值或是文字上都是可以执行的:
let doraemon = '无敌哆啦A梦总是照顾';
let nobita = '弱弱的大雄';
let totle = doraemon + ' ' + nobita; // 这个地方也可以预留空白
console.log(totle); // "无敌哆啦A梦总是照顾 弱弱的大雄"
比较运算子会比较运算元,然後回传比较的结果,运算元可以是数字、字串、逻辑或物件的值,假如不同型别做比较,JavaScript 也会试着帮忙转换型别,也有其他例子会使用较特殊的方式做比较,譬如使用 ===
或 !==
运算子,用较严格的方式做相等或不相等的比较。
这边帮助我自己查看,同样也简单把MDN上的简单表格,与我自己的想法大致记录一下
== // 等於,两个运算元相等就回传 true
!= // 不等於,两个运算元不相等,并且会回传 false
=== // 严格等於的比较,会比较也会看型别,但不帮忙转型,就连型别一样文字不同,也会回传 false
!== // 严格不等於的比较,与上严格等於雷同,会较严格的比较不等於的运算元
> // 大於,左方大於右方运算元,回传 true
< // 小於,左方小於右方运算元,回传 true
>= // 大於或等於,左方运算元条件大於或等於右方运算元,回传 true
<= // 小於或等於,左方运算元条件小於或等於右方运算元,回传 true
将上面实际的运行一遍,看看会有什麽样的效果。
let a = 1;
let b = 2;
console.log(a == b); // false
console.log(a != b); // true
这个范例,我用了不同的型别去查看会有什麽变化。
// 这里用了不同的型别
let c = 4;
let d = '4';
console.log(c == d); // true
可以看到不同的型别,结果仍然是 true
,原因是因为两个等於「==
」的比较运算子,在遇到不同型别的运算元,会先转为相同型别再做比较,因此结果会是 true
。
== 自动转换型别的规则:
Number()
函式将字串转为数值。valueOf()
方法,得到的结果并进行前面的方式作比较。null
与 undefined
是相等的。NaN
,则相等比较返回 false
。let c = 4;
let d = '4';
console.log(c === d); // false
console.log(c !== d); // true
而三个严格等於 ===
及严格不等於 !==
则可以看到,他们不会帮忙转型,因此呈现上面结果
逻辑运算子通常用於布林值,需要判断此条件为 true
或 false
的情况。
&& // 必须同时符合两种情况
|| // 两种条件只要符合一个,即是 true
! // 假如单一个运算元能被转换成 ture 时,回传 false,不然回传 true
// 可以被转换为 false 的运算式是 null, 0, NaN, 空字串 (""),或 未定义。
&&
语意上为「....和什麽」,故名思义必须符合两种条件才会回传 true
。举一个情境,大雄希望哆啦A梦可以给他三片以上的记忆吐司跟一杯水,这样他才要把书拿出来。
let memoryToast = 4;
let water = true;
console.log(memoryToast>=3 && water==true); // true
console.log(memoryToast==3 && water==true);
// 这边只要有一个条件不成立,就会回传 false
||
语意上为「......或什麽」,因此只要条件中有一个符合便回传 true
,同样以上面的范例改成 ||
,也会看到原本 false
的结果变成 true
。
let memoryToast = 4;
let water = true;
console.log(memoryToast==3 || water==true); // true
!
语意上为「非、不」,通常用於布林值,需要它由 true
转成 false
,或相反的时候使用。
let a = 1;
let b = 2;
console.log(!(a==1 && a<b)); // false
可以看到 a==1 && a<b
在正常情况下是 true
,但在前面加了 !
,它的布林值被反转了。
算数运算子的部分,有两个较特殊的运算子,取余数 %
和指数运算子 **
, 这两个目前在我的练习上不常见,但偶尔见到还是微错愕了一下。
**
简单来说就是某某次方的意思,但其实我不太确定什麽时候比较需要用到,但了解了解总是没有坏处,以下呈现的数值是平方出来的结果,但其实我完全不知道到底有没有算对(与数学绝缘的人)。
console.log(2 ** 4); // 16
console.log(8 ** 16); // 281474976710656
所以数学很好的大大们,你们觉得有算对吗XD
%
取余数,回传的结果为两个数值相除後的余数,第一次看见这个运算子,是我练习使用 if 取奇数或取偶数的时候,当时还真不知道可以这样用。
let thisNumber = 22;
// 除 2 取余数判断为奇数还是偶数
// 偶数余 0
// 奇数余 1
if(thisNumber % 2 == 0){
console.log("偶数")
}else{
console.log("奇数")
}
虽然到现在已经认识了很多的运算子,但其实知道仍有许多不熟悉的地方,常看到的就整理在这边了,希望以後自己回来找答案,会感到轻松又方便^__^
<<: Day-10 全部都交给它就好的懒人怀旧神器 RetroTINK
>>: Day 9 : Docker 基本操作 Container 篇
恩,标题不知道怎麽下成中文 在之前的范例里,示范了如何用coroutine做一次性的网路请求,并交结...
【前言】 先来回顾一下 Day2 Project 分析的使用者流程,今天先来做第一步的 「登入按钮...
嗨,我是 A Fei,大家周末过得如何?五倍振兴券想好怎麽花了吗?如果没有,可以给我(被揍),啊不是...
延续昨日 我们今天先把 登出的功能给搞定 不然每次都要清除session不然就是要重开== 由於我们...
接下来继续我们的基本语法,今天讲的是集合型别,集合型别常常在我们程序码里面使用,我们来看一下,有什麽...