在之前的介绍中,我们知道了,数据的分类分为基本数据类型和引用类型。
而基本包装类型,严格来说不属于上面两个中的任意一个,但又和两种类型关系米希尔。
我们回忆一下,基本类型和引用类型最大的区别是什么?
let person = {name: "Codereasy",age: 30,celebrateBirthday: function() {this.age += 1;console.log(this.name + " is now " + this.age + " years old!");}
};person.celebrateBirthday(); // 输出:Codereasy is now 31 years old!
但基本数据类型真的就不能使用方法吗?
let number = 42;
console.log(number.toString()); // 输出:"42"
上面的 Number 是一个基本类型,但是它却能调用 toString() 的方法。
按照常理来说,字符串不是引用类型,所以它不应该有自己的方法,第二行代码应该报错才对。:
- 自动创建 Number 类型的一个实例(和基本类型的值不同,这个实例就是一个基本包装类型的对象)
- 调用实例(对象)上指定的方法
- 销毁这个实例
let number = 42;
let tempNumberObject = new Number(number);
console.log(tempNumberObject.toString()); // 输出:"42"
基本类型的值虽然没有方法可以调用,但是后台临时创建的包装对象上有内置方法可以让我们调用方法,因此这样我们就可以对字符串、数值、布尔值这三种基本数据类型的数据进行更多操作。
包装类型和引用类型的不通之处
通过之前的例子介绍,大家可能会有一个误解。包装类型是不是就是把基本类型变成了引用类型?它本质上就是一个引用类型?其实不是,包装类型很想引用类型,但他的生命周期和引用类型有很大区别。
let person = {name: "codereasy",age: 30
};person.myProperty = "hello";
console.log(person.myProperty); // 输出:"hello"
但是如果你给包装类型添加属性
let number = 42;
number.myProperty = "hello";
console.log(number.myProperty); // 输出:undefined
由于基本包装类型的对象仅在执行瞬间存在,因此无法向其添加属性。相反,引用类型的对象会持续存在,直到它们不再被引用并被垃圾收集器回收,所以你可以向它们添加属性。