數(shù)值擴(kuò)展

Number.isFinite(), Number.isNaN()

  • ES6在Number對象上阐枣,提供了Number.isFinite()和Number.isNaN()兩個(gè)方法神僵。

Number.isFinite()

  • Number.isFinite()用來檢查一個(gè)數(shù)值是否為有限的,即不是Infinity(無限)

  • 如果參數(shù)類型不是數(shù)值居暖,Number.isFinite()一律返回false

    Number.isFinite(15); // true
    Number.isFinite(0.8); // true
    Number.isFinite(NaN); // false
    Number.isFinite(Infinity); // false
    Number.isFinite(-Infinity); // false
    Number.isFinite('foo'); // false
    Number.isFinite('15'); // false
    Number.isFinite(true); // false

Number.isNaN()

  • Number.isNaN()用來檢查一個(gè)值是否為NaN究驴。

  • 如果參數(shù)類型不是數(shù)值,Number.isFinite一律返回false惰蜜。

    Number.isNaN(NaN) // true
    Number.isNaN(15) // false
    Number.isNaN('15') // false
    Number.isNaN(true) // false
    Number.isNaN(9/NaN) // true
    Number.isNaN('true' / 0) // true
    Number.isNaN('true' / 'true') // true

Number.isNaN()钮蛛,Number.isFinite()與isNaN(),isFinite()區(qū)別:

  • 傳統(tǒng)方法先調(diào)用Number()將非數(shù)值的值轉(zhuǎn)為數(shù)值剖膳,再進(jìn)行判斷魏颓,而這兩個(gè)新方法只對數(shù)值有效

    isFinite("25") // true
    Number.isFinite("25") // false
    isNaN("NaN") // true
    Number.isNaN("NaN") // false

Number.parseInt(), Number.parseFloat()

  • 效果跟ES5一樣 只是為了減少全局的方法

    // ES5的寫法
    parseInt('12.34') // 12
    parseFloat('123.45#') // 123.45

    // ES6的寫法
    Number.parseInt('12.34') // 12
    Number.parseFloat('123.45#') // 123.45
    Number.parseFloat('ASD123') // NaN

Number.isInteger()

  • 用來判斷一個(gè)數(shù)值是否為整數(shù)。

    Number.isInteger(25) // true
    Number.isInteger(25.0) // true
    Number.isInteger() // false
    Number.isInteger(null) // false
    Number.isInteger('15') // false
    Number.isInteger(true) // false

    注:Number.isInteger(3.0000000000000002) // true JS值精度最多可以達(dá)到 53 個(gè)二進(jìn)制位(1 個(gè)隱藏位與 52 個(gè)有效位)吱晒。如果數(shù)值的精度超過這個(gè)限度甸饱,第54位及后面的位就會(huì)被丟棄 (通俗點(diǎn)就是小數(shù)點(diǎn)后15位會(huì)丟棄)

Number.EPSILON()

  • EPSILON是ES6新增一個(gè)極小的常量Number.EPSILON。根據(jù)規(guī)格仑濒,它表示 1 與大于 1 的最小浮點(diǎn)數(shù)之間的差叹话。

    Number.EPSILON === Math.pow(2, -52)
    // true
    Number.EPSILON
    // 2.220446049250313e-16
    Number.EPSILON.toFixed(20)
    // "0.00000000000000022204"

  • Number.EPSILON實(shí)際上是 JavaScript 能夠表示的最小精度。誤差如果小于這個(gè)值墩瞳,就可以認(rèn)為已經(jīng)沒有意義了驼壶,即不存在誤差了。引入一個(gè)這么小的量的目的喉酌,在于為浮點(diǎn)數(shù)計(jì)算热凹,設(shè)置一個(gè)誤差范圍泵喘。我們知道浮點(diǎn)數(shù)計(jì)算是不精確的。

    0.1 + 0.2 // 0.30000000000000004
    0.1 + 0.2 - 0.3 // 5.551115123125783e-17
    0.1 + 0.2 === 0.3 // false

