7_TypeScript Number --[深入浅出 TypeScript 测试]

TypeScript 是 JavaScript 的一个超集,它添加了静态类型检查和其他一些特性来帮助开发者编写更可靠、更易于维护的代码。在 TypeScript 中,Number 类型用于表示数值数据类型,包括整数和浮点数。TypeScript 的 Number 类型对应于 JavaScript 的原始数值类型。

Number 对象与基本 number 类型的区别

在 TypeScript(以及 JavaScript)中,number 类型和 Number 对象有明显的区别。理解这两者之间的差异对于正确使用数值类型非常重要。

基本 number 类型

  • 原始值number 是一种原始数据类型,它用于表示数值,包括整数和浮点数。它是直接存储的数值,而不是对象。
  • 性能更高:因为 number 是原始值,所以它们的处理速度更快,占用的内存也更少。
  • 不可变性:作为原始值,number 一旦创建就不能改变。每次对 number 进行操作都会产生一个新的数值。
  • 用法简单:当你只需要一个简单的数值时,通常会使用 number 类型。
let age: number = 30;

Number 对象

  • 包装对象Number 是一个构造函数,可以用来创建一个包装了原始数值的对象。它提供了额外的方法和属性来操作数值。
  • 包含静态方法和属性Number 对象包含了多个静态方法和属性,如 Number.MAX_VALUE, Number.MIN_VALUE, Number.isNaN(), 等等。
  • 可拥有属性:由于是对象,Number 实例可以拥有属性和方法,尽管这在实际开发中很少见。
  • 性能较低:相比于原始的 number 类型,Number 对象的操作可能会稍微慢一些,并且消耗更多的内存。
  • 自动拆箱:JavaScript 在需要的时候会自动将 Number 对象转换为原始的 number 类型(称为“拆箱”),例如进行数学运算时。
let numObj = new Number(30);
console.log(numObj); // 输出: Number { 30 }

注意事项

  • 不要随意使用 new Number():在大多数情况下,没有必要使用 new Number() 来创建数值的包装对象。直接使用原始的 number 类型即可。使用 new Number() 可能会导致意外的行为,特别是在比较相等性时,因为两个不同的 Number 对象即使包含相同的数值也不会被认为是相等的。
let a = new Number(10);
let b = new Number(10);
console.log(a == b); // false, 因为它们是不同的对象
console.log(a === b); // false, 同上
console.log(a.valueOf() === b.valueOf()); // true, 比较的是内部的原始值
  • 静态方法的使用:你可以直接通过 Number 构造函数访问静态方法,而不需要创建 Number 的实例。例如:
let parsedInt = Number.parseInt("123"); // 使用静态方法 parseInt

总之,在日常编程中,你应该优先选择使用基本的 number 类型,除非你有特定的理由需要使用 Number 对象。

Number 对象属性

Number 对象在 TypeScript 和 JavaScript 中提供了一些有用的静态属性,这些属性可以直接通过 Number 构造函数访问,而不需要创建 Number 的实例。以下是 Number 对象的一些常用属性:

静态属性

  • Number.EPSILON: 表示1与大于1的最小浮点数之间的差异,用于比较浮点数以确定它们是否足够接近。

    console.log(Number.EPSILON); // 输出: 2.220446049250313e-16
    
  • Number.MAX_SAFE_INTEGER: 可以安全使用的最大整数值(2^53 - 1)。

    console.log(Number.MAX_SAFE_INTEGER); // 输出: 9007199254740991
    
  • Number.MIN_SAFE_INTEGER: 可以安全使用的最小整数值(-(2^53 - 1))。

    console.log(Number.MIN_SAFE_INTEGER); // 输出: -9007199254740991
    
  • Number.MAX_VALUE: 能够表示的最大正数。

    console.log(Number.MAX_VALUE); // 输出: 1.7976931348623157e+308
    
  • Number.MIN_VALUE: 能够表示的最接近零的正数(非零)。

    console.log(Number.MIN_VALUE); // 输出: 5e-324
    
  • Number.NaN: 表示“不是数字”的特殊值。

    console.log(Number.NaN); // 输出: NaN
    
  • Number.NEGATIVE_INFINITY: 表示负无穷大。

    console.log(Number.NEGATIVE_INFINITY); // 输出: -Infinity
    
  • Number.POSITIVE_INFINITY: 表示正无穷大。

    console.log(Number.POSITIVE_INFINITY); // 输出: Infinity
    

