js學(xué)習(xí)手冊(cè)和es6新增知識(shí)5數(shù)值的拓展_第1頁
js學(xué)習(xí)手冊(cè)和es6新增知識(shí)5數(shù)值的拓展_第2頁
js學(xué)習(xí)手冊(cè)和es6新增知識(shí)5數(shù)值的拓展_第3頁
js學(xué)習(xí)手冊(cè)和es6新增知識(shí)5數(shù)值的拓展_第4頁
js學(xué)習(xí)手冊(cè)和es6新增知識(shí)5數(shù)值的拓展_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、二進(jìn)制和八進(jìn)制表示法ES6 提供了二進(jìn)制和八進(jìn)制數(shù)值的新的寫法,分別用前綴表示。(或)和(或)從 ES5 開始,在嚴(yán)格模式之中,八進(jìn)制就不再允許使用前綴表示,ES6 進(jìn)一步明確,要使用前綴表示。如果要將和前綴的字符串?dāng)?shù)值轉(zhuǎn)為十進(jìn)制,要使用方法。僅僅對(duì)數(shù)字的無窮大和是否是數(shù)字的拓展(對(duì)數(shù)字有效,其他的返回false)Number.isFinite(), Number.isNaN()ES6 在Number 對(duì)象上,新提供了和兩個(gè)方法,用來檢查和這兩個(gè)特殊值。Number.isFinite()用來檢查一個(gè)數(shù)值是否非無窮(infinity)。NaNInfiniteNumber.isNaN()Numbe

2、r.isFinite()Number(0b111) / 7Number(0o10) / 8Number0o0b/ 非嚴(yán)格模式(function() console.log(0o11 = 011);)() / true/ 嚴(yán)格模式(function() use strict;console.log(0o11 = 011);)() / Uncaught SyntaxError: Octal literals are not allowed in strict mode.0o00b111110111 = 503 / true0o767 = 503 / true0O0o0B0bES5 可以通過下面的代

3、碼,部署方法。用來檢查一個(gè)值是否為。ES5 通過下面的代碼,部署。(function (global) var global_isNaN = global.isNaN;Object.defineProperty(Number, isNaN, value: function isNaN(value) return typeof value = number & global_isNaN(value);,configurable: true, enumerable: false, writable: true);)(this);Number.isNaN()Number.isNaN(NaN) / t

4、rueNumber.isNaN(15) / falseNumber.isNaN(15) /falseNumber.isNaN(true) / falseNumber.isNaN(9/NaN) /trueNumber.isNaN(true/0) / trueNumber.isNaN(true/true) / trueNaNNumber.isNaN()(function (global) var global_isFinite = global.isFinite;Object.defineProperty(Number, isFinite, value: function isFinite(val

5、ue) return typeof value = number & global_isFinite(value);,configurable: true, enumerable: false, writable: true);)(this);Number.isFiniteNumber.isFinite(15); / trueNumber.isFinite(0.8); /trueNumber.isFinite(NaN); / falseNumber.isFinite(Infinity); /falseNumber.isFinite(-Infinity); / falseNumber.isFin

6、ite(foo); /falseNumber.isFinite(15); / falseNumber.isFinite(true); / false它們與傳統(tǒng)的全局方法和的區(qū)別在于,傳統(tǒng)方法先調(diào)用將非數(shù)值的值轉(zhuǎn)為數(shù)值,再進(jìn)行判斷,而這兩個(gè)新方法只對(duì)數(shù)值有效,非數(shù)值一律返回。Numbarse(), NumbarseFloat()改變:ES6 將全局方法 parse()和 parseFloat(),移植到Number 對(duì)象上面,行為完全保持不變。這樣做的目的,是逐步減少全局性方法,使得語言逐步模塊化。Numbarse = parse / trueNumbarseFloat = parseFloat