Number.EPSILON可以用來設(shè)置“能夠接受的誤差范圍”般妙。比如纪铺,誤差范圍設(shè)為 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果兩個(gè)浮點(diǎn)數(shù)的差小于這個(gè)值碟渺,我們就認(rèn)為這兩個(gè)浮點(diǎn)數(shù)相等鲜锚。

function withinErrorMargin (left, right) {
  return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}

0.1 + 0.2 === 0.3 // false
withinErrorMargin(0.1 + 0.2, 0.3) // true

1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true

Math 對象的擴(kuò)展

Math.trunc()

  • Math.trunc方法用于去除一個(gè)數(shù)的小數(shù)部分,返回整數(shù)部分苫拍。

    Math.trunc(4.1) // 4
    Math.trunc(4.9) // 4
    Math.trunc(-4.1) // -4
    Math.trunc(-4.9) // -4
    Math.trunc(-0.1234) // -0

  • 對于非數(shù)值芜繁,Math.trunc內(nèi)部使用Number方法將其先轉(zhuǎn)為數(shù)值。

    Math.trunc('123.456') // 123
    Math.trunc(true) //1
    Math.trunc(false) // 0
    Math.trunc(null) // 0

  • 對于空值和無法截取整數(shù)的值怯疤,返回NaN浆洗。

    Math.trunc(NaN); // NaN
    Math.trunc('foo'); // NaN
    Math.trunc(); // NaN
    Math.trunc(undefined) // NaN

Math.sign

  • Math.sign方法用來判斷一個(gè)數(shù)到底是正數(shù)、負(fù)數(shù)集峦、還是零伏社。對于非數(shù)值,會(huì)先將其轉(zhuǎn)換為數(shù)值
  1. 參數(shù)為正數(shù)塔淤,返回+1摘昌;

  2. 參數(shù)為負(fù)數(shù),返回-1高蜂;

  3. 參數(shù)為 0聪黎,返回0;

  4. 參數(shù)為-0备恤,返回-0;

  5. 其他值稿饰,返回NaN。

    Math.sign(-5) // -1
    Math.sign(5) // +1
    Math.sign(0) // +0
    Math.sign(-0) // -0
    Math.sign(NaN) // NaN
    Math.sign('') // 0
    Math.sign(true) // +1
    Math.sign(false) // 0
    Math.sign(null) // 0
    Math.sign(undefined) // NaN

Math.cbrt()

  • Math.cbrt方法用于計(jì)算一個(gè)數(shù)的立方根露泊。

    Math.cbrt(-1) // -1
    Math.cbrt(0) // 0
    Math.cbrt(1) // 1
    Math.cbrt(2) // 1.2599210498948734
    Math.cbrt('hello') // NaN
    Math.cbrt('8') // 2

Math.clz32()

  • JavaScript 的整數(shù)使用 32 位二進(jìn)制形式表示喉镰,Math.clz32方法返回一個(gè)數(shù)的 32 位無符號整數(shù)形式有多少個(gè)前導(dǎo) 0。

    Math.clz32(0) // 32
    Math.clz32(1) // 31
    Math.clz32(1000) // 22
    Math.clz32(0b01000000000000000000000000000000) // 1
    Math.clz32(0b00100000000000000000000000000000) // 2

上面代碼中惭笑,0 的二進(jìn)制形式全為 0侣姆,所以有 32 個(gè)前導(dǎo) 0;1 的二進(jìn)制形式是0b1沉噩,只占 1 位捺宗,所以 32 位之中有 31 個(gè)前導(dǎo) 0;1000 的二進(jìn)制形式是0b1111101000川蒙,一共有 10 位蚜厉,所以 32 位之中有 22 個(gè)前導(dǎo) 0。

Math.clz32(3.2) // 30
Math.clz32(3.9) // 30
Math.clz32() // 32
Math.clz32(NaN) // 32
Math.clz32(Infinity) // 32
Math.clz32(null) // 32
Math.clz32('foo') // 32
Math.clz32([]) // 32
Math.clz32({}) // 32
Math.clz32(true) // 31

對于小數(shù)畜眨,Math.clz32方法只考慮整數(shù)部分弯囊。而對于空值或其他類型的值痰哨,會(huì)將它們先轉(zhuǎn)為數(shù)值,然后再計(jì)算匾嘱。

