JavaScript中包装类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014465934/article/details/89291317

先看一道题:

下面哪些语句可以 在JS里判断一个对象oStringObject是否为String。

oStringObject instanceof String  (√)
typeof oStringObject == 'string' (x)

JS 中值的类型分为原始值类型和对象类型。原始值类型包括 number, string, boolean, null 和 undefined;对象类型即 object。首先原始值类型它就不是对象。

另外,要注意 ‘hello’ 和 new String(‘hello’) 的区别,前者是字符串字面值,属于原始类型,而后者是对象。用 typeof 运算符返回的值也是完全不一样的:

typeof 'hello';  // 'string'
typeof new String('hello');  // 'object'

之所以很多人分不清字符串字面值和 String 对象,归根结底就是 JS 的语法对你们太过纵容了。当执行 ‘hello’.length 时,发现可以意料之中的返回 5,你们就觉得 ‘hello’ 就是 String 对象,不然它怎么会有 String 对象的属性。其实,这是由于 JS 在执行到这条语句的时候,内部将 ‘hello’ 包装成了一个 String 对象,执行完后,再把这个对象丢弃了,这种语法叫做 “装箱”,在其他面向对象语言里也有(如 C#)。不要认为 JS 帮你装箱了,你就可以在写代码的时候不分箱里箱外了!

1.JavaScript对象分类

看一张图:

在这里插入图片描述
附加知识:
JavaScript对象:Object、Array、Function、Data、RegExp、Boolean、Number、String、Global、Math
Browser对象:Window、Navigator、Screen、History、Location
HTML DOM对象:DOM Document、DOM Element、DOM Attribute、DOM Event

JavaScript对象划分成“引用类型”、“基本包装类型”和“内置对象”三块内容。

1.引用类型的值(对象)是一个引用类型的一个实例。

引用类型有时候也被称为对象定义,因为它们描述是一类对象所具有的属性和方法。

为了便于操作基本数据类型,ECMAScript还提供了3个特殊的引用数据类型(基本包装类型):Boolean、Number和String。

在实际中我们每读取一个基本数据值的时候,后台就会创建一个对应的基本包装类型对象,从而让我们能够调用一些方法操作这些数据。

如以下示例:

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

猜猜后台会做什么样的事情,走,我们一起来看看:
1、String类型的一个实例;
2、在实例中调用指定的方法;
3、销毁这个实例。

可以将以上三个步骤想像成是执行以下ECMAStript代码。

var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;

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

它们的对象生命周期不同:

1.引用类型:使用new创建引用类型的实例,在执行数据流离开当前作用域时会一直存储在内存中。
2.基本包装类型:自动创建基本包装类型的对象,只执行一行代码的瞬间之后就会立即销毁。
    
这意味着在运行时为基本包装类型值添加属性和方法是无效的。

再看一个例子:
在这里插入图片描述
说明了上面的生命周期。

针对Boolean包装类,也有一个注意事项,我们知道一个引用类型,除非它是null或者undefined,否则它永远都是true,所以new Boolean(false) && true结果是true。

在这里插入图片描述
再看一些例子:
在这里插入图片描述
总结:基本包装类型自动创建的对象在对象被调用的时刻存在,调用完后就被销毁了,而使用new关键字创建的引用类型的实例,对象在当前作用域都存在。

//基本包装类型对象
1 var s='some';2 s.age='Joel';3 console.log(s.age);//undefined

如上代码在给字符串s添加age属性,但是当代码执行到第三行时name属性已经被销毁了,当代码执行第三行时,又创建了一个String 实例,但是这个实例并没有age属性所以输出undefined;

//显示实例化包装类型
1 var s=new String('some'); 2 s.age='Joel'; 3 console.log(s.age);//Joel

参考文章:
https://www.nowcoder.com/profile/2496345/test/23255344/14709#summary
https://www.cnblogs.com/john-sr/p/5731247.html
https://www.cnblogs.com/huangxincheng/p/4141883.html
https://www.douban.com/note/642521951/

猜你喜欢

转载自blog.csdn.net/u014465934/article/details/89291317