1.了解
- js数据类型分为基本数据类型和引用数据类型,其中基本数据类型为string、number、null、undefined、symbol、boolean,引用数据类型为object。
- 基本数据类型和引用数据类型有一个明显的区别:引用数据类型可以使用内置的方法,也可以自定义其他方法来操作数据,而基本数据类型不能向引用数据类型那样使用内置方法。
- 但实际上,js为string、number、boolean三个类型提供了特殊的引用,
- 即当基本数据类型以对象的方式去使用时,js会自动将其转换为包装类型,相当于new一个对象,内容和基本类型的内容一样,然后当操作完成后再去访问时,这个临时对象会被销毁,接着访问就是undefined
2.应用
2.1 当以对象的形式访问基本数据类型时,js会自动包装为对象
- 自动创建 String 类型的一个实例(和基本类型的值不同,这个实例就是一个基本包装类型的对象)
- 调用实例(对象)上指定的方法
- 销毁这个实例
let str = '123'
const len = str.length
console.log(len) // 3
{
const _str = new String('123')
const len = _str.length;
console.log(len)
_str = null
}
2.2 对象的生存周期
对于引用类型的数据,在执行流离开当前作用域之前都会保存在内存中,而对于自动创建的基本包装类型的对象,只存在于一行代码的执行瞬间,执行完毕就会立即被销毁。
const str = '123'
str.test = '321'
console.log(str.test) // undefined
上面第二行代码给自动创建的 String 实例对象添加了 test 属性,虽然此刻代码执行时他是生效的,但是在这行代码执行完毕后该 String 实例就会立刻被销毁,String 实例的 test 属性也就不存在了。
当执行第三行代码时,由于是读取模式,又重新创建了新的 String 实例,而这个新创建的 String 实例没有 test 属性,结果也就是 undefined。
代码解释如下
var str = 'hello';
str.number = 10; //假设我们想给字符串添加一个属性 number ,后台会有如下步骤
(
var _str = new String('hello'); // 1 找到对应的包装对象类型,然后通过包装对象创建出一个和基本类型值相同的对象
_str.number = 10; // 2 通过这个对象调用包装对象下的方法 但结果并没有被任何东西保存
_str =null; // 3 这个对象又被销毁
)
console.log(str.number); // undefined 当执行到这一句的时候,因为基本类型本来没有属性,后台又会重新重复上面的步骤
(
var str = new String('hello');// 1 找到基本包装对象,然后又新开辟一个内存,创建一个值为 hello 对象
str.number = undefined;// 2 因为包装对象下面没有 number 这个属性,所以又会重新添加,因为没有值,所以值是未定义;然后弹出结果
str =null; // 3 这个对象又被销毁
)
3.面试题
- 是否了解 JavaScript 中的包装类型?
参考答案:
包装对象,就是当基本类型以对象的方式去使用时,JavaScript 会转换成对应的包装类型,相当于 new 一个对象,内容和基本类型的内容一样,然后当操作完成再去访问的时候,这个临时对象会被销毁,然后再访问时候就是 undefined。
number、string、boolean 都有对应的包装类型。
因为有了基本包装类型,所以 JavaScript 中的基本类型值可以被当作对象来访问。
基本类型特征:
每个包装类型都映射到同名的基本类型
在读取模式下访问基本类型值时,就会创建对应的基本包装类型的一个对象,从而方便了数据操作
操作基本类型值的语句一经执行完毕,就会立即销毁新创建的包装对象