【JavaScript】Number 和 number 的区别

news/2025/2/24 15:38:18/文章来源:https://www.cnblogs.com/lhjc/p/18734195

在 JavaScript 中,Numbernumber 的区别主要体现在类型和用途上。以下是详细的总结:

1. 类型区分

  • number:是 JavaScript 的原始数据类型(primitive type),用于表示整数、浮点数以及特殊值(如NaNInfinity)。

    let a = 42; // typeof a === "number"
    
  • Number:是 JavaScript 的内置对象类型(对象包装器),用于创建数值对象。Number是内置的全局对象,提供数值处理相关的属性和方法,例如Number.MAX_VALUE表示最大数值,Number.MIN_VALUE表示最小正数。

    let b = new Number(42); // typeof b === "object"
    

基本类型number的值可以直接参与运算,而Number对象封装了数值的扩展功能。

2. 存储与性能

  • number:作为原始类型,直接存储在栈内存中,访问高效。
  • Number:作为对象,存储在堆内存中,栈中存储引用。频繁创建对象会影响性能。

3. 自动装箱(Auto-Boxing)

  • 当对原始类型调用方法(如 a.toFixed(2))时,JavaScript 会临时将 number 包装为 Number 对象,调用方法后销毁。
  • 这意味着原始类型可以“借用”对象的方法,但无需显式创建对象。

