Number()与new Number().valueOf()的区别及适用场景
关于
new Number().valueOf()与Number()的区别及适用场景 先看你给出的代码:
class RangeValidationBase { constructor(private start: number, private end: number) {} protected RangeCheck(value: number): boolean { return value >= this.start && value <= this.end; } protected GetNumber(value: string): number { return new Number(value).valueOf(); } }
二者的核心区别
Number(value)是直接将输入值转换为原始数值类型,而new Number(value)会创建一个Number包装对象,调用valueOf()方法才会把这个包装对象转回原始数值。所以在你的代码场景里,new Number(value).valueOf()和Number(value)的最终结果确实完全一致——都是得到一个原始数值。
为什么会有人用new Number().valueOf()?
在你提供的这段代码里,这么写完全是多此一举,直接用Number(value)更简洁高效。但有些场景下这种写法有存在的意义:
- 如果你需要先对Number对象进行操作(比如给这个对象添加自定义属性),之后再提取它的原始数值,就会用到
valueOf()。比如:const numObj = new Number("123"); numObj.customTag = "valid"; const rawNum = numObj.valueOf(); // 得到原始数值123 - 某些老旧代码或者对JS类型系统理解不深的开发者,可能误以为必须通过对象实例才能获取数值,从而写出这种冗余代码。
适合用new Number().valueOf()的场景
其实日常开发中很少需要显式创建Number包装对象,因为JS会自动对原始数值进行装箱(比如调用(123).toString()时,JS会临时把原始值转成Number对象)。但确实有少数场景适合这么做:
- 当你需要将数值以对象形式存储(比如作为复杂数据结构的一部分,需要附加额外属性),之后又需要提取其原始数值时。
- 在一些需要严格区分原始类型和对象类型的类型检查场景中(不过这种场景非常少见)。
总的来说,在你的这段范围校验代码里,直接替换成return Number(value);是完全没问题的,而且更符合JS/TS的简洁风格。
内容的提问来源于stack exchange,提问作者risky last
相关产品推荐
相关产品推荐

