zoukankan      html  css  js  c++  java
  • 《深入理解JavaScript》—— 数字

    (1) 一个数字的字面量可以是整型、浮点型和十六进制(整型)。

    (2) 其中指数eX,是10的x次方的缩写。例如:

    5e2  // 500
    5e-2  // 0.05

    (3) 转换为数字

    结果
    undefined NaN
    null 0
    布尔值 false转换成0,true转换成1
    数字 保持不变
    字符串 解析字符串中的数字(忽略开头和结尾的空格),空字符串转换成0
    对象 调用ToPrimitive(value,number)并转换生成的原始类型

    全局函数parseFloat()提供了一种将值转换为数字的方法。

    将str转换成字符串,去掉开头的空格,然后解析最长的浮点数字形式的前缀。如果没有这样的前缀,则返回NaN。

    (4) 比较parseFloat()和Number()方法:

    ●  对非字符串使用parseFloat()的效率低,因为在解析之前会将参数强制转换成字符串。因此,许多被Number()转换成数字的值转换成了NaN。

    parseFloat( true );  // NaN
    Number( true );  // 1

    ●  parseFloat()方法会将空字符串解析成NaN

    ●  parseFloat()会一直解析到最后一个合法字符,这意味着最后得到的可能不是我们想要的结果:

    parseFloat( '123.65#' );  // 123.65#
    Number( '123.65#' );  // NaN

    ●  parseFloat()会忽略开头的空格,并在非法的字符(包括空格)前停止,而Number()会忽略开头和结尾的空格(但其他非法的字符都会导致解析成NaN)

    parseFloat( '	v
    12.34
    ' );  // 12.34
    Number( '	v
    12.34
    ' ); // NaN

    (5) 特殊的数字值

    ① NaN

    NaN是唯一一个和自身不相等的值:

    console.log ( NaN === NaN );  // false

    如果要检查一个值是否为NaN,那么可以调用全局函数isNaN():

    isNaN(NaN); // true
    isNaN(33); // false

    但是这里有个问题,isNaN对非数字不起作用,因为它首先是将这些值转换成数字。转换可能生成NaN,然后函数错误的返回true。

    console.log ( isNaN('xyz') );  // true

    因此最好的办法是将isNaN和类型检查结合起来:

    function checkNaN( value ) {
        return typeof value === 'number' && isNaN (value);
    }

    或者是检查这个值和它本身不相等(因为NaN是唯一有这样特征的值):

    function checkNaN( value ) {
        return typeof value !== value;
    }

    最后一点:NaN和任何值作比较,包括它自身都是不相等的。

    ② Infinity

    Infinity是一个错误值,它指出了两个错误:一个是大到无法表示的数字,另一个就是除以了0。

    Infinity的运算

    1.如果尝试用一个Infinity区抵消另一个Infinity,那么会得到错误的结果:

    console.log ( Infinity - Infinity );  // NaN

    2.如果试图得到一个比Infinity更大的数字,那么它将还是Infinity:

    console.log ( Infinity + Infinity );  // Infinity
    console.log ( Infinity * Infinity );  // Infinity

    另外,使用全局函数isFinite()可以检查一个值是否是一个实际的值(既不是Infinity也不是NaN)。

    ③ 两个0

    由于JavaScript数字的数值和符号是分开储存的所以每一个非负数都有一个负值,包括0。

    JavaScript努力隐瞒它有2个0这一事实,所以通常情况下,我们就当做一个0来处理就好。

    (6) 数字的内部表示

    JavaScript的数字是64位精度的,也叫作双精度(某些编程语言中double类型)

    (7) 转换成整数

    注:在JavaScript中,所有的数字都是浮点数。而整数是没有小数部分的浮点数。

    一般有以下几种转换:

    1.Math函数:Math.floor(),Math.ceil()以及Math.round()

    2.二进制位运算操作符

    3.全局函数parseInt()

    4.定制的ToInteger()函数

    注:不应该用parseInt()将数字转换成整数:因为参数首先会被转换成字符串,会走不少弯路,且结果也不一定正确。

    (8) 算术运算符

    1.这里有个误区,必须首先解释清楚。number1 % number2 ,这里的%是求余,不是取模运算!

    求余操作符的结果通常和第一个操作数的符号相同,而取模运算和第二个操作数的符号相同。

    // Wrong!
    function odd( n ) {
        return n%2 === 1;
    }
    console.log ( odd(-5) );  // false
    
    // True
    function odd( n ) {
        return Math.abs(n%2) === 1;
    }
    console.log ( odd(-5) );  // 1

    2. +number

    保持参数不变,如果number是非数字,则会转换成数字

    (9) Number函数

    Number函数有2中调用模式:

    1.Number(value)

    作为一个常规函数,它将value转换成一个原始数字

    console.log ( Number('123') );  // 123

    2.new Number(num)

     作为构造函数,创建了一个Number的实例,即包装了num的对象(在转换成一个数字后)

    var a = new Number( 123 );
    console.log ( typeof a );  // object

    (10) Number构造器属性

    Number对象有如下属性:

    1.Number.MAX_VALUE  : 可表示的最大正数。其内部结构为,所有的小数部分都为1,指数为最大值1023。

    console.log ( Number.MAX_VALUE );  //  1.7976931348623157e+308

    2.Number.MIN_VALUE  : 可表示的最小的正数值。

    console.log ( Number.MIN_VALUE );  //  5e-324

    3.Number.NaN  : 与全局NaN相同的值

    4.Number.NEGATIVE_INFINITY  : 与-Infinity相同的值

    5.Number.POSITIVE_INFINITY  :  与Infinity相同的值

    (11) Number原型方法(其中?为可选参数)

    原始值中所有的方法都储存在Number.prototype中。

    1. Number.prototype.toFixed(fractionDigits?)  : 返回不使用指数表示的数字,舍入到小数点后第fractionDigits位。默认参数是0。

    2. Number.prototype.toPrecision(precision?)  :  在使用类似toString()等转换算法前会将尾数精确到precision位。如果没有给出precision,那么会直接使用toString()方法。

    3. Number.prototype.toString(radix?)  : 参数中radix指定了显示数字的系统使用的基数。最常见的就是10进制、2进制和16进制。

    4. Number.prototype.toExponential(fractionDigits?)  : 强制使用指数标注来显示一个数字。fractionDigits是一个在0~20的数字,他决定了应该在小数点前显示多少个数字。如果省略掉,那么会使用尽可能多的数字来唯一指定数字

    (12) 用于数字的函数

    下列函数用于操作数字:

    1. isFinite(number)  : 检查number是否为一个实际的数字(不是Infinity也不是NaN).

    2. isNaN(number)  : 如果number为NaN,则返回true。

    3. parseInt(str)  : 将str解析为一个浮点数。 

    4. parsefloat(str,radix?)  : 将str解析为一个基为radix(2-36)的整数。

  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/luohaoran/p/5961258.html
Copyright © 2011-2022 走看看