讲一讲我一开始学JS时迷惑了我很久的一个东西,就是

基本包装类型

我们知道像C++Java这样的强类型语言,有基本类型引用类型之分
因为基本类型开辟的内存是固定的,所以放在了栈内存,给人一种线性排列的感觉
引用类型因为各自所含的方法、属性不同,数量也不同,
需要开辟的内存是不定的,所以只能放在堆内存,并用指针去进行索引和绑定。

而JavaScript也是如此,拥有基本类型引用类型之分,
基本类型

NumberStringBooleanUndefinedNull
以及ECMAScript6规范的
Symbol(不一定齐全且准确)

引用类型

ObjectArrayDateRegExpFunction
以及ECMAScript6规范的
SetMapWeakMapPromiseProxy(不一定齐全且准确)

铺垫那么多,其实都是为了引出

JavaScript为NumberStringBoolean封装的基本包装类型

在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