javascript数值型只有一种吗

javascript数值型只有一种吗

javascript数值只有一种:浮点类型。JavaScript内部存储数字都是按64位浮点类型存储的,所以在JavaScript中实际上是没有整数类型的。按照JavaScript中的数字格式能够表示的整数范围为“[-2^53 ~ 2^53]”,包含边界值;但需要注意的是,数组索引、位操作符等使用的是基于32位的整数。

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

在JavaScript中,数值类型只有一种,内部表示为64位浮点数。所以在JavaScript中实际上是没有整数类型的。

print(3/2); // 1.5

可见,数值都是按浮点数来处理的。

因为JavaScript内部存储数字都是按64位浮点类型存储的,无论整数和小数。容易造成混淆的是,某些位运算必须要整数才可以运行,所以会自动将64位浮点数转化为32位整数。再进行位运算。在JavaScript中,1和1.0是一样的

1 == 1.0 true0.1+0.2 == 0.3 false0.3/0.1 = 2.99999999996(0.3-0.2) === (0.2-0.1) false

总之,涉及小数的运算要小心

按照JavaScript中的数字格式(IEEE-754定义的64位浮点格式),能够表示的整数范围为[-2^53 ~ 2^53],包含边界值。然而需要注意的是,数组索引、位操作符等使用的是基于32位的整数。

浮点数值的较高精度是17位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1加0.2的结果不是0.3,而是0.30000000000000004。这个小小的舍入误差会导致无法测试特定的浮点数值。

因为二进制浮点数可以精确地表示1/2、1/8等,但不能精确地表示1/10、1/100等。所以像0.1这样的简单数字也不能精确表示。

由于浮点数有精度问题,可能会在比较时得到一此意想不到的结果:

print((0.1+0.2) == 0.3); // falseprint(0.1+0.2);          // 0.30000000000000004print(0.3);              // 0.3print((10/3-3) == (1/3));// falseprint(10/3-3);           // 0.3333333333333335print(1/3);              // 0.3333333333333333

对于整数的情况,只要使用53位以内的整数,则不会出现精度问题,可以放心使用。

除了以十进制表示外,整数还可以通过八进制(以8为基数)或十六进制(以16为基数)的字面值来表示。其中,八进制字面值的名列前茅位必须是零(0),然后是八进制数字序列(0~7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析。

八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript引擎抛出错误。

十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0~9及A~F)。其中,字母 A~F 可以大写,也可以小写。

由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转换为整数值。显然,如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存。同样地,如果浮点数值本身表示的就是一个整数(如1.0),那么该值也会被转换为整数。

数值对象

与字符串值对应着一个字符串对象一样,数值也有对应的数值对象,即Number。

数值同样可以直接调用数值对应的属性:

print((6).toString()); // 6

注意,本例中,数值需要添加括号,否则句点会被认为是小数点。

Number的使用与String的使用类似,可以进行类型转换、创建数值对象等。

在进行类型转换时,如果转换不成功,即Number返回NaN,使用数值对象时也是如此。

var a = Number('x');print(typeof a, a);       // number NaNvar b = new Number('x'); print(typeof b, b);       // object [Number: NaN]

Number具有5个特殊属性(只读),即:

  • MAX_VALUE :正数最大值,再大就会变成Infinity

  • MIN_VALUE :正数最小值,再小就会变成0

  • NaN :Not a Number

  • NEGATIVE_INFINITY :负无穷大,即-Infinity

  • POSITIVE_INFINITY :正无穷大,即Infinity

print(Number.MAX_VALUE);         // 1.7976931348623157e+308print(Number.MIN_VALUE);         // 5e-324print(Number.NaN);               // NaNprint(Number.NEGATIVE_INFINITY); // -Infinityprint(Number.POSITIVE_INFINITY); // Infinity

Infinity

当数字运算结果超过了JavaScript所能表示数字上限时,结果为一个特殊的无穷大值(Infinity),如果是负数的值超过了JavaScript所能表示的负数范围,则结果为-Infinity。

当运算结果无限接近于零并比JavaScript能表示的最小值还小的时候(下溢),结果为0,当负数发生下溢时,结果为-0,正数发生下溢,则结果为+0。

JavaScript预定义了全局变量Infinity和NaN,它们都是只读变量。

由于内存的限制,ECMAScript并不能保存世界上所有的数值。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308。如果某次计算的结果得到了一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转换成Infinity(正无穷)。

如果某次计算返回了正或负的Infinity值,那么该值将无法继续参与下一次的计算,因为Infinity不是能够参与计算的数值。要想确定一个数值是不是有穷的(换句话说,是不是位于最小和最大的数值之间),可以使用isFinite()函数。

NaN

NaN是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。

对于NaN,要记住的一点是,只要运算中出现NaN,结果就一定是NaN,就算是”NaN*0″这样的运算,也一样是NaN。只要对NaN运行比较运行,结果就一定是false,就算”NaN==NaN”/”NaN!=NaN”等,都是false。

要判断一个值是否为NaN,可以使用isNaN()函数:

print(isNaN(NaN));  // trueprint(isNaN(0/0));  // true

在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。

也可以使用x!==x来判断x是否为NaN,只有在x为NaN的时候,这个表达式的值才为true。

inFinite()

isFinite函数用于判断一个数是否为“正常”的数值:

print(isFinite(Number.NaN));               // falseprint(isFinite(Number.NEGATIVE_INFINITY)); // falseprint(isFinite(Number.POSITIVE_INFINITY)); // false

除了以上3个特殊值外,其他值的结果都为true

假如x是一个普通数值,则有:

x/0 = Infinityx%0 = NaNx/Infinity = 0x%Infinity = x0/0 = NaN0%0 = NaNInfinity/x = InfinityInfinity%x = NaNInfinity/Infinity = NaNInfinity%Infinity = NaN

完整输出如下:

print(0 / 0);           // NaNprint(3 / 0);           // Infinityprint(Infinity / 0);    // Infinityprint(0 % 0);           // NaNprint(3 % 0);           // NaNprint(Infinity % 0);    // NaN----------print(0 / 4);           // 0print(3 / 4);           // 0.75print(Infinity / 4);    // Infinityprint(0 % 4);           // 0print(3 % 4);           // 3print(Infinity % 4);    // NaN----------print(0 / Infinity);           // 0print(3 / Infinity);           // 0print(Infinity / Infinity);    // NaNprint(0 % Infinity);           // 0print(3 % Infinity);           // 3print(Infinity % Infinity);    // NaN

负零与正零

负零与正零的值相等,不过毕竟带有符号,在一些运算中会有符号方面的差别,比如:

var zero = 0; var negz = -0;

此时,zero 等于 negz , 但1/zero 却不等于 1/negz。

读到这里,这篇“javascript数值型只有一种吗”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

文章标题:javascript数值型只有一种吗,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/29155

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月24日 上午12:09
下一篇 2022年9月24日 上午12:10

相关推荐

  • laravel是不是后端框架

    laravel是后端开发框架;laravel是一个用于构建web应用程序的跨平台PHP框架,尽管laravel确实提供了一些前端功能,但是Laravel的许多功能与前端无关,Laravel提供了一个功能强大的开发环境,以及直观和富有表现力的命令行界面。 本文操作环境:Windows10系统、Lara…

    2022年9月1日
    76400
  • python解析之namedtuple函数怎么使用

    源码解释: def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None): “””Returns a new subclass of tuple with named fields. >&g…

    2022年9月1日
    73900
  • 如何进行Web权限维持分析

    前言 权限维持,在红蓝对抗中,我觉得其意义在于两点:一是防止已获取的权限被蓝队破坏;二是防止其他红队获取到相同的权限(虽然有点缺德。。。)。 其他情况下的非法用途就不说了。 权限维持的原则我觉得就是不能影响原来业务的正常运行。(比如改后台密码导致管理员不能登录,修改文件夹读写权限导致正常的文件不能上…

    2022年9月24日
    55700
  • apex什么服务器较稳定

    APEX LEGENDS中较为稳定的服务器通常具备响应速度快、连接可靠和低延迟等特点。1、选择离地理位置较近的服务器;2、考虑服务器的负载情况;3、选择口碑良好的服务器供应商。玩家在选择服务器时,需关注其实时延迟和丢包率。尤其是离地理位置近的服务器往往能提供更稳定的连接体验,因为距离的减少有助于降低…

    2024年4月23日
    3100
  • excel下拉列表怎么添加新内容

    excel下拉列表添加新内容的方法: 1、说先点击添加好的下拉,查看里面的内容。 2、之后选择这个下拉,点击任务栏的“数据”。 3、之后在点击下面的“数据验证”。 4、在弹出的窗口中进入设置,在“来源”中添加要新增的内容, 最后点击确定即可。 以上就是“excel下拉列表怎么添加新内容”这篇文章的所…

    2022年8月27日
    1.2K00
  • windows ToDesk退出了怎么继续登录

    ToDesk退出了继续登录的方法: 1、退出后,重新打开ToDesk,然后点击右上角的“立即登录” 2、在其中选择上一次的登录方法进行登录就可以继续使用了。 3、还可以点击左上角的密码登录,使用账号密码来登录。 4、登录完成后,在设备列表中就可以重新连接之前连接过的设备了。 到此,相信大家对“win…

    2022年9月21日
    84000
  • mysql如何删除表的一行数据

    在mysql中,可以使用DELETE语句配合WHERE子句和LIMIT子句来删除表的一行数据,语法为“DELETE FROM 表名 WHERE 删除条件 LIMIT 1;”;DELETE语句用于删除表中一行或者多行数据,而WHERE子句用于设置删除条件,LIMIT子句用于设置删除数据的行数。 本教程…

    2022年9月21日
    2.6K00
  • windows谷歌浏览器缓存位置在哪

    谷歌浏览器缓存在哪: 1、打开谷歌浏览器在搜索栏输入“Chrome:Version”查看保存文件的位置。 2、随后在我的电脑中找到路径: C:UsersAdministratorAppDataLocalGoogleChromeUser DataDefault。 谷歌浏览器更改位置教程: 1、浏览器默…

    2022年9月8日
    92000
  • 如何实现sqlmap time-based inject的分析

    1. 前言 sql注入如何检测的? 我的回答是:在甲方做安全,sql注入检测还是比较好做的。 1) 报错注入检测。 2) 别做bool的报错注入,误报比较高。 3) 做基于time-based的时间注入,联系运维做上慢日志db记录,监控sleep,benchmark的关键字监控,可以在sleep的时…

    2022年9月21日
    64400
  • windows是否只查看安全传送的网页内容如何关闭

    是否只查看安全传送的网页内容关闭方法: 1、首先打开浏览器,然后点击任务栏中的“工具”。 2、之后点击下拉菜单中的“Internet选项”。 3、再点击选项窗口中的“安全”。 4、接着去点击下面的“自定义级别”。 5、下拉找到“显示混合内容”。 6、勾选下面的“启动”。 7、最后点击确定即可。 以上…

    2022年8月31日
    72600
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部