7、 /true新增 Number.iseger()判斷是否一個(gè)整數(shù)Number.iseger()用來判斷一個(gè)值是否為整數(shù)。需要注意的是,在 JavaScript 內(nèi)部,整數(shù)和浮點(diǎn)數(shù)是同樣的方法,所以 3 和 3.0 被視為同一個(gè)值。 Number.iseger(23.0)true Number.iseger(23)True/ ES5 的寫法 parse(12.34) / 12parseFloat(123.45#) / 123.45/ ES6 的寫法Numbarse(12.34) / 12NumbarseFloat(123.45#)/ 123.45isFinite(25) / trueisFini

8、te(25) / trueNumber.isFinite(25) /trueNumber.isFinite(25) / falseisNaN(NaN) / trueisNaN(NaN) /trueNumber.isNaN(NaN) / trueNumber.isNaN(NaN) / falsefalseNumber()isNaN()isFinite()trueNumber.iseger(25.1) / falseNumber.iseger(15) /ES5 可以通過下面的代碼,部署。(function (global) var floor = Math.floor,isFinite = glo

9、bal.isFinite; Object.defineProperty(Number, iseger, value: function iseger(value)return typeof value = number & isFinite(value) &value -9007199254740992 & value 9007199254740992floor(value) = value;&,configurable: true,enumerable: false,writable: true);)(this);Number.EPSILONES6 在 Number 對(duì)象上面,新增一個(gè)極小的

10、常量 Number.EPSILON。引入一個(gè)這么小的量的目的,在于為浮點(diǎn)數(shù)計(jì)算,設(shè)置一個(gè)誤差范圍。計(jì)算是不精確的。知道浮點(diǎn)數(shù)0.1 + 0.2Number.EPSILON/ 2.220446049250313e-16Number.EPSILON.toFixed(20)/ 0.00000000000000022204Number.iseger()falseNumber.iseger(true) / falseNumber.iseger(25) / trueNumber.iseger(25.0) /但是如果這個(gè)誤差能夠小于,就可以認(rèn)為得到了正確結(jié)果。因此,Number.EPSILON 的實(shí)質(zhì)是一個(gè)

11、可以接受的誤差范圍。上面的代碼為浮點(diǎn)數(shù)運(yùn)算,部署了一個(gè)誤差檢查函數(shù)。安全整數(shù)和 Number.isSafeeger()JavaScript 能夠準(zhǔn)確表示的整數(shù)范圍在-253 到 253 之間(不含兩個(gè)端點(diǎn)),超過這個(gè)范圍,無法精確表示這個(gè)值。Math.(2, 53) /07199254740992 /上面代碼中,超出 2 的 53 次方之后,一個(gè)數(shù)就不精確了。ES6 引入了Number.MAX_SAFE_EGER 和Number.MIN_SAFE_EGER 這兩個(gè)常量,用來表示這個(gè)范圍的上下限。Number.MAX_SAFE_EGER = Math.(2, 53) - 1/ trueNumbe

12、r.MAX_SAFE_EGER = 9007199254740991/ true07199254740993 / 9007199254740992Math.(2, 53) = Math.(2, 53) + 1/ truefunction withinErrorMargin (left, right) return Mabs(left - right) Number.EPSILON;withinErrorMargin(0.1 + 0.2, 0.3)/ truewithinErrorMargin(0.2 + 0.2, 0.3)/ false5.551115123125783e-17 Number.

13、EPSILON/ trueNumber.EPSILON/ 0.1 + 0.2 - 0.3/ 5.551115123125783e-175.551115123125783e-17.toFixed(20)/ 0.00000000000000005551Number.MIN_SAFE_EGER = -Number.MAX_SAFE_EGER/ trueNumber.MIN_SAFE_EGER = -9007199254740991/ true上面代碼中,可以看到 JavaScript 能夠精確表示的極限。Number.isSafeeger()則是用來判斷一個(gè)整數(shù)是否落在這個(gè)范圍之內(nèi)。Number.i

14、sSafeeger(a) / falseNumber.isSafeeger(null) /falseNumber.isSafeeger(NaN) / falseNumber.isSafeeger(Infinity)/ falseNumber.isSafeeger(-Infinity) / falseNumber.isSafeeger(3) / trueNumber.isSafeeger(1.2) /falseNumber.isSafetrueNumber.isSafeeger(9007199254740990) /eger(9007199254740992) / falseNumber.isS

15、afefalseNumber.ieger(Number.MIN_SAFE_EGER - 1) /eger(Number.MIN_SAFE_eger(Number.MAX_SAFE_ eger(Number.MAX_SAFE_EGER) /EGER) /EGER + 1) / falsetrueNumber.isSafetrueNumber.isSafe這個(gè)函數(shù)的實(shí)現(xiàn)很簡單,就是跟安全整數(shù)的兩個(gè)邊界值比較一下。Number.isSafeeger = function (n) return (typeof n = number &Math.round(n) = n &Number.MIN_SAFE

16、_EGER = n &n = Number.MAX_SAFE_EGER);實(shí)際使用這個(gè)函數(shù)時(shí),需要注意。驗(yàn)證運(yùn)算結(jié)果是否落在安全整數(shù)的范圍內(nèi),不要只驗(yàn)證運(yùn)算結(jié)果,而要同時(shí)驗(yàn)證參與運(yùn)算的每個(gè)值。Number.isSafeeger(9007199254740993)/falseNumber.isSafeeger(990)/trueNumber.isSafeeger(9007199254740993 - 990)/true9007199254740993 - 990返回結(jié)果 9007199254740002/ 正確應(yīng)該是 9007199254740003/上面代碼中,9007199254740993

17、 不是一個(gè)安全整數(shù),但是 Number.isSafeeger會(huì)返回結(jié)果,顯示計(jì)算結(jié)果是安全的。這是因?yàn)?,這個(gè)數(shù)超出了精度范圍,導(dǎo)致在計(jì)算機(jī)內(nèi)部,以的形式。9007199254740992sSafe所以,如果只驗(yàn)證運(yùn)算結(jié)果是否為安全整數(shù),很可能得到錯(cuò)誤結(jié)果。下面的函數(shù)可以同時(shí)驗(yàn)證兩個(gè)運(yùn)算數(shù)和運(yùn)算結(jié)果。function trusty (left, right, result) if (Number.isSafeeger(left) &Number.isSafeeger(right) &Number.isSafeeger(result) return result;throw new RangeEr

18、ror(Operation cannot be trusted!);trusty(9007199254740993, 990, 9007199254740993 - 990)/ RangeError: Operation cannot be trusted!trusty(1, 2, 3)/ 3Math 對(duì)象的擴(kuò)展ES6 在 Math 對(duì)象上新增了 17 個(gè)與數(shù)學(xué)相關(guān)的方法。所有這些方法都是靜態(tài)方法,只能在 Math 對(duì)象上調(diào)用。Math.trunc()方法用于去除一個(gè)數(shù)的小數(shù)部分,返回整數(shù)部分。對(duì)于非數(shù)值,方法將其先轉(zhuǎn)為數(shù)值。NumberMath.truncMath.trunc(4.1) /

19、4Math.trunc(4.9) / 4Math.trunc(-4.1) /-4Math.trunc(-4.9) / -4Math.trunc(-0.1234) / -0Math.trunc9007199254740993 = 9007199254740992/ true對(duì)于空值和無法截取整數(shù)的值,返回 NaN。對(duì)于沒有部署這個(gè)方法的環(huán)境,可以用下面的代碼模擬。Math.sign()方法用來判斷一個(gè)數(shù)到底是正數(shù)、負(fù)數(shù)、還是零。它會(huì)返回五種值。參數(shù)為正數(shù),返回+1;參數(shù)為負(fù)數(shù),返回-1;參數(shù)為 0,返回 0;參數(shù)為-0,返回-0;其他值,返回 NaN。對(duì)于沒有部署這個(gè)方法的環(huán)境,可以用下面的代碼

20、模擬。Math.sign(-5) / -1Math.sign(5) / +1Math.sign(0) / +0Math.sign(-0) /-0Math.sign(NaN) / NaNMath.sign(foo); / NaNMath.sign();/ NaNMath.signMath.trunc = Math.trunc | function(x) return x 0 ? Math.ceil(x) : Math.floor(x);Math.trunc(NaN);/ NaNMath.trunc(foo);/ NaNMath.trunc();/ NaNMath.trunc(123.456)/

21、123Math.cbrt()方法用于計(jì)算一個(gè)數(shù)的立方根。對(duì)于非數(shù)值,Math.cbrt 方法內(nèi)部也是先使用 Number 方法將其轉(zhuǎn)為數(shù)值。對(duì)于沒有部署這個(gè)方法的環(huán)境,可以用下面的代碼模擬。Math.clz32()JavaScript 的整數(shù)使用 32 位二進(jìn)制形式表示,Math.clz32 方法返回一個(gè)數(shù)的 32 位無符號(hào)整數(shù)形式有多少個(gè)前導(dǎo) 0。上面代碼中,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è)前

