讲一讲我一开始学JS时迷惑了我很久的一个东西,就是
基本包装类型
我们知道像C++、Java这样的强类型语言,有基本类型和引用类型之分
因为基本类型开辟的内存是固定的,所以放在了栈内存,给人一种线性排列的感觉
而引用类型因为各自所含的方法、属性不同,数量也不同,
需要开辟的内存是不定的,所以只能放在堆内存,并用指针去进行索引和绑定。
而JavaScript也是如此,拥有基本类型和引用类型之分,
如基本类型
Number、String、Boolean、Undefined、Null
以及ECMAScript6规范的
Symbol(不一定齐全且准确)
引用类型
Object、Array、Date、RegExp、Function
以及ECMAScript6规范的
Set、Map、WeakMap、Promise、Proxy(不一定齐全且准确)
铺垫那么多,其实都是为了引出
JavaScript为Number、String、Boolean封装的基本包装类型
在C++和Java中,int、float等基本类型变量,是不能通过对象访问符“.”来访问它们的方法,因为它们是简单的基本类型变量,不存在方法,也就称不上对象
但是在JavaScript中,Number、String类型的变量,却可以拥有toString()、toNumber()等方法
来段代码看看
var s1 = "some text";
var s2 = s1.substring(2);
这是因为它们封装了相应的基本包装类型
基本包装类型是和引用类型是一致的,所以可以拥有方法
实际上后台自动完成了一系列处理,上面的代码等同于
var s1 = "some text";
var temp = new String(s1)
var s2 = temp.substring(2);
temp = null;
可以看到这里的temp变量作为一个中间者,使得基本类型看起来拥有了方法
再来一段代码,让我们更好去理解,为什么它们都叫String | Number | Boolean,但是它们就是不一样
var s1 = "test";
var s2 = new String(s1);
console.log(typeof s1); //String
console.log(typeof s2); //Object
console.log(s2 instanceOf String); //true