人话 JS 之原始值包装类型

原始类型有哪些

在这里插入图片描述
首先以上是 JS 中的原始类型,什么是原始类型呢?就是变量存放的那些简单而固定的值,比如 let num = 1;这个 num 就是原始值。

与之相对的是引用类型,引用类型通常存放的是对象。

关于这两点我在前面的文章中有叙述,就不展开,或者大家可以去看看相关的内容。

原始值包装类型

所谓原始包装类型,其实应该是原始引用类型,我们知道原始值,就是那些简单的值,像 1,“text”,true 等等,而引用类型就是对对象的引用。

因为原始值简单,所以你无法对它进行额外的操作,也就是它本身没有任何的属性和方法,而引用类型是对象的引用,就有属性和方法,将二者结合,原始包装类型(我喜欢叫原始引用类型),就是说一个原始值也有了属性和方法。

在 JS 中,ES(自行百度 JS 和 ES 的关系) 提供了 Boolean、Number 和 String 原始值的引用类型,也就是说这三种原始类型也具有其对应的引用类型的属性和方法。

let s1 = "some text"; 
let s2 = s1.substring(2);

比如,我们看上面这个例子,有没有想过,明明 s1 是一个原始的字符串,但是却可以直接对这个原始值使用方法,这就是因为,JS 对这三种原始值提供了隐式的包装操作,每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法

所以实际上上面的步骤其实隐式的执行了如下的内容:

let s1 = new String("some text");  // 创建一个 String 类型的实例
let s2 = s1.substring(2);          // 调用实例上的方法
s1 = null;                         // 销毁实例

同理,对于布尔值和数值也是一样的情况。

区别

所以在 JS 中有三种类型的数据了,原始类型,引用类型(如,Object,Array 等)和原始包装类型。那么原始类型和另外两个的区别是非常明显的,那么引用类型和原始包装类型的区别是什么呢?

  1. 对象的生命周期不同
    引用类型是标标准准的对象引用,也就是说,引用类型的实例在 new 之后,会在离开作用域后才被销毁。而原始包装类型,是一个杂交种,生命很短,有多短呢,自动创建的原始包装类型只会存在于代码执行期间
let s1 = "some text"; 
s1.color = "red"; 
console.log(s1.color); // undefined

可以看到,理论上我们给 s1 添加了一个 color 的属性,但是一旦第二行代码运行完了,s1 的在第二行代码中临时创建的 String 对象就被销毁了,第三行后,又变成了原始类型

区分转型函数和原始包装类型的构造函数

JS 提供了三个转型函数,Number()、String()和Boolean(),所谓转型,就是强制类型转换,这个在其他语言中也是有的

对于原始包装类型的构造函数来说,我们知道,默认 JS 解释器会隐式的创建原始包装类型,当然你也可以手动取创建,就像这样

let obj = new Number(25); // 构造函数

你会发现构造函数和转型函数非常的像,区别在于构造函数是 new 的,而转型函数是直接调用,所以这一点上要进行一定区别,不要搞混了

let value = "25"; 
let number = Number(value); // 转型函数
console.log(typeof number); // "number" 
let obj = new Number(value); // 构造函数
console.log(typeof obj); // "object"

猜你喜欢

转载自blog.csdn.net/qq_34902437/article/details/118382063
今日推荐