likes
comments
collection
share

用几个简单的例子带你了解JavaScript中的包装类

作者站长头像
站长
· 阅读数 23

在JavaScript的世界里,基本数据类型如字符串(String)、数字(Number)、布尔值(Boolean)等,通常以简单、轻量的形式存在。然而,为了便于操作这些基本类型值,JavaScript提供了三个特殊的对象类型,即String、Number和Boolean,被称为“包装类”或“包装对象”。本文将深入探讨这三个包装类的概念、特性以及它们在实际编码中的应用。

什么是包装类

包装类JavaScript为了使基本数据类型能够像对象一样拥有方法和属性而创建的一种机制。每当尝试对一个基本类型的值调用方法或访问属性时,JavaScript会自动创建一个临时的包装对象,执行完这个方法或者使用完这个属性后,这个临时对象会被销毁,以保持基本类型的轻量特性。

String包装类

示例

let str = 'Hello, World!';
console.log(str.toUpperCase()); // 输出: HELLO, WORLD!

在这个例子中,当我们调用toUpperCase()方法时,JavaScript会自动将字符串str包装成一个String对象,调用完方法后,这个临时对象会被垃圾回收机制回收。

Number包装类

示例

var num = new Number(123)    // 数字对象
num.a='aaa'
console.log(num)    // 输出:[Number: 123] { a: 'aaa' }

由于包装类的存在让我们可以在num中添加a这个属性,而当第一行代码改为我们常用的var num = 123时,则输出的便是123

我们将上面的代码微微修改一下:

var num = new Number(123)  // 数字对象
num = num*3
num.a='aaa'
console.log(num)    // 输出:369

结果截然不同,为什么呢?其实当我们将num×3再次赋值给num时,它已经从数字对象变成原始值,而原始值是不能拥有属性和方法的,属性和方法只有对象才能拥有

Boolean包装类

示例

let flag = true;
console.log(flag.toString()); // 输出: true

尽管Boolean包装类很少直接使用,它也提供了某些方法,如toString()valueOf(),用于转换布尔值。

深入理解

小测试

通过上面简单的例子,我们大概了解了包装类,接下来我们上些强度:

var str = new String('abc')         // new String('abc')
str +=1                         // 'abc1'
var test = typeof(str)          // string
if(test.length ===6){
    test.sign='typeOf的返回结果可能是String'
    // new String(test).sign = 'xxxxx'
    // delete test.sign
    console.log(test)     // 输出:string
}

现在带大家深入了解包装类的运行过程,你肯定会好奇,为什么这里输出的是string。现在我们一步一步带大家分析:其实在JavaScript中每次我们创建一个变量时它都会编译成new一个包装类,第三行代码就可以看成var test = new String('string')length是String包装类中自带的属性,所以它可以获取length的值。从而让if中的语句执行。而这又会产生疑问,那既然test成为包装类对象了为什么没有输出新加的sign属性呢,这便提到重点了,当v8执行到包装类时,会通过valueOf试探该包装类是不是原始值,如果是,则秉承原始值不用具有属性和方法的这一规则,再移除掉给包装类添加的属性。所以它的sign属性并不是没有添加上去,而是在console.log(test)执行时被移除了。

结语

包装类是JavaScript中一种极其巧妙的设计,它既保持了基本类型值的简洁高效,又赋予了它们对象的操作灵活性。在日常的编程任务中,要灵活运用包装类,它可以降低我们的出错率并且提高我们的编程效率。希望通过此文,可以使你对包装类有更深的理解。

转载自:https://juejin.cn/post/7377691088154837007
评论
请登录