全面認(rèn)識JavaScript的Number對象

全面認(rèn)識JavaScript的Number對象

首先一個是對JavaScript中Number的理解:JavaScript中函數(shù)是一等公民,寫在代碼中的 Array/Object/String/Number/Function等等其實(shí)都是一個構(gòu)造函數(shù),是用來生成相應(yīng)的數(shù)據(jù)類型的變量的。


JavaScript的Number對象是經(jīng)過封裝的能讓你處理數(shù)字值的對象。Number對象由Number()構(gòu)造器創(chuàng)建。

語法:

  new Number(value);

  // 參數(shù)
  value // 被創(chuàng)建對象的數(shù)字值

Number對象主要用于:
  • 如果參數(shù)無法被轉(zhuǎn)換為數(shù)字,則返回NaN
  • 在非構(gòu)造器上下文中(如:沒有new操作符),Number能被用來執(zhí)行類型轉(zhuǎn)換。

========== 屬性 ==========

Number.EPSILON屬性表示1與Number可表示的大于1的最小浮點(diǎn)數(shù)之間的差值。
屬性的屬性特性
writable false
enumerable false
configurable false

EPSILON屬性的值接近于2.2204460492503130808472633361816E-16,或者 2^-52。

示例:

  let x = 0.2;
  let y = 0.3;
  let z = 0.1;

  console.log(Math.abs(x - y + z) < Number.EPSILON); // true

  console.log(Math.abs(x - y + z)); // 2.7755575615628914e-17
  console.log(Number.EPSILON); // 2.220446049250313e-16

Number.MAX_SAFE_INTEGER/Number.MIN_SAFE_INTEGER代表在JavaScript中最大/最小的安全的integer型數(shù)字(2^53 - 1/-(2^53 - 1))
屬性的屬性特性
writable false
enumerable false
configurable false

MAX_SAFE_INTEGER的值是9007199254740991,形成這個數(shù)字的原因是JavaScript在IEEE 754中使用double-precision floating-point format numbers(不懂)作為規(guī)定。在這個規(guī)定中能安全的表示數(shù)字的范圍在-(2^53 - 1)2^53 - 1之間。

這里安全存儲的意思是指能夠準(zhǔn)確區(qū)分兩個不相同的值,例如 Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 將得到 true的結(jié)果,而這在數(shù)學(xué)上是錯誤的

Number.MAX_VALUE/Number.MIN_VALUE表示在JavaScript里所能表示的最大/最小數(shù)值。
屬性的屬性特性
writable false
enumerable false
configurable false

MAX_VALUE屬性值接近于1.79E+308。大于MAX_VALUE的值代表'Infinity'。

Number.NEGATIVE_INFINITY/Number.POSITIVE_INFINITY屬性表示負(fù)無窮大/正無窮大。
屬性的屬性特性
writable false
enumerable false
configurable false

Number.NEGATIVE_INFINITY的值和全局對象Infinity屬性的負(fù)值相同。

該值的行為同數(shù)學(xué)上的無窮大(infinity)有一點(diǎn)兒不同:
  • 任何正值,包括POSITIVE_INFINITY,乘以NEGATIVE_INFINITY都為NEGATIVE_INFINITY
  • 任何正值,包括POSITIVE_INFINITY,乘以POSITIVE_INFINITY都為POSITIVE_INFINITY。
  • 任何負(fù)值,包括NEGATIVE_INFINITY,乘以NEGATIVE_INFINITY都為POSITIVE_INFINITY
  • 任何負(fù)值,包括NEGATIVE_INFINITY,乘以POSITIVE_INFINITY都為NEGATIVE_INFINITY
  • 0 乘以 NEGATIVE_INFINITY/POSITIVE_INFINITYNaN
  • NaN 乘以 NEGATIVE_INFINITY/POSITIVE_INFINITYNaN
  • NEGATIVE_INFINITY除以任何負(fù)值(除了NEGATIVE_INFINITY)為POSITIVE_INFINITY
  • POSITIVE_INFINITY除以NEGATIVE_INFINITY以外的任何負(fù)值為NEGATIVE_INFINITY
  • NEGATIVE_INFINITY除以任何正值(除了POSITIVE_INFINITY)為NEGATIVE_INFINITY
  • POSITIVE_INFINITY除以POSITIVE_INFINITY以外的任何正值為POSITIVE_INFINITY
  • NEGATIVE_INFINITY除以NEGATIVE_INFINITYPOSITIVE_INFINITYNaN
  • POSITIVE_INFINITY除以NEGATIVE_INFINITYPOSITIVE_INFINITYNaN
  • 任何數(shù)除以NEGATIVE_INFINITY/POSITIVE_INFINITY為 0
