JavaScript Day 2. 关於,运算子们

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

== 自动转换型别的规则:

  • 如果其中一个是布林值(Boolean),在比较之前会先把他改成数值(Number)。
  • 如果其中一个是字串,另一个是数值,会通过 Number() 函式将字串转为数值。
  • 如果是物件,另一个不是,就会呼叫物件的 valueOf() 方法,得到的结果并进行前面的方式作比较。
  • nullundefined 是相等的。
  • 如果其中一个值是 NaN,则相等比较返回 false
  • 如果都是物件,则比较是不是指向同一个物件。
let c = 4;
let d = '4';
console.log(c === d); // false
console.log(c !== d); // true

而三个严格等於 === 及严格不等於 !== 则可以看到,他们不会帮忙转型,因此呈现上面结果

逻辑运算子

逻辑运算子通常用於布林值,需要判断此条件为 truefalse 的情况。

&& // 必须同时符合两种情况
|| // 两种条件只要符合一个,即是 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 篇

day19 Kotlin coroutine flow with liveData in MVVM

恩,标题不知道怎麽下成中文 在之前的范例里,示范了如何用coroutine做一次性的网路请求,并交结...

Day 7【钱包登入区 - Login Button】Kitten or Ice Cream?

【前言】 先来回顾一下 Day2 Project 分析的使用者流程,今天先来做第一步的 「登入按钮...

轻松排序!sort 的延伸用法,Ruby 30 天刷题修行篇第十一话

嗨,我是 A Fei,大家周末过得如何?五倍振兴券想好怎麽花了吗?如果没有,可以给我(被揍),啊不是...

Day15vue.js网站登出

延续昨日 我们今天先把 登出的功能给搞定 不然每次都要清除session不然就是要重开== 由於我们...

Day 4 Swift语法-基础篇(2/5)-Collection Types

接下来继续我们的基本语法,今天讲的是集合型别,集合型别常常在我们程序码里面使用,我们来看一下,有什麽...