前言:
- 在编程语言(如 Java 和 JavaScript)中,包装类(Wrapper Class)是一种将基本数据类
型包装成对象的类。基本数据类型(如`int`、`char`、`boolean`等)不是对象,没有方法和属
性。包装类提供了一种方式,使得基本数据类型可以像对象一样使用,这样就能调用方法来
操作这些数据。
valueof
- 在 JavaScript 中,
valueOf()
是一个非常重要的方法,它存在于许多内置对象(如Number
、String
、Boolean
、Date
、Object
等)中。该方法的主要作用是返回对象的原始值。具体返回的值根据对象的类型有所不同。
let numObj = new Number(42);
console.log(numObj)
console.log(numObj.valueOf());
即使我们使用了new关键字创造出了一个对象,但我们仍然能通过`valueOf()`返回一个数字数据类型
对象进行四则运算
let num1 = new Number(10)//创建了一个数字对象
console.log(num1 * 2)
> 我们都知道的是明明对象是无法参加使用四则运算,但我们new了一个对象却能使用它参加四则运算,这是为什么呢?
> 由于v8引擎在对三种特殊类型对象(string、number、boolean)进行访问时,先会对其valueof,返回原本的类型,因此本行代码并不是对象参与了四则运算而是number数据类型参与了四则运算
字符串添加属性的失败
let str = '10'
str.a = 10
console.log(str.a)
输出undefined,为什么没有报错?而是输出undefined,是由于v8引擎首先在let str时将其转成了new String变成了一个对象,所以str.a是添加了对象的属性,并不会进行报错,而在进行访问的时候仍然需要valueof返回成了一个string类型,由于基本数据类型不能具有方法和属性,会执行delete str.a,删除后值就变成了undefined。
修改字符串的长度
let str = '10'
str.length = 1
console.log(str.length)
let arr = [1, 2, 3]
arr.length = 1
console.log(arr)
同样是string基础数据类型却可以调用方法?为什么?
这是由于同样的str首先v8引擎判断的是一个String对象,而挂载在对象上面的length方法被调用,并没有引起valueof方法,但我们会发现无法对length的值行进修改(如同修改数组的值)时由于改变值时会调用valueof方法因此无法被修改