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)的整数。

  • 相关阅读:
    数据转换类型和算数运算符
    语言基础+数据类型
    JS(一)Prototype的使用
    Jquery EasyUI简介和数据的增删改查
    http简介
    《JavaScript语言精粹》笔记
    wcf
    简单工厂模式与抽象工厂模式
    <转载>C#中的特性(Attributes)
    <转载>C#IEnumerable和IEnumerator 详解
  • 原文地址:https://www.cnblogs.com/luohaoran/p/5961258.html
Copyright © 2011-2022 走看看