Number.NaN表示“非數(shù)字”。和NaN相同。
屬性的屬性特性
writable false
enumerable false
configurable false
示例:

  console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
  console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
  console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2) // true
  console.log(Number.MAX_SAFE_INTEGER + 1); // 9007199254740992
  console.log(Number.MAX_SAFE_INTEGER + 2); // 9007199254740992 , 加不上去了

  console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
  console.log(Number.MIN_VALUE); // 5e-324
  console.log(Number.MAX_VALUE === Number.MAX_VALUE + 1); // true
  console.log(Number.MAX_VALUE + 1); //  1.7976931348623157e+308 ,再加也不會更大
  console.log(Infinity); // Infinity
  console.log(Number.MAX_VALUE < Infinity); // true

  console.log(Number.POSITIVE_INFINITY); // Infinity
  console.log(Number.NEGATIVE_INFINITY); // -Infinity
  console.log(Number.POSITIVE_INFINITY === Infinity); // true

  console.log(Number.NaN); // NaN
  console.log(NaN); // NaN
  console.log(Number.NaN === Number.NaN); // false
  console.log(Number.NaN === NaN); // false, NaN不等于任何值,包括自身
  console.log(Object.is(Number.NaN, NaN)); // true

Number.prototype屬性表示Number構(gòu)造函數(shù)的原型
屬性的屬性特性
writable false
enumerable false
configurable false

所有Number實(shí)例都繼承自Number.prototype。

========== 方法 ==========

根據(jù)個人的理解,將方法進(jìn)行分類

值類型判斷類:isNaN/isFinite/isInteger/isSafeInteger

1.Number.isNaN()確定傳遞的值是否為NaN和其類型是Number。它是原始的全局isNaN的強(qiáng)大的版本。
語法:

  Number.isNaN(value);

  // 參數(shù)
  value // 要被檢測是否是NaN的值

  // 返回值:一個布爾值,表示給定的值是否是NaN

附:全局的isNaN()函數(shù)用來確定一個值是否為NaN。
語法:

  isNaN(testValue);

  // 參數(shù)
  testValue // 要被檢測的值

  // 返回值:如果給定值為NaN則返回值為true;否則為false

為什么要專門出一個方法判斷是否是NaN:與JavaScript中其他的值不同,NaN不能通過相等操作符(== 和 ===)來判斷,NaN === NaN 和 NaN == NaN都返回false。
NaN值如何產(chǎn)生:
  • 當(dāng)算數(shù)運(yùn)算返回一個未定義的或無法表示的值時(shí),NaN就產(chǎn)生了。
  • 將某些不能強(qiáng)制轉(zhuǎn)換為數(shù)值的非數(shù)值轉(zhuǎn)換為數(shù)值的時(shí)候,也會得到NaN。
  • 0除以0會返回NaN,但是其他數(shù)除以0則不會返回NaN。

