简单理解js中的包装类

156 阅读2分钟

前言:

  • 在编程语言(如 Java 和 JavaScript)中,包装类(Wrapper Class)是一种将基本数据类型包装成对象的类。基本数据类型(如intcharboolean等)不是对象,没有方法和属性。包装类提供了一种方式,使得基本数据类型可以像对象一样使用,这样就能调用方法来操作这些数据。

valueof

  • 在 JavaScript 中,valueOf()是一个非常重要的方法,它存在于许多内置对象(如NumberStringBooleanDateObject等)中。该方法的主要作用是返回对象的原始值。具体返回的值根据对象的类型有所不同。
let numObj = new Number(42);
console.log(numObj)
console.log(numObj.valueOf()); 

image.png

即使我们使用了new关键字创造出了一个对象,但我们仍然能通过valueOf()返回一个数字数据类型

对象进行四则运算

let num1 = new Number(10)//创建了一个数字对象
console.log(num1 * 2)

image.png

我们都知道的是明明对象是无法参加使用四则运算,但我们new了一个对象却能使用它参加四则运算,这是为什么呢?

由于v8引擎在对三种特殊类型对象(string、number、boolean)进行访问时,先会对其valueof,返回原本的类型,因此本行代码并不是对象参与了四则运算而是number数据类型参与了四则运算

字符串添加属性的失败

let str = '10'
str.a = 10
console.log(str.a)

image.png

输出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)

image.png

同样是string基础数据类型却可以调用方法?为什么? 这是由于同样的str首先v8引擎判断的是一个String对象,而挂载在对象上面的length方法被调用,并没有引起valueof方法,但我们会发现无法对length的值行进修改(如同修改数组的值)时由于改变值时会调用valueof方法因此无法被修改