首先了解什么是包装类
个人总结为:原始值是存在栈里的,没有属性方法(引用类型是存在堆中),如果想通过原始值访问属性,就会调用包装类
先从一道题了解包装类
let str = 'abc';
str.conp = '3';
console.log(str.conp);
思考上面这道题,控制台会打印什么? 解答如下
let str = 'abc'; // --> 原始类型
str.conp = '3'; // --> str.conp => [new String()].conp
console.log(str.conp); // --> [new String()].conp --> undefined
当进行str.conp = '3'时,因为str指向的是原始值,处理str.conp时会将str隐式调用包装类,使str => new String变成一个对象的形式(注意:这里对象因为未被再引用,在执行完这一行后会被垃圾回收),再进行.conp是可以的。
第三步打印str.conp时,因为str是原始值,则又调用包装类str => new String,再执行.conp查看属性时,因为无这属性,会打印出undefined。
包装类的一般过程
- 原始值在访问属性时,会调用包装类,隐式转换为对象;
- 调用完包装类进而可以进行属性访问;
- 包装类隐式转换的对象,会在执行完后被js垃圾回收了;
将上述一般过程掌握,就可以解决一些问题了。
包装类的练手小题
通过上述,下面开始从几个题了解程度。
// 1
let num = 123;
num.len = 3;
console.log(num.len);
// 2
let bool = true;
bool.stat = 'yes';
console.log(bool.stat);
答案是:
// 1 --> undefined
// 2 --> undefined
上面两道题是没问题的,那下面这三道呢?
// 1
'abc'.len = 3;
console.log('abc'.len);
// 2
true.stat = 3;
console.log(true.stat);
// 3
123.len = 3;
console.log(123.len);
答案是:
// 1 ---> undefined
// 2 ---> undefined
// 3 ---> SyntaxError
前面两道利用包装类的一般过程分析可知,结论是undefined。
最后一道为何是SyntaxError报语法错误呢,既然是原始值做属性访问,那应该是调用包装类,最后输出undefined的,这是为什么?
这是因为
123.len = 3这种写法,对于Number类型的来说会有歧义,因为123.的写法js会判断`.``后面是小数