搜索到的相关问题回答地址 Number 和 number 的区别
从上面回答来看,了解到 Number 是 number 的包装对象。
问题1:包装对象是 TS 的概念还是 JS 的概念?
问题2:这个所谓的包装对象到底是什么东西呢?或者说是什么概念呢?应该如何去理解。
搜索到的相关问题回答地址 Number 和 number 的区别
从上面回答来看,了解到 Number 是 number 的包装对象。
问题1:包装对象是 TS 的概念还是 JS 的概念?
问题2:这个所谓的包装对象到底是什么东西呢?或者说是什么概念呢?应该如何去理解。
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
的话,时不时地要作一下类型断言。
8 回答4.8k 阅读✓ 已解决
6 回答3.6k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
6 回答2.5k 阅读
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
问题1: 包装对象是 ECMAScript 规定的, TS与JS进行了实现
问题2: 包装对象就是对象, Number 的值表示的是浮点数, 是有构造函数与方法的, 构造方法就是Number(), :
number 是基本数据类型, 数字也就不能调用方法:
number.toString()
, 但是实际使用时是可以的:, 这就是因为他有包装对象Number
, 在实际执行时, 引擎会将基本数据类型number
, 转换为(也就是包装为)对象Number
, 然后调用Number
下的方法,string
类型的数据也是同理, 它有String
包装对象