全局isNaN()的怪異行為:如果isNaN函數(shù)的參數(shù)不是Number,isNaN函數(shù)會首先嘗試將這個參數(shù)轉(zhuǎn)換為數(shù)值,然后才會對轉(zhuǎn)換后的結(jié)果是否是NaN進(jìn)行判斷。因此,對于能被強(qiáng)制轉(zhuǎn)換為有效的非NaN數(shù)值來說(空字符串和布爾值分別會被強(qiáng)制轉(zhuǎn)換為數(shù)值0和1),進(jìn)而會返回false。這讓人感到怪異,因?yàn)榭兆址黠@不是數(shù)值。這起源于“不是數(shù)值”在基于IEEE-754數(shù)值的浮點(diǎn)計(jì)算體質(zhì)中代表了一種特定的含義。isNaN函數(shù)其實(shí)等同于回答了一個問題:被測試的值在被強(qiáng)制轉(zhuǎn)換成數(shù)值時(shí),會不會返回IEEE-754中所謂的“不是數(shù)值”。

因此,通過Number.isNaN()來檢測是否是一個NaN是一種更可靠的方法。也可通過表達(dá)式(x != x)來檢測變量x是否是NaN。

Number.isNaN()和isNaN()相比,前者不會強(qiáng)制將參數(shù)轉(zhuǎn)換成數(shù)字,只有在參數(shù)是真正的數(shù)字類型,且值為NaN的時(shí)候才會返回true。

Polyfill

  var isNaN = function(value) {
    let n = Number(value); // 先轉(zhuǎn)換為Number
    return n != n; // 利用NaN不等于自身進(jìn)行判斷
  }

  Number.isNaN = Number.isNaN || function(value) {
    //非Number類型直接返回false
    return typeof value === 'Number' && isNaN(value); 
  }

示例:
  
  console.log(isNaN(NaN)); // true
  console.log(Number.isNaN(NaN)); // true

  console.log(isNaN(37)); // false
  console.log(Number.isNaN(37)); // false

  console.log(Number.isNaN('37')); // false
  console.log(isNaN('37')); // false

  console.log(Number.isNaN(undefined)); // false
  console.log(isNaN(undefined)); // true
  console.log(Number(undefined)); // NaN

  console.log(Number.isNaN({})); // false
  console.log(isNaN({})); // true
  console.log(Number({})); // NaN

  console.log(Number.isNaN('37,5')); // false
  console.log(isNaN('37,5')); // true
  console.log(Number('37,5')); // NaN

  console.log(Number.isNaN('123ABC')); // false
  console.log(isNaN('123ABC')); // true
  console.log(Number('123ABC')); // NaN

  console.log(Number.isNaN(new Date().toString())); // false
  console.log(isNaN(new Date().toString())); // true
  console.log(Number(new Date().toString())); // NaN

  console.log(Number.isNaN(true)); // false
  console.log(isNaN(true)); // false
  console.log(Number(true)); // 1

  console.log(Number.isNaN(null)); // false
  console.log(isNaN(null)); // false
  console.log(Number(null)); // 0

  console.log(Number.isNaN('')); // false
  console.log(isNaN('')); // false
  console.log(Number('')); // 0

  console.log(Number.isNaN(' ')); // false
  console.log(isNaN(' ')); // false
  console.log(Number(' ')); // 0

  console.log(Number.isNaN(new Date())) // false
  console.log(isNaN(new Date())); // false
  console.log(Number(new Date())); // 1558496426074

個人總結(jié):只要不是NaN任何值放入Number.isNaN()都會返回false。對于isNaN()能被Number()轉(zhuǎn)換成數(shù)字的或本身就是數(shù)字返回false,不能轉(zhuǎn)為數(shù)字的會返回true。(即:如果忽略掉能被轉(zhuǎn)成數(shù)字的字符串,所有數(shù)字對于isNaN()都返回false,非數(shù)字都返回true)

2.Number.isFinite()用來檢測傳入的參數(shù)是否是一個有窮數(shù)。
語法:

  Number.isFinite(value);

  // 參數(shù)
  value // 要被檢測有窮性的值。

  // 返回值:一個布爾值表示給定的值是否是一個有窮數(shù)

