Javascript引用类型与基本包装类型

Javascript基本包装类型

  • 每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据
  • 为了便于操作基本类型值,ECMAscript还提供了3个引用类型:Boolean、Number、String

是基本类型也是引用类型,所以叫做基本包装类型:

let s = "sss";
let sub = s.substring(2);

s 是基本类型值却有方法?
实际上后台已经自动完成了一系列处理,当第二行访问 s 时,后台会完成下列处理:

  1. 创建一个 string 类型的实例
  2. 在实例上调用指定方法
  3. 销毁这个实例

实际上就相当于执行了下列过程:

let s = new String("sss");
let sub = s.substring(2);
s = null;

上面过程适用于 String Boolean Number

引用类型与基本包装类型的区别

基本数据类型是存放在栈区的,引用类型是同时保存在栈区和堆区中的

假如有以下几个基本类型的变量:

let name = "jozo";
let city = "guangzhou";
let age = 22;

那么它的存储结构如下图:

基本数据类型在内存中保存的情况

栈区包括了变量的标识符和变量的值。

引用类型的存储需要在内存的栈区和堆区共同完成,栈区保存变量标识符和指向堆内存的地址。
假如有以下几个对象:

let person1 = {name : "change1"};
let person2 = {name : "change2"};
let person3 = {name : "change3"};

则这三个对象在内存中保存的情况如下图:

引用类型在内存中保存的情况
  • 引用类型的值是对象,保存在堆内存中
  • 引用类型的变量实际上是一个指针,它保存在栈中,指向堆内存中的对象
  • 复制引用类型变量实际是复制该指针,所以他们都指向同一个对象

引用类型与基本包装类型的主要区别就是对象的生存期

使用 new 操作符创建的引用类型的实例,在执行流离开当前作用域之前,会一直保存在堆内存中。而后台自动创建的基本包装类型的对象,则只存在一行代码的执行瞬间,然后立即被销毁。这意味着我们不能为基本类型的值添加属性和方法。

自动创建的基本包装类型的对象:

var str = "some text";
str.color = "red";
console.log(str.color); // undefined

var s = 'hello';
s[2] = 'x';
console.log(s);     // 'hello'

在此,第二行表面上看是为 str 添加了 color 属性,但是仔细回想上面的后台执行的那 3 个步骤,会发现,第二行创建的 String 对象在添加了 color 属性后,被销毁了。执行到第三行时,第三行代码又创建了自己的 String 对象,然而这个对象没有 color 属性。
s[2] = 'x' 表面上是改变了 s 字符串。实际上,改变以后该对象被销毁了。最后输出的 s = 'hello' 是第三行代码新创建的 String 对象。

为了与上面的例子形成对比,我们显式地创建基本包装类型的对象,代码如下:

var str = new String("some text");
str.color = "red";
console.log(str.color); // red

通过引用类型创建基本包装类型的对象

  • 可以显式地调用 Boolean 、Number 和 String 来创建基本包装类型的对象,但最好不要这么做。对基本包装类型的实例调用 typeof 会返回 object,而且所有基本包装类型的对象都会被转换为布尔值 true。
  • Object 构造函数也会像工厂方法一样,根据传入值的类型返回相应基本包装类型的实例。
let s = new String('');
console.log(!s); // false

let obj = new Object("some text");
console.log(obj instanceof String); // true

要注意的是,使用 new 调用基本包装类型的构造函数,与直接调用同名的转型函数是不一样的。

var value = "25";
var number = Number(value);
console.log(typeof number);   // "number"

var obj = new Number(value);
console.log(typeof obj);  // "object"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,106评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,164评论 18 399
  • 前言 不知道大家有没有这样一种感觉,程序员的数量井喷了。可能是因为互联网火了,也可能是各家培训机构为我们拉来了大量...
    活这么大就没饱过阅读 2,883评论 6 25
  • “有一种期待,身边又多个可谈的友人,又添一本知心知意的书,或许人生就可以心满意足。孩子,要知道这段人生里,茫茫天地...
    图书馆野刊阅读 171评论 0 0
  • 我家有一只可爱,漂亮的小狗,我们给它取个好听的名字-——小花 它穿着一件黄白相间的皮大衣,脖子上围着白色的围巾,脚...
    焦若水阅读 405评论 0 0

友情链接更多精彩内容