Day 08 借箸代筹(2):自动转型、运算子及其後

自动转型

续前文所述,当我们使用两个等号(==)作比较运算时,深受JavaScript「自动转型」的干扰,结果难料。每当 == 两端值的资料型态不同时,就会发生自动转型。比如:

  • 若布林值(true或false)与数字相比较,布林值就会被「自动转型」为数字。true变成1,false变成0。
  • 若字串(如”89”)与数字(如89)相比较,字串会被「自动转型」为数字,再做「比较」。
  • 若「物件型别」(Object Type,如阵列、函式)与「基本型别」(Primitive Type,如null、undefined、number、字串、布林值、符号)相比较,前者会被「自动转型」取得後者之值,再做「比较」。
  • 若两个物件相比较,必须指向同一实体方为相等(取得true)。
  • NaN永远不等於NaN自己。

除了等号比较,自动转型的影响也及於大於(>)、小於(<)、大於等於(>=)、小於等於(<=)的比较。布林值的转型与==相同。若其中一侧不是数字,会被「自动转型」为数字。若是「字串」与「字串」相比较,会以字母顺序来决定大小。

指派运算子

人如其名,本运算子可用於值的指派,如最简单的一个等号(将右边的值指派给左边的变数)

let kageBunshin = 10 * 10;

亦可结合数学运算:

let kageBunshin += 10; //即 影分身 = 影分身+10

逗号运算子

逗号(,)可以将同一运算式下的更多式子彼此隔开,也可以将两行的宣告写成一行。如:

let Nihonium = 113;
let Flerovium = 114;

可以写为:

let Nihonium = 113, Flerovium = 114;

逻辑运算子

一般所指的逻辑判断,是指「而且」、「或者」、「并非」的二元判断,如:

  • AND(&&):当&&左右两侧的条件一样(如:值皆为true)时,则得出true,否则为false。如:
100 === 100 && 1000 === 1000 //true
  • OR(||):当||左右两侧的条件,只要有一个吻合(如:值为true)时,则得出true。两者皆非才是false。如:
100 === 100 || 1000 === 500 //true,因为左边符合
  • NOT(!):将ture转为false,反之亦然。连用!!可以判断一个值的布林值。如:
!(10 > 100) //true,因为条件是「若false时为ture」

有关&&与||在逻辑运算中的具体关系,可参考表格如下:
https://ithelp.ithome.com.tw/upload/images/20211010/20141041zFefrUiEcJ.jpg

然而,若直接以一个if条件式带入两个变数/值作判断,却未必能得到预期中的true/false结果。原因是在JavaScript中,布林值(boolean)与数值(number)不会彼此相等,没有其他语言中「true = 1」「false = 0」的性质(只经过强制转型呈现类似情状)。

易言之,JavaScript的「值」分为两种:

  • 经由强制转型(ToBoolean)後,得出false的值:Undefined、null、正负0或NaN、空字串(""或''包住的)
  • 经由强制转型(ToBoolean)後,得出ture的值:除上述false外的其他所有。

有关更进阶的资讯,建请以关键字「Truthy值」、「Falsy值」作深入研究。


<<:  Day 23 - Android 程序实作:简单的使用者进入

>>:  【後转前要多久】# Day08 CSS - CSS Reset

Day26:终於要进去新手村了-Javascript-函式-物件-建构式

今天文章会延续昨天的程序码去做建构式的学习纪录 我们先看看原本的程序码: var player=ne...

[CodeIgniter] 隐藏网址中的index.php

新手发文 Codeigniter如果不调整设定,网址中会自带index.php 为了符合MVC架构,...

Day21 类别与物件--魔术方法construct and deconstruct

类是通过class关键字来定义的,是对某个物件的定义,包含有关物件名称、方法、属性和事件,不过实际上...

D24 - 「不断线的侏罗纪」:天上好多云、地上一堆仙人掌

小恐龙跑啊跑,悠闲地看着天上的云朵飘过,但是眼前忽然出现了一株仙人掌。 天上好多云 建立云朵组件 建...

前言

在资讯科技的发展下,网页的技术之外有相当多人开始专注於「体验」与「互动」,同步带起 UI 设计、UX...