Math.imul()

  • Math.imul方法返回兩個(gè)數(shù)以 32 位帶符號整數(shù)形式相乘的結(jié)果斤斧,返回的也是一個(gè) 32 位的帶符號整數(shù)。

    Math.imul(2, 4) // 8
    Math.imul(-1, 8) // -8
    Math.imul(-2, -2) // 4

如果只考慮最后 32 位霎烙,大多數(shù)情況下撬讽,Math.imul(a, b)與a * b的結(jié)果是相同的,即該方法等同于(a * b)|0的效果(超過 32 位的部分溢出)悬垃。之所以需要部署這個(gè)方法游昼,是因?yàn)?JavaScript 有精度限制,超過 2 的 53 次方的值無法精確表示尝蠕。這就是說烘豌,對于那些很大的數(shù)的乘法,低位數(shù)值往往都是不精確的看彼,Math.imul方法可以返回正確的低位數(shù)值廊佩。

Math.fround()

  • Math.fround方法的主要作用,是將64位雙精度浮點(diǎn)數(shù)轉(zhuǎn)為32位單精度浮點(diǎn)數(shù)靖榕。如果小數(shù)的精度超過24個(gè)二進(jìn)制位标锄,返回值就會(huì)不同于原值,否則返回值不變(即與64位雙精度值一致)茁计。

    Math.fround(1.125) // 1.125
    Math.fround(7.25) // 7.25

    // 丟失精度
    Math.fround(0.3) // 0.30000001192092896
    Math.fround(0.7) // 0.699999988079071
    Math.fround(1.0000000123) // 1

  • 對于 NaN 和 Infinity料皇,此方法返回原值。對于其它類型的非數(shù)值星压,Math.fround 方法會(huì)先將其轉(zhuǎn)為數(shù)值践剂,再返回單精度浮點(diǎn)數(shù)。

    Math.fround(NaN) // NaN
    Math.fround(Infinity) // Infinity

    Math.fround('5') // 5
    Math.fround(true) // 1
    Math.fround(null) // 0
    Math.fround([]) // 0
    Math.fround({}) // NaN

Math.hypot()

  • Math.hypot方法返回所有參數(shù)的平方和的平方根娜膘。

  • 如果參數(shù)不是數(shù)值舷手,Math.hypot方法會(huì)將其轉(zhuǎn)為數(shù)值。只要有一個(gè)參數(shù)無法轉(zhuǎn)為數(shù)值劲绪,就會(huì)返回 NaN。

    Math.hypot(3, 4); // 5
    Math.hypot(3, 4, 5); // 7.0710678118654755
    Math.hypot(); // 0
    Math.hypot(NaN); // NaN
    Math.hypot(3, 4, 'foo'); // NaN
    Math.hypot(3, 4, '5'); // 7.0710678118654755
    Math.hypot(-3); // 3

對數(shù)方法

Math.expm1()

  • Math.expm1(x)返回 ex - 1盆赤,即Math.exp(x) - 1贾富。 (Math.exp()求e的指數(shù)幾次冪的值)

    Math.expm1(-1) // -0.6321205588285577
    Math.expm1(0) // 0
    Math.expm1(1) // 1.718281828459045

Math.log1p()

  • Math.log1p(x)方法返回1 + x的自然對數(shù),即Math.log(1 + x)牺六。如果x小于-1颤枪,返回NaN。 (1+x的 e的對數(shù))

    Math.log1p(1) // 0.6931471805599453
    Math.log1p(0) // 0
    Math.log1p(-1) // -Infinity
    Math.log1p(-2) // NaN

Math.log10()

  • Math.log10(x)返回以 10 為底的x的對數(shù)淑际。如果x小于 0畏纲,則返回 NaN

    Math.log10(2) // 0.3010299956639812
    Math.log10(1) // 0
    Math.log10(0) // -Infinity
    Math.log10(-2) // NaN
    Math.log10(100000) // 5