使用注意事项

当使用 Number 对象的静态属性时,直接通过 Number 访问即可,不需要也不应该使用 new Number() 来创建对象实例来访问这些属性。例如:

// 正确用法
console.log(Number.MAX_VALUE);

// 错误用法,不应该这样做
let numObj = new Number(42);
console.log(numObj.MAX_VALUE); // 这不会工作,因为 MAX_VALUE 是静态属性

以上列出的属性都是只读的,并且是静态的,意味着它们属于 Number 构造函数本身而不是它的实例。因此,当你需要使用这些常量时,总是直接从 Number 访问它们。

Number 对象方法

Number 对象在 TypeScript 和 JavaScript 中提供了许多静态方法和实例方法,用于数值的解析、格式化以及数值属性的检查等操作。这些方法可以帮助开发者更方便地处理数值类型的数据。以下是 Number 对象的一些常用方法:

静态方法

  • Number.parseFloat(string): 将一个字符串解析为浮点数。

    console.log(Number.parseFloat("123.45")); // 输出: 123.45
    
  • Number.parseInt(string, radix): 将一个字符串解析为整数。radix 参数是可选的,指定了解析时所用的进制(例如,10 表示十进制)。

    console.log(Number.parseInt("101", 2)); // 输出: 5 (二进制)
    
  • Number.isNaN(value): 检查给定值是否为 NaN。它比全局的 isNaN() 函数更为严格,因为后者会尝试将非数字参数转换为数字再进行判断。

    console.log(Number.isNaN(NaN)); // true
    console.log(Number.isNaN(123)); // false
    
  • Number.isFinite(value): 检查给定值是否为有限数值(既不是 Infinity 也不是 -InfinityNaN)。

    console.log(Number.isFinite(100)); // true
    console.log(Number.isFinite(Infinity)); // false
    
  • Number.isInteger(value): 检查给定值是否为整数。

    console.log(Number.isInteger(100)); // true
    console.log(Number.isInteger(100.1)); // false
    
  • Number.isSafeInteger(value): 检查给定值是否为安全整数(即,在 Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER 之间的整数)。

    console.log(Number.isSafeInteger(9007199254740991)); // true
    console.log(Number.isSafeInteger(9007199254740992)); // false
    

实例方法

对于通过 new Number(value) 创建的 Number 对象,或者直接使用原始数值(由于自动装箱机制),你可以调用以下方法:

  • .toFixed(fractionDigits): 返回指定小数位数的字符串表示形式。

    let num = 123.456;
    console.log(num.toFixed(2)); // "123.46"
    
  • .toExponential(fractionDigits): 返回以指数记法表示的字符串。

    let num = 123;
    console.log(num.toExponential(2)); // "1.23e+2"
    
  • .toPrecision(precision): 返回指定精度的有效数字表示的字符串。

    let num = 123.456;
    console.log(num.toPrecision(4)); // "123.5"
    
  • .toString(radix): 返回数值的字符串表示,radix 参数是可选的,指定了转换时使用的进制。

    let num = 255;
    console.log(num.toString(16)); // "ff" (十六进制)
    
  • .toLocaleString(locales, options): 根据本地化的格式返回数值的字符串表示。locales 参数可以指定语言环境,options 可以指定格式选项。

    let num = 123456.789;
    console.log(num.toLocaleString('en-US')); // "123,456.789"
    

请注意,虽然你可以创建 Number 对象来访问这些方法,但在大多数情况下,直接在原始数值上调用这些方法就足够了。JavaScript 的自动装箱机制会临时将原始数值包装成对象,以便能够调用这些方法。因此,通常没有必要显式地使用 new Number() 构造函数。

Number 对象的使用建议

在 TypeScript(以及 JavaScript)中使用 Number 对象时,有几点建议可以帮助你编写更有效和更可靠的代码:

1. 避免不必要的 Number 对象实例化

  • 优先使用原始的 number 类型:除非有特殊需求,否则应该避免使用 new Number() 创建 Number 对象。原始数值类型性能更高,且更容易理解。

    // 不推荐
    let numObj = new Number(42);
    
    // 推荐
    let num = 42;
    