4. 比较与类型检查

  • 宽松相等(==:原始类型与对象类型比较时,对象会被转换为原始值。

    console.log(5 == new Number(5)); // true
    
  • 严格相等(===:类型不同直接返回 false

    console.log(5 === new Number(5)); // false
    
  • typeof 结果

    typeof 5; // "number"
    typeof new Number(5); // "object"
    

5. 使用场景

  • 优先使用 number

    • 适用于所有数学运算、变量赋值等常规场景。
    • 更高效且避免对象相关的副作用。
  • 谨慎使用 Number 对象

    • 需要为数值添加属性时(不推荐,易引发问题):

      let numObj = new Number(10);
      numObj.customProp = 'hello'; // 可以添加属性
      
    • 需要明确区分对象与原始类型的特殊场景。

6. 静态方法与实例方法

  • 静态方法:通过 Number 构造函数调用,如 Number.parseInt()Number.MAX_SAFE_INTEGER
  • 实例方法:通过数值(原始或对象)调用,如 toFixed()toExponential()

7. TypeScript 中的类型注解

  • number:注解原始类型。

    let a: number = 42; // 正确
    
  • Number:注解对象类型(通常避免使用)。

    let b: Number = new Number(42); // 正确,但非推荐做法
    

8. 类型转换与常用方法

使用Number()函数可将其他类型转换为number,若转换失败则返回NaNparseInt()parseFloat()专门用于字符串到数值的解析,支持进制转换和忽略非数字字符。例如,parseInt("10px")返回10Number对象的方法如toExponential()(指数表示法)、toPrecision()(指定精度)等,常用于数值格式化。

9. 特殊值与注意事项

NaN(非数值)和Infinity(无穷大)属于number类型。需注意NaN !== NaN,判断需用isNaN()函数。浮点数运算可能存在精度问题(如0.1 + 0.2 !== 0.3),可通过缩放为整数运算后还原。此外,避免直接比较浮点数,推荐使用误差范围判断。

10. 总结

特性 number (原始类型) Number (对象类型)
存储方式 栈内存(直接存储值) 堆内存(存储引用)
性能 高效 较低(需内存分配)
类型检查 (typeof) "number" "object"
添加属性 无效(自动装箱后销毁) 有效(可作为对象属性)
常见用途 常规数值操作 特殊需求(极少使用)

建议:除非有明确需求,否则始终优先使用 numberNumber 对象可能导致意外的类型问题,且通常无必要。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何利用CRM系统进行客户细分和精准营销?

——怎么做才能在CRM系统里对客户进行细分并精准营销呢? 我有一个朋友这么问我。 其实,想做到这个并不难,不过需要先明白这两个的核心概念是什么。简单来说,客户细分——根据客户的不同特点,把客户分成几个群体。 精准营销——根据这些细分好的群体,量身定制符合他们需求…

文科生的我用DeepSeek+AI程序员半小时开发了一个小程序

作者:AI工具集 有时候我突发奇想要做个小工具,但是碍于不会编程,没办法进行下去。 但是学习编程要花很长时间,而且以我的水平,还不一定学得懂。我就在想,能不能通过AI生成一个网页、小程序或者App呢?经过实战手搓,发现真的可以!DeepSeek满血版“AI程序员” 正好我看见…

优化性能钩子useMemo

执行顺序 useMemo 是同步执行,而 useEffect 是异步的。 import { useMemo, useState, useEffect } from react;function TestComponent() {const [count, setCount] = useState(0);console.log(普通代码:在渲染期间同步执行);useMemo(() => {console.log(useMemo:在渲染期…

BUUCTF-Web方向21-25wp

[HCTF 2018]admin 打开环境,有三处提示,一个跳转链接,一个登录注册,一个提示不是admin点击hctf,无法访问注册个账号,依旧无法查看,看来需要admin账号弱口令 爆破密码当密码未123长度明显不同登录session伪造 在修改密码界面,提示session下载该源码查看,index.php {% i…

useMemo 与 useEffect

执行顺序 useMemo 是同步执行,而 useEffect 是异步的。 import { useMemo, useState, useEffect } from react;function TestComponent() {const [count, setCount] = useState(0);console.log(普通代码:在渲染期间同步执行);useMemo(() => {console.log(useMemo:在渲染期…

测试用例管理工具2

一、bug的等级 (1)1级bug (致命bug) (2)2级bug(严重bug) (3)3级bug(一般bug) (4)4级bug(简易性bug)- 划分- 1级bug (致命bug):必须优先修改,在测试中较少出现,一旦出现应立即中止当前版本测试; 致命bug: (1)常规操作引起的崩溃,死机,死循环,内存泄…

FPGA Assembly

FASM 是一种文件格式,用于指定 FPGA 比特流中需要置1或清0的位。FASM 的设计初衷是提供一个中间层,令 FPGA 布局布线工具无需关心实际运行的 FPGA 比特流文件格式而工作。FASM 文件格式具有以下特性:从文件中删除任意一行都不会影响其有效性(注:这里的“有效性”指的是能正…

Flink 实战之维表关联

生产应用中,经常遇到将实时 **流式数据** 与 **维表数据** 进行关联的场景。常见的维表关联方式有多种,本文对以下 3 种进行了实现,并对每种方法的优缺点进行了比较:1. 预加载维表 2. 异步 IO 3. 广播维表下面分别使用不同方式来完成维表 join 的实验,附源码和实时动效。F…

Sa2VA环境搭建推理测试

引子 Sa2VA模型通过结合SAM-2和LLaVA,将文本、图像和视频统一到共享的LLM标记空间中,能够在少量指令微调下执行多种任务,如图像/视频对话、指称分割和字幕生成。该模型在视频编辑和内容创作中展现出强大的性能,在相关基准任务中达到了SOTA水平。OK,那就让我们开始吧。一、…

20-bluecms代码审计、thinkphp相关知识cve和cnvd编号申请

1、对bluecms进行代码审计,分析复现文件上传、ssti模板注入、文件删除等漏洞 文件上传审计admin/tpl_manage.php 文件发现,在do_edit模块有三个参数(act = do_edit、tpl_name = 写入文件名称、tpl_content = 写入内容,且代码中未对文件名过滤,导致可以上传任意文件。查看对…

ios SDK AB 开关切换

在数据库的这个服务器 然后再ctest1数据库新建编辑器然后查询select* fromapp_config ac whereaccess_no = 12100186 //这个是应用IDand module = abSwitchand param_name = export_otel_ab查到后,把param_value改为B,或者A,然后回车,然后点击图中的保存 保存后等两分钟,…

CS Course Learning

【李宏毅】2024大语言模型课程 课程学习课程链接:https://speech.ee.ntu.edu.tw/~hylee/genai/2024-spring.php Bilibili相关视频链接:https://www.bilibili.com/video/BV1XS411w7qrGPT: Autoregressive model In-context LearningChain of Thoughts (CoT) Tree of Thoughts …