附:全局的isFinite()函數(shù)用來判斷被傳入的參數(shù)值是否是一個有限數(shù)值。在必要情況下,參數(shù)會首先轉(zhuǎn)為一個數(shù)值。
語法:

  isFinite(testValue);

  // 參數(shù)
  testValue // 用來檢測有限性的值。

  // isFinite 方法檢測它參數(shù)的數(shù)值。如果參數(shù)是 NaN,正無窮大或者負(fù)無窮大,會返回false,其他返回 true。

Number.isFinite()和全局的isFinite()相比,不會強(qiáng)制將一個非數(shù)值的參數(shù)轉(zhuǎn)換成數(shù)值,這就意味著,只有數(shù)值類型的值,且是有窮的,才返回true。

Polyfill

  Number.isFinite = Number.isFinite || function(value) {
    return typeof value === 'number' && isFinite(value);
  }

示例:

  console.log(Number.isFinite(Infinity)); // false
  console.log(isFinite(Infinity)); // false

  console.log(Number.isFinite(NaN)); // false
  console.log(isFinite(NaN)); // false

  console.log(Number.isFinite(2e64)); // true
  console.log(isFinite(2e64)); // true

  console.log(Number.isFinite('0')); // false
  console.log(isFinite('0')); // true

  console.log(Number.isFinite(undefined)); // false
  console.log(isFinite(undefined)); // false
  console.log(Number(undefined)); // NaN

  console.log(Number.isFinite(null)); // false
  console.log(isFinite(null)); // true
  console.log(Number(null)); // 0

個人總結(jié):只有為Number的值且是有限的時(shí)候Numebr.isFinite()會返回true。而isFinite()在參數(shù)經(jīng)過Number轉(zhuǎn)換后再判斷是否是有限的。正無窮、負(fù)無窮和NaN都不是有限數(shù)字。

3.Number.isInteger()用來判斷給定的參數(shù)是否為整數(shù)。
語法:

  Number.isInteger(value);

  // 返回值:判斷給定的值是否是整數(shù)的Boolean值。如果被檢測的值是整數(shù),則返回 true,否則返回 false。注意 NaN 和正負(fù) Infinity 不是整數(shù)。

示例:

  console.log(Number.isInteger(0)); // true
  console.log(Number.isInteger(-0)); // true
  console.log(Number.isInteger(0.1)); // false
  console.log(Number.isInteger(Math.PI)); // false
  console.log(Number.isInteger(Infinity)); // false
  console.log(Number.isInteger(-Infinity)); // false
  console.log(Number.isInteger(NaN)); // false
  console.log(Number.isInteger('10')); // false
  console.log(Number.isInteger(true)); // false
  console.log(Number.isInteger(false)); // false
  console.log(Number.isInteger([1])); // false

個人總結(jié):只有是Number類型的值并且是整數(shù)才會返回true,Infinity和NaN都不是整數(shù)。

Polyfill

  Number.isInteger = Number.isInteger || function(value) {
    return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
  }

4.Number.isSafeInteger()用來判斷傳入的參數(shù)是否是一個“安全整數(shù)”

比如:2^53-1是一個安全整數(shù),它能被精確表示,在任何IEEE-754舍入模式下,沒有其他整數(shù)舍入結(jié)果為該整數(shù)。作為對比,2^53就不是一個安全整數(shù),它能夠使用IEEE-754表示,但是2^53+1不能使用IEEE-757直接表示,在就近舍入和向零舍入中,會被舍入為2^53。

安全整數(shù)范圍為-(2^53-1)2^53-1之間的整數(shù),包含-(2^53-1)2^53-1

語法:

  Number.isSafeInteger(testValue);

  // 返回值:一個布爾值表示給定的值是否是一個安全整數(shù)