2. 使用静态方法进行数值处理

  • 利用 Number 的静态方法Number 提供了多个静态方法来解析字符串、检查数值特性等。直接调用这些静态方法即可,无需创建 Number 实例。

    console.log(Number.parseInt("10")); // 使用静态方法 parseInt
    console.log(Number.isNaN(NaN));     // 使用静态方法 isNaN
    

3. 比较相等性时要小心

  • 注意相等性比较:两个不同的 Number 对象即使包含相同的数值也不会被认为是相等的。因此,在比较数值时,应确保它们都是原始类型的 number

    let a = new Number(10);
    let b = new Number(10);
    console.log(a == b); // false, 因为它们是不同的对象
    console.log(a.valueOf() === b.valueOf()); // true, 比较的是内部的原始值
    

4. 使用适当的数值检查方法

  • 选择合适的数值检查方法:根据你的需要选择 Number.isNaN, Number.isFinite, Number.isInteger, 或 Number.isSafeInteger 等方法来进行精确的数值属性检查。

    console.log(Number.isInteger(100)); // true
    console.log(Number.isSafeInteger(9007199254740991)); // true
    

5. 格式化输出

  • 使用格式化方法:当需要格式化数值输出时,可以使用 .toFixed(), .toExponential(), .toPrecision(), 和 .toLocaleString() 等方法。

    let price = 123.456;
    console.log(price.toFixed(2)); // "123.46"
    console.log(price.toLocaleString('en-US', { style: 'currency', currency: 'USD' })); // "$123.46"
    

6. 处理浮点数精度问题

  • 意识到浮点数运算的精度问题:JavaScript 中的浮点数运算可能会导致精度丢失的问题。如果需要高精度计算,考虑使用第三方库如 decimal.js

    console.log(0.1 + 0.2); // 0.30000000000000004
    

7. 使用 Number.EPSILON 进行浮点数比较

  • 浮点数比较:对于浮点数的比较,可以使用 Number.EPSILON 来确定两个数是否足够接近,以考虑到浮点数的精度限制。

    function areCloseEnough(a, b) {
        return Math.abs(a - b) < Number.EPSILON;
    }
    
    console.log(areCloseEnough(0.1 + 0.2, 0.3)); // true
    

总结

总的来说,尽量使用原始的 number 类型,并充分利用 Number 构造函数提供的静态方法。只有当你确实需要一个 Number 对象提供的特定功能时,才应该创建 Number 实例。通过遵循这些建议,你可以写出更加高效和不易出错的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 扫雷程序设计

目录 1.main函数 2.菜单打印menu函数 3.游戏game函数 4.宏定义 5.界面初始化 6.打印界面 7.设置雷 8.统计排查坐标周围雷的个数 9.排查雷 10.总代码 test.c代码 game.h代码 game.c代码 结语&#xff1a; 一个简单的扫雷游戏&#xff0c;通过宏定义可以修改行列的…

如何有效搭建在线培训知识库

在当今快速发展的教育行业&#xff0c;知识的更新速度日益加快&#xff0c;教育机构和企业需要为学员提供持续的学习资源和培训支持。在线培训知识库的搭建成为实现这一目标的重要手段。一个有效的在线培训知识库不仅能够帮助学员系统地学习和掌握知识&#xff0c;还能为教师和…

Android Audio基础(54)——数字音频接口 I2S、PCM(TDM) 、PDM

1. 概述 本文介绍的数字音频接口全部是硬件接口,是实际的物理连线方式,即同一个PCB板上IC芯片和IC芯片之间的通讯协议。 PCM、PDM也可以用于表示音频编码格式,。编码格式是指模拟信号数字化的方式。 I2S和PCM(TDM)接口传输的数据是PCM格式的音频数据。这两种协议是最为常见…

STM32之CAN通讯(十一)

STM32F407 系列文章 - CAN通讯&#xff08;十一&#xff09; 目录 前言 一、CAN 二、CAN驱动电路 三、CAN软件设计 1.CAN状态初始化 2.头文件相关定义 3.接收中断服务函数 4.用户层使用 1.用户层相关定义 2.发送数据 3.接收数据 1.查询方式处理 2.中断方式处理 3…

