面试题答案
一键面试性能问题
- 额外的内存开销:对象包装类会额外创建对象实例,相比直接使用基本类型,会占用更多内存。例如,
new Number(5)
创建的Number
对象比直接使用5
占用更多内存空间。 - 装箱和拆箱操作:在基本类型和对象包装类之间转换时会发生装箱(基本类型转包装类)和拆箱(包装类转基本类型)操作,这会带来性能损耗。比如
let numObj: Number = new Number(5); let num: number = numObj;
,这里就涉及到拆箱操作。
类型兼容性问题
- 严格类型检查冲突:TypeScript 具有严格的类型检查。基本类型和其对应的对象包装类在类型上并不完全兼容。例如,一个函数期望接收
number
类型参数,传入Number
对象会报错,尽管它们在语义上都表示数字。 - 混淆类型语义:使用对象包装类可能会使类型语义变得模糊。例如,
Boolean
对象除了有真假值,还存在一些方法和属性,这可能导致在代码逻辑中对其实际类型的误解,比如new Boolean(false)
是一个真值(因为它是一个对象),这与基本类型false
的逻辑判断不同。
方法调用差异
- 原型方法调用:对象包装类可以调用原型上的方法,而基本类型直接调用这些方法会有不同表现。例如
let str: string = 'hello'; let strObj: String = new String('hello');
,strObj
可以直接调用String
原型上的方法,但str
调用原型方法时实际上是先进行装箱操作,再调用方法,这可能会在一些场景下导致意外结果。 - 错误的方法使用:由于对象包装类有更多方法,可能会错误地在基本类型上尝试调用这些方法,例如在
number
类型上尝试调用Number
对象特有的方法,在 TypeScript 严格模式下会报错,但在非严格模式下可能导致运行时错误。