22、導(dǎo) 0。Math.clz32(0) / 32Math.clz32(1) / 31Math.clz32(1000) /22Math.clz32(0b00000000000000) /1Math.clz32(0b00000000000000) / 2Math.cbrt = Math.cbrt | function(x) var y = Math.(Mabs(x), 1/3);return x 0 ? 1 : -1;這個(gè)函數(shù)名就來自”count leading zero bits in 32-bit binaryrepresenions of a number“(計(jì)算 32 位整數(shù)的前導(dǎo) 0)的縮寫

23、。運(yùn)算符()與 Math.clz32 方法直接相關(guān)。對(duì)于小數(shù),Math.clz32 方法只考慮整數(shù)部分。對(duì)于空值或其他類型的值,Math.clz32 方將它們先轉(zhuǎn)為數(shù)值,然后再計(jì)算。Math.imul()Math.imul 方法返回兩個(gè)數(shù)以 32 位帶符號(hào)整數(shù)形式相乘的結(jié)果,返回的也是一個(gè) 32位的帶符號(hào)整數(shù)。如果只考慮最后 32 位,大多數(shù)情況下,Math.imul(a, b)與 a * b 的結(jié)果是相同的,即該方法等同于(a * b)|0 的效果(超過 32 位的部分溢出)。之所以需要部署這個(gè)方法,是因?yàn)?JavaScript 有精度限制,超過 2 的 53 次方的值無法精確表示。這就是說