示例:

  console.log(Number.isSafeInteger(3)); // true
  console.log(Number.isSafeInteger(Math.pow(2,53))); // false
  console.log(Number.isSafeInteger(Math.pow(2,53)-1)); // true
  console.log(Number.isSafeInteger(NaN)); // false
  console.log(Number.isSafeInteger(Infinity)); // false
  console.log(Number.isSafeInteger('3')); // false
  console.log(Number.isSafeInteger(3.1)); // false
  console.log(Number.isSafeInteger(3.0)); // true

Polyfill

  Number.isSafeInteger = Number.isSafeInteger || function(value) {
    return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
  }


類型轉(zhuǎn)換類:parseFloat/parseInt

1.Number.parseInt()方法依據(jù)指定基數(shù)[參數(shù)radix的值],把字符串[參數(shù)string的值]解析成整數(shù)。
語法:

  Number.parseInt(string[, radix]);

Number.parseInt()與parseInt()函數(shù)是同一個函數(shù):Number.parseInt === parseInt;// true
附:parseInt()函數(shù)解析一個字符串參數(shù),并返回一個指定基數(shù)的整數(shù)。
語法:

  parseInt(string, radix);

  // 參數(shù) 
  string // 要被解析的值。如果參數(shù)不是一個字符串,則將其轉(zhuǎn)換為字符串。字符串開頭的空白符將會被忽略。
  radix // 一個介于2和36之間的整數(shù),表示上述字符串的基數(shù)。比如參數(shù)'10'表示使用我們通常使用的十進(jìn)制數(shù)值系統(tǒng)。始終指定此參數(shù)可以取消閱讀該代碼時(shí)的困惑并且保證轉(zhuǎn)換結(jié)果可預(yù)測。當(dāng)未指定基數(shù)時(shí),不同的實(shí)現(xiàn)會產(chǎn)生不同的結(jié)果,通常將默認(rèn)值認(rèn)為10。

  // 返回值:返回解析后的整數(shù)值。如果被解析的第一個字符無法被轉(zhuǎn)化成數(shù)值類型,則返回NaN
  
  // 注: radix參數(shù)為n將會把第一個參數(shù)看作是一個數(shù)的n進(jìn)制表示,而返回的值則是十進(jìn)制的。

一些數(shù)中可能包含e字符,使用parseInt去截取包含e字符數(shù)值部分會造成難以預(yù)料的結(jié)果。


  console.log(parseInt('6.022e23', 10)); // 6
  console.log(parseInt(6.022e23, 10)); // 6

如果parseInt遇到了不屬于radix參數(shù)所指定的基數(shù)中的字符那么該字符和其后的字符都將被忽略。接著返回已經(jīng)解析的整數(shù)部分。parseInt將截取整數(shù)部分。開頭和結(jié)尾的空白符允許存在,會被忽略。


  console.log(parseInt('F', 16)); // 15
  console.log(parseInt('FXX123', 16)); // 15,X和X之后的字符被省略
  console.log(parseInt('15 * 3', 10)); // 15
  console.log(parseInt(1123, 2)); // 3

在基數(shù)為undefined,或者基數(shù)為0或者沒有指定的情況下,JavaScript作如下處理:

  • 如果字符串string以'0x'或者'0X'開頭,則基數(shù)是16(16進(jìn)制)
  • 如果字符串string以'0'開頭,基數(shù)是8(八進(jìn)制)或者10(十進(jìn)制),那么具體是哪個基數(shù)由實(shí)現(xiàn)環(huán)境決定。ECMAScript 5規(guī)定使用10,但是并不是所有瀏覽器都遵循這個規(guī)定。因此,永遠(yuǎn)都要給出明確的radix參數(shù)值。
  • 如果字符串string以其他任何值開頭,則基數(shù)是10(十進(jìn)制)

  console.log(parseInt('012')); // 12 
  console.log(parseInt('012', 8)); // 10 
  console.log(parseInt('08')); // 8
  console.log(parseInt('08', 8)); // 0
  console.log(parseInt('0xF')); // 15
  console.log(parseInt('F', 16)); // 15

  // 可見chrome瀏覽器認(rèn)為0開頭的基數(shù)是10

