【Day8】千算万算的运算子

运算子算是比较繁杂的部分,需要多些耐心来理解与记忆,没办法用一个简明的观念来一以贯之。

算术运算子

四则运算

四则运算也就是加减乘除,一边数字的加减乘除就像小学可本上教的一样,由左而右,先乘除後加减。

在这个部分要注意的是:

  • 不同型别的值进行四则运算的「自动转型问题」。
  • 特殊的数字如Infinity、-Infinity以及NaN进行运算时产生的特殊情形。

加号(+)

正常情况下,当+加号两边都是数字,或者都是字串的情况下:

var x = 1 + 2;
console.log(x);  //3

var y = '欧阳锋是' + '一只癞哈蟆';
console.log(y);  //欧阳锋是一只癞哈蟆

在不同型别的状况下:

  • 当加号+两侧有一个是字串的情形下,会将「非字串」的那一边「自动转型」为字串,再将两个字串连接在一起。
  • 当一边是数字,一边是undefined的时候,undefined会被试着转为数字,变成NaN,任何数字与NaN相加都是NaN。
  • 当一边是数字,加号另一边是null的时候,null会被转为数字0。
//数字与字串相加
77 + '49'         //'7749'
77 + '四十九'      //'77四十九'
//字串与字串相加
'七七' + '四十九'  //'七七四十九'

77 + {}           //'77[object object]'

//当数字要跟undefined相加的时候,udefined会被尝试转为数字,也就是NaN,还记得NaN的型别是number吗?
77 + unfined      //NaN
'七七' + unfined   //'七七undefined'

//当数字要与null相加时,null会被转成数字 0 ;
77 + null          //77
'七七' + null       //77null

还要注意一些特别的数字:Infinity、-Infinity以及NaN。

Infinity + Infinity    //Infinity
-Infinity + -Infinity  //-Infinity
Infinity + -Infinity   //NaN

NaN与任何数字相加都是NaN

77 + NaN          //NaN
Infinity + NaN    //NaN
-Infinity + NaN    //NaN
'七七' + NaN       //'七七NaN'

减号(-)

如果是一般数字的四则运算,就是我们熟悉的算法。

如果遇到数字与基本型别相减,则基本型别的值会被转为数字

49 - '36'   //13

//字串会被转为数字,也就是NaN
49 - 'abc' //NaN

//布林值的true,会被转行为数字 1
49 - true  //48
//布林值的false,会被转行为数字 0
49 - false  //49

49 - undefined  //NaN
//unll会转为数字0
49 - null       //49

如果减号的一侧是物件型别的话,则会透过物件的valueOf()转为对应的数字,如果得到NaN,那相减的结果就是NaN。

49 - {}   //NaN

乘号(*)

如果是一般数字的相乘,那就按照四则运算规则,有左而右计算。

如果其中一侧不是数字,那就按照Number()转为数字再进行计算,如果无法转为数字,则为NaN。

如果其中一个数字为NaN,那计算出来的结果也是NaN。

49 * '10'       //490
49 *  '四十九'   //NaN
49 * true       // 49
49 * false      //0
49 * {}         //NaN

除号(/)

JS的除法规则与乘法一样,但是有以下特殊情形:

  • n/0,n为正数时,结果为Infinity。
  • n/0,n为负数时,结果为-Infinity。
  • 0/0,结果为NaN。
四则运算 数字 基本型别非数字 物件
减法 正常运算 Number()方法转为数字 透过valueOf()转为数字
乘法 正常运算 Number()方法转为数字 Number()方法转为数字
除法 正常运算 Number()方法转为数字 Number()方法转为数字
加法 正常运算 如果是number、boolean透过toString()方法转为字串,null或undefined透过String()转为字串 toString()转为字串

JS四则运算规则表

算数运算子之 一元运算子

正号(+)与负号(-)

正号(+)与负号(-)用来表示一个数值是正数或是负数。

如果正号(+)与负号(-)後面跟的不是一个数字,则会透过Number()方法将之转型为数字,再由前面的正号(+)与负号(-)判断其数值。

var a = +49;
var b = -49;
var c = '+72';
var d = '-72';
var e = '天下无狗';

console.log(a);    //49
console.log(b);    //-49
console.log(+c);   //72
console.log(-c);   //-72
console.log(+d);   //-72
console.log(-d);   //72
console.log(-e)    //NaN

如果是物件型别则使用valueOf()方法求得对应的值,再用正号(+)与负号(-)来判断其数值,如果求得的值是NaN,那结果就是NaN。

递增++与递减--

当变数遇上++,表示该变数加1;如果变数遇上 - -,则代表该变数减1。

  • a = a+1可以用a++或 ++a表示。
  • a= a-1 可以用a- -或 - - a表示。

++在前面表示「运算前+1」;++在数字後面表示「运算後+1」。

—在前面代表「运算前-1」;- -在数字後方表示「运算後-1」。

var x = 49;
var y = 49;

console.log(x++);   //49
console.log(++y);   //50

console.log(x);     //50
console.log(y);     //50

将+ +放在变数x後面,console.log(x++)会传回「原始的数值」。将++放在变数x前方,console.log(++x)会回传「+1」的结果。

「+1」是在开团购吗?那我「++」。

比较运算子

比较运算子用来比较两侧的数值,比较之後得到布林值 true 或 false。

一个等号 =,我们知道是「指定、赋值」的意思。

var x = 49;

在JavaScript中,「= =」是相等的意思,而「===」是全等的意思。

var x = 49;   //数字
var y = '49'; //字串

console.log(x == y); 
//true,因为 == 在比较两侧的变数是否相等的时候,会自动帮变数转型。

true == '1';   //true
false == '0';   //true

true === '1';   //false
false === '0';  //false

使用「==」相等的时候,会自动替两侧的变数转型。

当使用「===」全等的时候,不会替变数自动转型,是比较严谨的模式,也是比较推荐使用的方法。

比较特别的是,NaN不等於NaN,不管是 == 还是===,都是一样 NaN不等於NaN。

==的自动转型规则:

  • 当遇到「字串」与「数字」做比较的时候,字串会透过Number()尝试转为数字,再进行比较。
  • 如果比较的一方为布林值,则true会转为1,false会转为0。
  • 当 ==的一侧为物件型别,另一侧为基本型别,物件型别会透过valueOf(),转为对应的基本型别进行比较。

不等於! = 与 ! ==

「! =」与「! ==」两者都是不等於,但是「! =」会替变数做自动转型,而「! ==」不会替变数自动转型,推荐使用「! ==」。


<<:  数据中台(Data Middle Office)

>>:  Day 0x7 UVa11417 GCD

<Day30>动手做 Demo App(下)

使用 room 来建立Database abstract class AppDatabase: Ro...

DAY15:玉山人工智慧挑战赛-中文手写字辨识(Pytorch 自订义资料集)

资料扩增 我们组的资料扩增这部分,因为第一次比赛,这个方法效果没有到非常好,采取的是用mask的方式...

网页选择器-30天学会HTML+CSS,制作精美网站

在写网页样式时,最重要的就是选择器的使用,写得好容易理解,修改没烦恼,也可以让网页快速呈现效果。以下...

安全策略和安全模型(Security Policies and Security Models)

.一个政策是管理层意图正式表示要纠正或影响实体的行为。安全政策是执行CIA的政策;它们是安全要求的来...

DAY24 - 现有的专案可以升级的地方(梦)

前言 今天是铁人赛的第二十四天,24、25、26这三篇都是ON档,後面的 27、28、29 已经写完...