第31天:Web开发-PHP应用TP框架MVC模型路由访问模版渲染安全写法版本漏洞

#知识点 1、安全开发-框架技术-ThinkPHP 2、安全开发-框架安全-版本&写法 3、安全开发-ThinkPHP-代码审计案例 类别 组件/框架 说明 [Web框架] Laravel 现代化、功能全面的框架&#xff0c;适合大多数Web应用。 Symfony 高度模块化、功能强大的框架&#xff0c;适…

量子计算遇上人工智能:突破算力瓶颈的关键?

引言&#xff1a;量子计算遇上人工智能——突破算力瓶颈的关键&#xff1f; 在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活&#xff0c;从语音助手到自动驾驶&#xff0c;从医学诊断到金融分析&#xff0c;无不彰显其…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…

Bash Shell的操作环境

目录 1、路径与指令搜寻顺序 2、bash的进站&#xff08;开机&#xff09;与欢迎信息&#xff1a;/etc/issue&#xff0c;/etc/motd &#xff08;1&#xff09;/etc/issue &#xff08;2&#xff09;/etc/motd 3、bash的环境配置文件 &#xff08;1&#xff09;login与non-…

homework 2025.01.07 math 6

1选择部分 二填空部分

(六)CAN总线通讯

文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…

任务调度之Quartz(二):Quartz体系结构

1、Quartz 体系结构 由上一篇的Quartz基本使用可以发现&#xff0c;Quartz 主要包含一下几种角色&#xff1a; 1&#xff09;Job&#xff1a;也可以认为是JobDtetail&#xff0c;表示具体的调度任务 2&#xff09;Trigger&#xff1a;触发器&#xff0c;用于定义任务Job出发执行…

基于Springboot + vue实现的小型养老院管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

初学Linux电源管理

学习文档出处&#xff1a; 万字整理 | 深入理解Linux电源管理&#xff1a;万字整理 | 深入理解Linux电源管理-CSDN博客 电源管理 因为设备需要用电&#xff0c;而且设备中的各个硬件所需要的电压是不一样的。故计算机需要对硬件的电源状态管理。但是电能并不是免费的&#x…

React(二)——Admin主页/Orders页面/Category页面

文章目录 项目地址一、侧边栏1.1 具体实现 二、Header2.1 实现 三、Orders页面3.1 分页和搜索3.2 点击箭头显示商家所有订单3.3 页码按钮以及分页 四、Category页面4.1 左侧商品添加栏目4.2 右侧商品上传栏 五、Sellers页面六、Payment Request 页面&#xff08;百万数据加载&a…

刚体变换矩阵的逆

刚体运动中的变换矩阵为&#xff1a; 求得变换矩阵的逆矩阵为&#xff1a; opencv应用 cv::Mat R; cv::Mat t;R.t(), -R.t()*t

IDEA中Maven依赖包导入失败报红的潜在原因

在上网试了别人的八个问题总结之后依然没有解决&#xff1a; IDEA中Maven依赖包导入失败报红问题总结最有效8种解决方案_idea导入依赖还是报红-CSDN博客https://blog.csdn.net/qq_43705131/article/details/106165960 江郎才尽之后突然想到一个原因&#xff1a;<dep…

UVM:uvm_component methods configure

topic UVM component base class uvm_config_db 建议使用uvm_config_db代替uvm_resource_db uvm factory sv interface 建议&#xff1a;uvm_config_db 以下了解 建议打印error

基于时间维度水平拆分的多 TiDB 集群统一数据路由/联邦查询技术的实践

导读 在大数据时代&#xff0c;金融行业面临着日益增长的数据量和复杂的查询需求&#xff0c;尤其是跨库、跨集群的场景。在这种背景下&#xff0c;如何在保证数据一致性、高可用性的同时&#xff0c;实现业务的快速扩展与高效查询&#xff0c;成为了企业数字化转型的关键挑战…

概率论 期末 笔记

第一章 随机事件及其概率 利用“四大公式”求事件概率 加法公式 减法 条件概率公式 全概率公式与贝叶斯公式 伯努利概型求概率 习题 推导 一维随机变量及其分布 离散型随机变量&#xff08;R.V&#xff09;求分布律 利用常见离散型分布求概率 连续型R.V相关计算 利用常见连续…