如果一個字符不能被轉(zhuǎn)換成數(shù)字,parseInt返回NaN。 算數(shù)上NaN不是任何一個進(jìn)制下的數(shù)。


  console.log(parseInt('Hello', 8)); // NaN
  console.log(parseInt('546', 2)); // NaN
  console.log(parseInt('-F', 16)); // -15
  console.log(parseInt('  -0F', 16)); // -15
  console.log(parseInt('  -0xF  ', 16)); // -15
  console.log(parseInt('-15e01', 10)); // -15

  console.log(parseInt(4.9, 10)); // 4
  console.log(parseInt(4.7 * 1e22, 10)); // 4 非常大的數(shù)值變成4
  console.log(parseInt(0.00000000000000434, 10)); // 4 非常小的數(shù)值變成4
  console.log(parseInt(0.0000000000000034, 10)); // 3 非常小的數(shù)值變成3
  console.log(parseInt(0.04, 10)); // 0

一個更嚴(yán)格的解析函數(shù):MDN上的一個方法,但是感覺和parseInt差別很大,這個方法指示找出數(shù)字然后顯示,和進(jìn)制也沒有太大關(guān)系。


  let filterInt = function(value) {
    if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value)){
      return Number(value);
    } else {
      return NaN;
    }
  };

2.Number.parseFloat()可以把一個字符串解析成浮點(diǎn)數(shù)。該方法和全局parseFloat()函數(shù)相同,并且處于ECMAScript 6 規(guī)范中。
附:parseFloat()函數(shù)解析一個字符串參數(shù)并返回一個浮點(diǎn)數(shù)。
語法:

  parseFloat(value);

  // 參數(shù)
  value // 需要被解析成為浮點(diǎn)數(shù)的值

  // 返回值:給定值被解析成浮點(diǎn)數(shù),如果給定值不能被轉(zhuǎn)換成數(shù)值,則返回NaN

parseFloat將它的字符串參數(shù)解析成為浮點(diǎn)數(shù)并返回.如果在解析過程中遇到了正負(fù)號(+或-),數(shù)字(0-9),小數(shù)點(diǎn),或者科學(xué)記數(shù)法中的指數(shù)(e或E)以外的字符,則它會忽略該字符以及之后的所有字符,返回當(dāng)前已經(jīng)解析到的浮點(diǎn)數(shù).同時(shí)參數(shù)字符串首位的空白符會被忽略。

如果參數(shù)字符串的第一個字符不能被解析成為數(shù)字,則parseFloat返回NaN。


  console.log(parseFloat('3.14')) // 3.14
  console.log(parseFloat('3.14.15')) // 3.14
  console.log(parseFloat('314e-2')) // 3.14
  console.log(parseFloat('314e-2e-1')) // 3.14
  console.log(parseFloat('0.0314E+2')) // 3.14
  console.log(parseFloat('0.0314E+2E+1')) // 3.14
  console.log(parseFloat('3.14more non-digit characters')) // 3.14
  console.log(parseFloat('FF2')); // NaN

更嚴(yán)格的轉(zhuǎn)換函數(shù):


  let filterFloat = function(value) {
    if(/^(\-|\+)?|(\.\d+)(\d+(\.\d+)?|(\d+\.)|Infinity)$/
      .test(value)){
      return Number(value);
    } else {
      return NaN;
    }
  }
  console.log(filterFloat('3.14')) // 3.14
  console.log(filterFloat('3.14.15')) // NaN
  console.log(filterFloat('314e-2')) // 3.14
  console.log(filterFloat('314e-2e-1')) // NaN
  console.log(filterFloat('0.0314E+2')) // 3.14
  console.log(filterFloat('0.0314E+2E+1')) // NaN
  console.log(filterFloat('3.14more non-digit characters')); // NaN