24、,對(duì)于那些很大的數(shù)的乘法,低位數(shù)值往往都是不精確的,Math.imul 方法可以返回正確的低位數(shù)值。(0 x7f * 0 x7f)|0 / 0上面這個(gè)乘法算式,返回結(jié)果為 0。但是由于這兩個(gè)二進(jìn)制數(shù)的最低位都是 1,所以這個(gè)結(jié)果肯定是不正確的,因?yàn)楦鶕?jù)二進(jìn)制乘法,計(jì)算結(jié)果的二進(jìn)制最低位應(yīng)該也是 1。這個(gè)錯(cuò)誤就是因?yàn)樗鼈兊某朔e超過了 2 的 53 次方,JavaScript 無法保存額外的精度,就把低位的值都變成了 0。Math.imul 方法可以返回正確的值 1。Math.imul(0 x7f, 0 x7f) / 1Math.imul(2, 4)/ 8Math.imul(-1, 8) / -8

25、Math.imul(-2, -2) / 4Math.clz32() / 32Math.clz32(NaN) / 32Math.clz32(Infinity) /32Math.clz32(null) / 32Math.clz32(foo) / 32Math.clz32() /32Math.clz32() / 32Math.clz32(true) / 31Math.clz32(3.2) / 30Math.clz32(3.9) / 30Math.clz32(0) / 32Math.clz32(1) / 31Math.clz32(1 1) /30Math.clz32(1 2) / 29Math.clz

26、32(1 29) / 2clz32Math.fround()Math.fround 方法返回一個(gè)數(shù)的單精度浮點(diǎn)數(shù)形式。對(duì)于整數(shù)來說,方法返回結(jié)果不會(huì)有任何不同,區(qū)別主要是那些無法用64 個(gè)二進(jìn)制位精確表示的小數(shù)。這時(shí),Math.fround 方精度浮點(diǎn)數(shù)。返回最接近這個(gè)小數(shù)的單對(duì)于沒有部署這個(gè)方法的環(huán)境,可以用下面的代碼模擬。Math.hypot()Math.hypot 方法返回所有參數(shù)的平方和的平方根。上面代碼中,3 的平方加上 4 的平方,等于 5 的平方。如果參數(shù)不是數(shù)值,Math.hypot 方就會(huì)返回 NaN。將其轉(zhuǎn)為數(shù)值。只要有一個(gè)參數(shù)無法轉(zhuǎn)為數(shù)值,對(duì)數(shù)方法ES6 新增了 4 個(gè)對(duì)

27、數(shù)相關(guān)方法。Math.hypot(3, 4);/ 5Math.hypot(3, 4, 5);/7.0710678118654755Math.hypot();/ 0Math.hypot(NaN);/ NaNMath.hypot(3, 4, foo); / NaNMath.hypot(3, 4, 5);/7.0710678118654755Math.hypot(-3);/ 3Math.fround = Math.fround | function(x) return new Float32Array(x)0;Math.froundMath.fround(0)/ 0Math.fround(1)/ 1

28、Math.fround(1.337) /1.3370000123977661Math.fround(1.5)/ 1.5Math.fround(NaN)/ NaN(1) Math.expm1()返回 ex - 1,即。對(duì)于沒有部署這個(gè)方法的環(huán)境,可以用下面的代碼模擬。(2)Math.log1p()小于-1,方法返回的自然對(duì)數(shù),即。如果返回。對(duì)于沒有部署這個(gè)方法的環(huán)境,可以用下面的代碼模擬。(3)Math.log10()返回以 10 為底的小于 0,則返回 NaN。的對(duì)數(shù)。如果對(duì)于沒有部署這個(gè)方法的環(huán)境,可以用下面的代碼模擬。(4)Math.log2()返回以 2 為底的小于 0,則返回 NaN。的對(duì)數(shù)。如果xxMath.log2(x)Math.log10 = Math.log10 | function(x) return Math.log(x) / Math.LN10;Math.log10(2)/ 0.3010299956639812Math.log10(1)/0Math.log10(0)/ -InfinityMath.log10(-2)/NaNMath.log10(100000) / 5xxMath.log10(x)Math.log1p = Math.log1p | function(x) return Math.log(1 + x);Math.log1p(1)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論