2018-03-28 浅谈JS的包装对象

JS提供了11种引用类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。其中包括了三种基本包装类型,也就是Number、String和Boolean,它们是特殊的引用类型,既与其他的引用类型相似,同时又具有与各自的原始类型相应的特殊行为。

一、什么是包装类型?

因为这字符串、数值、布尔三种原始类型的值,在一定条件下会自动转化为对象,因此被称为原始类型的“包装类型”。

例如:var a1="some text";

var a2=a1.substring(0,2);

console.log(a2);//"so"

上面这个例子中,变量a1是一个字符串,字符创必然是基本类型的值,但是它却在第二行调用了substring()方法,并将结果返回保存在a2中,我们都知道,既然a1是基本类型的值而不是对象,因而从逻辑上讲,它是没有方法的。其实在在实现这个操作的时候,JS内部已经隐式地帮我们帮创建了一个包装对象了,以上的实际的情形应该是这样的:

var a1=new String("some text");

var a2=a1.substring(0,2);

a1=null;

console.log(a2);//"so"

但是这两种方式还是有区别的:

区别一:浏览器自己隐式创建的包装对象和你显式创建的包装对象不严格相等。

var a1="test";

var a2=new String("test");

console.log(a1==a2);//true

console.log(a1===a2);//false

区别2:隐式创建的包装对象,在使用完后之后就会被销毁了。例如:

var s1="some text";

var s1.color="red";

console.log(s1.color);//undefined

上面的代码,在第二行代码试图为一个字符s1添加一个color属性,但是当第三行再次访问的时候,color属性已经不见了。原因就是第二行代码创建的String对象在执行第三行代码时已经被销毁了,第三行代码又创建来了自己的String对象,可是没有了color属性,所以最终返回的值是undefined。

在实际运用中,我们可以显式的调用String、Number和Boolean来创建基本包装类型的对象,不过,应该在绝对必要的时候再这么做,因为这种做法很容易让人分不清自己是在处理基本类型还是引用类型。对基本包装类型的实例调用 typeof 会返回object。

二、包装类型和引用类型的区别

引用类型和包装类型的主要区别是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动穿件的基本包转类型的对象,则只存在于一行代码的执行期间,然后立即被销毁,这也意味着我们不能在运行时为基本类型添加属性和方法。

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

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,386评论 2 17
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,710评论 0 13
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 6,445评论 1 10
  • 六一国际儿童节经典欣赏。 梁启超《少年中国说》原文+译文 日本人之称我中国也,一则曰老大帝国,再则曰老大帝...
    fe77c62f2b9a阅读 11,830评论 0 2
  • (一)雪上无霜 蜀山。仙妖对阵。 “雪上霜,你好大的胆子,竟然敢率领众妖攻我蜀山,夺我镇山之宝天机玄册!贫道今日定...
    岁岁有乔木阅读 4,398评论 7 11

友情链接更多精彩内容