分类
| 基本数据类型(原始数据类型) | 引用数据类型 | 特殊的引用类型 | |
| 范围 | number.string.boolean.null.undefined | 对象.数组.函数 | Boolean、Number 和String |
| 存储位置差异 | 存储在堆栈中,占用空间小,大小固定,是一种频繁使用的数据 | 存储在堆中,占用空间大,大小不固定 | |
| 传递值的方式 | 按值传递,不能改变基本数据类型的值 | 按值传递(传的是对象在内存里面的地址),可以更改引用类型的值 | |
基本包装类型
为了便于操作基本类型值,ECMAScript 还提供了 3 个特殊的引用类型:Boolean、Number 和String。这些类型与本章介绍的其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。
注意:
1. 基本类型可以使用对应的包装对象的属性和方法, 但不能对包装对象添加/删除或修改属性或方法;
2. 如果要对包装对象作添加/删除或修改属性或方法的操作, 则可以使用类似: String().prototype.xxx这种方法在包装对象的原型上进行修改.
怎样理解基本类型的包装对象
当我们给下面的数值 / 字符串 / 布尔值类型的变量增加属性, 会发现我们的设置不会生效, 这是什么原因呢? 这就要讲到 "包装对象" 了;
var a = 123;
a.name = "number";
a.name; // undefined;
var b = "hello";
b.name = "string";
b.name; // undefined;
var c = true;
c.name = "boolean";
c.name; // undefined;
在JavaScript中, 数值 / 字符串 / 布尔值都是基本类型, 而基本类型的值是不可变的, 但这又违背了JavaScript一切皆对象这句话, 因此, 一定有什么方法可以对这三种基本类型进行对象的相关操作;
调用基本类型的方法时, 基本类型会自动转换为它所对应的包装对象
var a = "hello"; // 此时是一个基本类型
a; // "hello"
// 使用相关方法或属性时, 它会转换为对应的包装对象, 比如下面转换为: String
a.length; // 5
a.replace("l", ""); // "helo"
// 上面的调用可以看作是下面的执行
String(a).length; // 5
String(a).replace("l", ""); // "helo"