========== 實(shí)例屬性 =========

Number.prototype.constructor 返回創(chuàng)建該實(shí)例對象的構(gòu)造函數(shù),默認(rèn)為Number對象

========= 實(shí)例方法 ==========

所有Number實(shí)例都繼承自Number.prototype。被修改的 Number 構(gòu)造器的原型對象對全部 Number 實(shí)例都生效。

修改表示形式類: toExponential/toFixed/toPrecision

1.toFixed()方法使用定點(diǎn)表示法來格式化一個數(shù)。

語法:

  numObj.toFixed(digits);

  // 參數(shù)
  digits // 小數(shù)點(diǎn)后數(shù)字的個數(shù);介于0 到 20(包括)之間,實(shí)現(xiàn)環(huán)境可能支持更大范圍。如果忽略該參數(shù),則默認(rèn)為0。

  // 返回值:所給數(shù)值的定點(diǎn)數(shù)表示法的字符串形式

  // 拋出異常
  rangeError // 如果 digits 參數(shù)太小或太大。0 到 20(包括)之間的值不會引起 RangeError。實(shí)現(xiàn)環(huán)境(implementations)也可以支持更大或更小的值。

  TypeError // 如果該方法在一個非Number類型的對象上調(diào)用。

一個數(shù)值的字符串表現(xiàn)形式,不使用指數(shù)計(jì)數(shù)法,而是在小數(shù)點(diǎn)后有digits位數(shù)字。該數(shù)值在必要時(shí)進(jìn)行四舍五入,另外在必要時(shí)會用0來填充小數(shù)部分,以便小數(shù)部分有指定的位數(shù)。如果數(shù)值大于1e+21,該方法會簡單調(diào)用Number.prototype.toString()并返回一個指數(shù)計(jì)數(shù)法格式的字符串。


  let numObj = 12345.6789;

  console.log(numObj.toFixed()); // '12346'
  console.log(numObj.toFixed(1)); // '12345.7'
  console.log(numObj.toFixed(6)); // '12345.678900'

  console.log((1.23e+20).toFixed(2)); // '123000000000000000000.00'
  console.log((1.23e+22).toFixed(2)); // '1.23e+22' 大于1e+21會返回指數(shù)計(jì)數(shù)法
  console.log((1.23e-10).toFixed(2)); // '0.0'

  console.log(2.34.toFixed(1)); // '2.3'
  console.log(-2.34.toFixed(1)); // -2.3 由于操作符優(yōu)先級,負(fù)數(shù)不會返回字符串
  console.log((-2.34).toFixed(1)); // '-2.3' 若用括號提高優(yōu)先級,則返回字符串

2.toExponential() 以指數(shù)表示法返回該數(shù)值字符串表示形式。
語法:

  numObj.toExponential(fractionDigits);

  // 參數(shù)
  fractionDigits // 可選。一個整數(shù),用來指定小數(shù)點(diǎn)后有幾位數(shù)字。默認(rèn)情況下用盡可能多的位數(shù)來顯示數(shù)字

  // 返回值:一個用冪的形式來表示Number對象的字符串

  // 異常
  RangeError // 如果 fractionDigits 太小或太大將會拋出該錯誤。介于 0 和 20(包括20)之間的值不會引起 RangeError 。 執(zhí)行環(huán)境也可以支持更大或更小范圍。

  TypeError // 如果該方法在一個非數(shù)值類型對象上調(diào)用。

對數(shù)值字面量使用toExponential()方法,且該數(shù)值沒有小數(shù)點(diǎn)和指數(shù)時(shí),應(yīng)該在該數(shù)值與該方法之間隔開一個空格,以避免點(diǎn)號被解釋為一個小數(shù)點(diǎn)。也可以使用兩個點(diǎn)號調(diào)用該方法。

