第二章 数值(上)

242 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

前言

JavsScript 不像其他的语言一样有整型、浮点型等数值类型,而只有一个总称,叫数值类型(number)

零是独一无二的。理论上来说,在一个数值系统中只应该存在一个零。然而.... 在IEEE754标准中有两个零: 0 和 -0。JavsScript让我们几乎可以忽略 -0 的存在,不过瞅瞅下面的情况

(1/0) === (1/-0) // false
Object.is(1,-1)

哇! amazing...
用它用它用它...
开玩笑,借用作者的原话

我真心建议你不要拿零做除数,也永远不要使用Object.is()

数值字面量

数值字面量本质上是一个对与该字面量真实最接近的内置number对象的引用。有的时候字面量与该值完全吻合,有的时候却会相差 9.979 201 547 673 599 058 281 863 565 184 2e+291 (哇哦! 感叹脸)。
Infinity 指那些达到无法表示的值,而不是 ∞ ; 在数学中 ∞ 并不是一个值,而是一个符号象征。
接下来就是我们的重头戏了 NaN , 它是一个特殊值,用于表示那些非数的数。NAN 是 Not a Number 的缩写,虽然它的函数是"他不是一个数",但是...typeof的结构又告诉我们NaN是一个数(number)...(这不是搞事情嘛)

NaN如何出现的?

当字符串转换成数值失败时,结果就是NaN。对头,你没看错,你真没看错,就是转换失败的时候,程序既不会抛出异常也不会直接退出,而是返回一个NaN.此外,当算是表达式中的一个值为NaN的时候,他的运算结果也会是NaN

NaN + 2  // NaN
NaN - 2  // NaN
NaN * 2  // NaN
NaN / 2  // NaN

NaN迷惑大赏

来一个问题

NaN === NaN ?

问题结果显而易见: NaN不等于他自己!这里就会有比较坑的地方了,在我目前的程序员生涯中也确实有看见同学会这样判断一些值是否为NaN

var a = NaN // 这里我们假设这个值是NaN哈!
a === NaN ? 表达式1 : 表达式2

这样总会出现不能达到预期效果的情况... 不管a是否为 NaN 都会出现在表达式2里面;因此我们判断一个值是否为NaN的时候,应该使用 Number.isNaN(value)进行判断,当然还有一个方法 Number.isFinite(value)函数会在值为 NaN 或 Infinity 或 - Infinity 返回 false

Number

Number(注意首字母大写)是可以返回number类型值的函数。number类型在JavaScript中是不可变类型。 在number类型变量前使用 typeof的时候,结果为"number",注意一点不应该在 Number函数前使用 new 这个 运算符,因为他的行为和你想象的不太一样。

const good_example = Number("1") // 1
const bad_example = new Number("1") Number {1}
typeof good_example // number
typeof bad_example // object
good_example ===  bad_example // false
ps new 运算符做了啥
function new(Con, ...args){ 
  // 创建一个空的对象 
  let obj = Object.create(null); 
  // 将空对象指向构造函数的原型链 
  Object.setPrototypeOf(obj, Con.prototype); 
  // obj绑定到构造函数上,便可以访问构造函数中的属性,即obj.Con(args) 
  let result = Con.apply(obj, args); 
  // 如果返回的result是一个对象则返回
  // new方法失效,否则返回obj 
  return result instanceof Object ? result : obj; 
}