Math.log2()

  • Math.log2(x)返回以 2 為底的x的對數(shù)扇住。如果x小于 0,則返回 NaN盗胀。

    Math.log2(3) // 1.584962500721156
    Math.log2(2) // 1
    Math.log2(1) // 0
    Math.log2(0) // -Infinity
    Math.log2(-2) // NaN
    Math.log2(1024) // 10
    Math.log2(1 << 29) // 29

指數(shù)運(yùn)算符

  • ES2016 新增了一個(gè)指數(shù)運(yùn)算符**

  • 這個(gè)運(yùn)算符的一個(gè)特點(diǎn)是右結(jié)合艘蹋,而不是常見的左結(jié)合。多個(gè)指數(shù)運(yùn)算符連用時(shí)票灰,是從最右邊開始計(jì)算的女阀。

    2 ** 2 // 4
    2 ** 3 // 8
    // 相當(dāng)于 2 ** (3 ** 2)
    2 ** 3 ** 2

  • 指數(shù)運(yùn)算符可以與等號結(jié)合,形成一個(gè)新的賦值運(yùn)算符**=屑迂。

    let a = 1.5;
    a **= 2;
    // 等同于 a = a * a;

    let b = 4;
    b **= 3;
    // 等同于 b = b * b * b;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浸策,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惹盼,更是在濱河造成了極大的恐慌庸汗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件手报,死亡現(xiàn)場離奇詭異蚯舱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昧诱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門晓淀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盏档,你說我怎么就攤上這事凶掰。” “怎么了蜈亩?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵懦窘,是天一觀的道長。 經(jīng)常有香客問我稚配,道長畅涂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任道川,我火速辦了婚禮午衰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冒萄。我一直安慰自己臊岸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布尊流。 她就那樣靜靜地躺著帅戒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崖技。 梳的紋絲不亂的頭發(fā)上逻住,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天钟哥,我揣著相機(jī)與錄音,去河邊找鬼瞎访。 笑死腻贰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的装诡。 我是一名探鬼主播银受,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸦采!你這毒婦竟也來了宾巍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渔伯,失蹤者是張志新(化名)和其女友劉穎顶霞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锣吼,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡选浑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玄叠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片古徒。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖读恃,靈堂內(nèi)的尸體忽然破棺而出隧膘,到底是詐尸還是另有隱情,我是刑警寧澤寺惫,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布疹吃,位于F島的核電站,受9級特大地震影響西雀,放射性物質(zhì)發(fā)生泄漏萨驶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一艇肴、第九天 我趴在偏房一處隱蔽的房頂上張望腔呜。 院中可真熱鬧,春花似錦再悼、人聲如沸核畴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锰镀,卻和暖如春娘侍,著一層夾襖步出監(jiān)牢的瞬間咖刃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工憾筏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嚎杨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓氧腰,卻偏偏與公主長得像枫浙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子古拴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 二進(jìn)制和八進(jìn)制表示法 ES6 提供了二進(jìn)制和八進(jìn)制數(shù)值的新的寫法箩帚,分別用前綴0b(或0B)和0o(或0O)...
    焦邁奇閱讀 349評論 0 0
  • 1.二進(jìn)制和八進(jìn)制表示法 ES6 分別用 0b(0B) 和 0o(0O)表示二進(jìn)制和八進(jìn)制 使用Number方法,...
    falcon_li閱讀 523評論 0 0
  • 數(shù)值處理新增特征 1黄痪、新增方法關(guān)于數(shù)學(xué)處理紧帕,比如立方根、指數(shù)把原來全局的桅打、處理數(shù)值相關(guān)的方法是嗜,都調(diào)整到number...
    尤樊容閱讀 198評論 0 1
  • ES6對數(shù)值的擴(kuò)展,說是擴(kuò)展挺尾,但是更像是對ES5中的數(shù)值的一個(gè)方法的添加和補(bǔ)充鹅搪,其變化遠(yuǎn)沒有字符串的擴(kuò)展變化...
    我家的貓子在哪里閱讀 304評論 0 0
  • 01 我問元元掂僵,你男朋友是小狼狗系的還是小奶狗系的航厚? 元元想了想說,我覺得他可能是金魚系的吧锰蓬? 見我不解幔睬,元元解釋...
    漫漫Chen閱讀 4,574評論 14 77