特殊的数字
Infinity 系列:
Infinity + Infinity // Infinity-Infinity + -Infinity // -Infinity-Infinity + Infinity // NaNInfinity - Infinity // NaN-Infinity - -Infinity // NaN-Infinity - Infinity // -InfinityInfinity - -Infinity // Infinity// ------------------- 乘 除 取余 -----------------------Infinity * Infinity // InfinityInfinity / Infinity // NaNInfinity % Infinity // NaNInfinity % -Infinity // NaN// -------------- 0 & Infinity 系列 ----------------Infinity * 0 // NaNInfinity / 0 // InfinityInfinity % 0 // NaN0 % Infinity // 0// -------------- 常数 & Infinity 系列 ---------------Infinity * 100 // InfinityInfinity / 100 // InfinityInfinity % 100 // NaN100 % Infinity // 100-------------------------------------------------
NaN 系列:
其中一个是 NaN,那么结果就必定是 NaN
10 + NaN // NaNInfinity + 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 转型成数字后,会变成 1false 转型成数字后,会变成 0null 转型成数字后,会变成 0undefined 转型成数字后,会变成 NaN当被除数为0时
除数为正(+),结果为 infinity除数为负(-),结果为 -infinity除数为0,结果为NaN100 - "50" // 50100 - "abc" // NaN100 - false // 100100 - true // 99100 - undefined // NaN100 - null // 100100 * "10" // 1000100 * abc // NaN100 * true // 100100 * false // 0100 * {} // NaN
物件型别
- 会先透过物件的 valueOf() 方法- 如果物件没有 valueOf() 方法的话,则是透过 toString() 先转成「字串」后,再以 Number() 尝试将数值转为「数字」后进行运算。
// 简单物件100 - { } // NaN// 自订物件,透过 Object.prototype.valueOf 来指定物件的 valuefunction Obj(number) { this.num = number;};Obj.prototype.valueOf = function(){ return this.num;};var o = new Obj(50);// 因为 o.valueOf() 的值为 50100 - o // 50
奇怪的判别
两个等号 == 会自动将资料转型
true == 'true' // falsefalse == 'false' // falsefalse == 0 // truetrue == 1 // true[] == [] // false[] == ![] // true[] == '' // true[] == 0 // true[''] == '' // true[0] == 0 // true[0] == '' // false[''] == 0 // truenull == 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 = 5console.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