写该系列文章的初衷是“让每位前端工程师把握高频知识点,为工作助力”。这是前端百题斩的第 4 斩,心愿敌人们关注公众号“执鸢者”,用常识武装本人的头脑
4.1 背景
有一个奇怪的景象不晓得大家留神过没有,字符串、数字、布尔值都可能调用属性和办法,例如:
const str = '123';
console.log(typeof(str)); // string
console.log(str.toString()); // 123
const num = 123;
console.log(typeof(num)); // number
console.log(num.toString()); // 123
const bool = true;
console.log(typeof(bool)); // boolean
console.log(bool.toString()); // true
看到这个景象,大家是不是感觉很奇怪,这与咱们平时的想法是相悖的,毕竟咱们认为根本类型下面是不存在属性和办法的,这个时候配角包装对象就呈现了。
4.2 包装对象
JS 的数值,布尔,字符串类型的变量,在肯定条件下,也能够主动变成对象,这就是原始类型的包装对象。包装对象其实是一种非凡的援用类型,其与援用类型的次要区别在于生命周期。
- 个别的援用类型在应用 new 创立其实例时,在执行流来到以后作用域之前始终都保留在内存中;
- 包装类型的对象只存在该行代码的执行霎时,而后会立刻被销毁。(也意味着在运行时不能为根本类型增加属性和办法)
4.3 包装对象后盾执行流程
根本类型中的 String、Number、Boolean 在调用属性和办法的时候,后盾是怎么执行的呢?其实整个过程能够简化为三步:
- 创立一个对象类型的实例,例如字符串则创立一个 String 类型的实例;
- 调用该实例对象上的特定办法;
- 销毁该实例。
以字符串为例,来演示该流程:
const str = 'abc';
const strNew = str.substring(0, 2);
在运行到 str.substring(0, 2) 的时候其实偷偷执行了以下三步:
let strObj = new String(str);
const strNew = strObj.substring(0, 2);
strObj = null;
4.4 扩大
- 包装对象和同样的原始类型的值相等吗?
不相等。因为包装对象是援用类型,原始类型是根本类型;包装对象的最大目标,首先是使得 JavaScript 的对象涵盖所有的值,其次使得原始类型的值能够不便地调用某些办法。
- 如何给根本类型增加属性和办法?
在根本包装对象的原型上面增加,每个对象都有原型。
- 同一个字符串调用两次雷同的办法其包装对象相等吗?
不相等。调用完结后,包装对象实例会主动销毁。这意味着,下一次调用字符串的属性时,理论是调用一个新生成的对象,而不是上一次调用时生成的那个对象,这也阐明了为什么不能间接给字符串、数字、布尔值增加属性和办法。
1. 如果感觉这篇文章还不错,来个分享、点赞吧,让更多的人也看到
2. 关注公众号执鸢者,与号主一起斩杀前端百题。