如果一個數(shù)值的小數(shù)位數(shù)多于fractionDigits參數(shù)所提供的,則該數(shù)值將會在fractionDigits指定的小數(shù)位數(shù)處四舍五入(四舍五入規(guī)則參考toFixed方法的描述)。


  let numObj = 12345.6789;

  console.log(numObj.toExponential()); // '1.23456789e+4'
  console.log(numObj.toExponential(1)); // '1.2e+4'
  console.log(numObj.toExponential(10)); // '1.2345678900e+4'

  console.log( 77.toExponential()); // Uncaught SyntaxError: Invalid or unexpected token
  console.log( 77 .toExponential()); // 7.7e+1
  console.log( 77..toExponential()); // 7.7e+1

3.toPrecision()以指定的精度返回?cái)?shù)值對象的字符串表示。
語法:

  numObj.toPrecision(precision);

  // 參數(shù)
  precision // 可選。一個用來指定有效數(shù)個數(shù)的整數(shù)。

  // 返回值:以定點(diǎn)表示法或指數(shù)表示法表示的一個數(shù)值對象的字符串表示,四舍五入到precision參數(shù)指定的顯示數(shù)字位數(shù)(四舍五入規(guī)則參考toFixed里方法的描述)
  
  // 如果忽略 precision 參數(shù),則該方法表現(xiàn)類似于 Number.prototype.toString()。如果該參數(shù)是一個非整數(shù)值,將會向下舍入到最接近的整數(shù)。
   
  // 異常 rangeError
  // 如果 precison 參數(shù)不在 1 和 100 (包括)之間,將會拋出一個 RangeError 。執(zhí)行環(huán)境也可以支持更大或更小的范圍。ECMA-262 只需要最多 21 位顯示數(shù)字。

示例:

  let numObj = 12345.6789;

  console.log(numObj.toPrecision()); // 12345.6789
  console.log(numObj.toPrecision(5)); // 12346
  console.log(numObj.toPrecision(10)); // 12345.67890
  console.log(numObj.toPrecision(1)); // 1e+4


公有方法: toString/toLocaleString/valueOf

1.toString()返回指定Number對象的字符串表示形式。
語法:

  numObj.toString([radix]);

  radix // 指定要用于數(shù)字到字符串的轉(zhuǎn)換的基數(shù)(從2到36)。如果未指定radix參數(shù),則默認(rèn)值為10。

  // 異常信息
  RangeError // 如果 toString() 的 radix 參數(shù)不在 2 到 36 之間,將會拋出一個 RangeError。

Number覆蓋了Object對象上的toString()方法,它不是繼承的Object.prototype.toString()。

如果對象是負(fù)數(shù),則會保留負(fù)號。即使radix是2時(shí)也是如此:返回的字符串包含一個負(fù)號(-)前綴和正數(shù)的二進(jìn)制表示,不是數(shù)值的二進(jìn)制補(bǔ)碼。


  let count = 10;

  console.log(count.toString()); // 10
  console.log(17.toString()); // Uncaught SyntaxError: Invalid or unexpected token
  console.log(17 .toString()); // 17
  console.log((17).toString()); // 17
  console.log(17.2.toString()); // 17.2

  console.log(254 .toString(16)); // fe
  console.log(-10 .toString(2)); // -1010

  // 還是要注意點(diǎn)號的意義

2.toLocaleString()方法涉及到字符編碼,隨后學(xué)習(xí): Number.prototype.toLocaleString

3.valueOf()返回一個被Number對象包裝的原始值。
語法:

  numObj.valueOf();

  // 返回值: 表示指定Number對象的原始值的數(shù)字

示例:

  let numObj = new Number(10);
  console.log(typeof numObj); // object

  let num = numObj.valueOf();
  console.log(num); // 10
  console.log(typeof num); // number

  console.log(10 .valueOf()); // 10
  console.log(typeof 10 .valueOf()); // number


參考文檔:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評論 2 378

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