在 TS 中 使用 Number 和 number 约束类型的区别?

搜索到的相关问题回答地址 Number 和 number 的区别

从上面回答来看,了解到 Number 是 number 的包装对象

image.png


问题1:包装对象是 TS 的概念还是 JS 的概念?

问题2:这个所谓的包装对象到底是什么东西呢?或者说是什么概念呢?应该如何去理解。

阅读 3.1k
3 个回答

问题1: 包装对象是 ECMAScript 规定的, TS与JS进行了实现

问题2: 包装对象就是对象, Number 的值表示的是浮点数, 是有构造函数与方法的, 构造方法就是Number(), :image.png
number 是基本数据类型, 数字也就不能调用方法:number.toString(), 但是实际使用时是可以的:image.png, 这就是因为他有包装对象Number, 在实际执行时, 引擎会将基本数据类型number, 转换为(也就是包装为)对象Number, 然后调用Number下的方法, string类型的数据也是同理, 它有String包装对象

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

TypeScript与JavaScript类似,支持Number对象。TS是JS的超集。
Number对象是原始数值的包装对象。

所谓包装对象就是对基本数据类型的包装。为啥用包装这个词,是因为它(包装对象)内部使用了它(基本数据类型)来完成功能,并在此的基础上添加了额外的属性方法。使其具体面向对象的特征。


本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

楼上的回答无非是把题主没看懂的话再又重复了一遍,跟“因为你家属是你家属,所以你家属是你家属”一样无厘头。
说句实在话,我也不理解这俩类型在定义上的区别,不过可以根据自己的观察强答:

  • 可以把类型为number的值传递给声明为Number的变量/参数:

    const n:Number = 1 as number;

    👆这样不报错。

  • 不能把类型为Number的值传递给声明为number的变量/参数:

    const n:number = 1 as Number;

    👆这样会报错。

这个行为有点像什么?有点像超类和子类的关系:超类不兼容子类的时候,类型为子类的值可以赋值给声明为超类的变量,反之则不可

class Super{}
class Sub{
  uncompatiableProp: 1
}

const super: Super = new Sub(); // 没有问题
const n:Number = 1 as number; // 没有问题

const sub: Sub = new Super(); // 报错
const n:number = 1 as Number; // 报错

所以它们的关系比较像: number是扩展(extends)Number而来的。当然这并不是本质,因为无法用instanceof算符来检查。
另外,MDN 文档里似乎并没有给出包装类型的定义,只是提到了它的作用:

当在基本类型上访问属性时,JavaScript 自动将值装入包装器对象中,并访问该对象上的属性。例如,"foo".includes("f") 隐式创建了一个 String 包装对象,并在该对象上调用 String.prototype.includes()。这种自动装箱行为在 JavaScript 代码中是无法观察到的,但却是各种行为的一个很好的心理模型——例如,为什么“改变”基本类型不起作用(因为 str.Foo = 1 不是赋值给 str 本身的 Foo 属性,而是赋值给了一个临时包装器对象)。
👆摘自MDN文档:基本类型

说白了就是个备胎。

在工作中我们应该尽量使用number,因为 TS 给出的各种默认 xxx.d.ts都是使用number,写Number的话,时不时地要作一下类型断言。

推荐问题
logo
Microsoft
子站问答
访问
宣传栏