[ JS个人笔记 ] 各种讨人厌的运算&转型案例—DAY2

特殊的数字

Infinity 系列:

Infinity + Infinity      // Infinity

-Infinity + -Infinity    // -Infinity

-Infinity + Infinity     // NaN

Infinity - Infinity      // NaN

-Infinity - -Infinity    // NaN

-Infinity - Infinity     // -Infinity

Infinity - -Infinity     // Infinity

// ------------------- 乘 除 取余 -----------------------

Infinity * Infinity       // Infinity

Infinity / Infinity       // NaN

Infinity % Infinity       // NaN

Infinity % -Infinity      // NaN

// -------------- 0 & Infinity 系列 ----------------

Infinity * 0               // NaN

Infinity / 0              // Infinity

Infinity % 0              // NaN

0 % Infinity              // 0

// -------------- 常数 & Infinity 系列 ---------------

Infinity * 100             // Infinity

Infinity / 100             // Infinity

Infinity % 100            // NaN

100 % Infinity            // 100

-------------------------------------------------

NaN 系列:

其中一个是 NaN,那麽结果就必定是 NaN

10 + NaN            // NaN

Infinity + NaN      // NaN

-Infinity + NaN     // NaN

情况简单判别

当加号 + 两侧的其中一方是字串

当加号 + 两侧的其中一方是字串的情况下,加号 + 会将两者都视为「字串」连接在一起。

10 + 'abc'          // "10abc"

true + 'abc'        // "trueabc"

"abc" + undefined   // "abcundefined"

"123" + null        // "123null"
var num1 = 10;
var num2 = 100;

var str = "10 加 100 的数字会是" + num1 + num2;

当 减(-) 乘(*) 除(/) 取余数(%) 两侧的其中一方是数字

基本型别:

若其中一方属於基本型别(string、boolean、undefined、null)且不是数字的情况,那麽 JavaScript 会在先在背後透过 Number() 尝试将数值转为「数字」,再进行运算。

  • true 转型成数字後,会变成 1
  • false 转型成数字後,会变成 0
  • null 转型成数字後,会变成 0
  • undefined 转型成数字後,会变成 NaN

当被除数为0时

  • 除数为正(+),结果为 infinity
  • 除数为负(-),结果为 -infinity
  • 除数为0,结果为NaN
100 - "50"        // 50

100 - "abc"       // NaN

100 - false       // 100

100 - true        // 99

100 - undefined   // NaN

100 - null        // 100

100 * "10"      // 1000

100 * abc       // NaN

100 * true      // 100

100 * false     // 0

100 * {}        // NaN

物件型别

- 会先透过物件的 valueOf() 方法
- 如果物件没有 valueOf() 方法的话,则是透过 toString() 先转成「字串」後,再以 Number() 尝试将数值转为「数字」後进行运算。
// 简单物件
100 - { }         // NaN

// 自订物件,透过 Object.prototype.valueOf 来指定物件的 value

function Obj(number) {
  this.num = number;
};

Obj.prototype.valueOf = function(){
  return this.num;
};

var o = new Obj(50);

// 因为 o.valueOf() 的值为 50
100 - o         // 50

奇怪的判别

两个等号 == 会自动将资料转型

true == 'true'      // false

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

[] == []      // false
[] == ![]     // true

[] == ''      // true
[] == 0       // true

[''] == ''    // true
[0] == 0      // true

[0] == ''     // false
[''] == 0     // true
null == undefined   // true

[null] == ''        // true
[null] == 0         // true

[undefined] == ''   // true
[undefined] == 0    // true

练习题

1.以下变数 a, b, c, d, e, f 它们的值、型别各自为何?

let a = 1 +"2"+ 3 ;
let b = "1" * "1";
let c = 2 - "1";
let d = 1 > 2;
let e = 2 > 1;
let f = "我好棒" - 1;

Ans:
a = '123'、String;
b = 1、Number;
c = 1、Number;
d = false、boolean;
e = true、boolean;
f = NaN、Number;

2.分别印出甚麽答案

console.log(1 + "2" + "2")
console.log(1 - "1" + "2") 
console.log("1" + "1" + "2") 
console.log("A" - "B" + "2")
console.log("A" - "B" + 2) 

Ans:122、02、112、NaN2、 NaN

3.进阶题,一元运算子


let a = 5
console.log( --a + "2" + "2") 
console.log( a-- * "2" + "2") 
console.log( --a * NaN + "2") 
console.log(Infinity / --a + "2") 
console.log(Infinity * 0 + "--a" ) 

Ans:422、102、NaN2、Infinity2、 NaN--a


<<:  [Flutter ] Free fake API 为资料库,以 FutureBuilder + http 抓取

>>:  Vue 使用 errorHandler, warnHandler 即时拦截网页错误

Gulp bower(2) DAY86

今天要来介绍 gulp 如何与 bower 结合 这里必须新增一个套件 main-bower-fil...

[Day25]solidity合约内容讲解3

先公布昨天小练习的答案: 小练习:宣告一个公开、可读不可写、名为abc的function,参数a为...

[07] telegram 回声各种讯息种类

请跟查看官方提供的文件 https://core.telegram.org/bots/api#ava...

D-11, Ruby 正规表达式(三) 字符 && Regular Expression Matching

经过两天,开始看得懂/a{3,}?/i是什麽意思了。 这是一个比较歪楼的比喻。 这是一段随意从网路上...

Day_06 无线转有线

了解完套件更新的地方後,再回来玩其他的网路架构。依照day04的架构,严格说来树梅派wifi连上的其...