javascript类型系统——包装对象
前面的话
javascript对象是一种复合值,它是属性或已命名值的集合。通过'.'符号来引用属性值。当属性值是一个函数时,称其为方法。通过o.m()来调用对象o中的方法。我们发现,字符串也同样具有属性和方法
var s = 'hello world';
console.log(s.length);//
字符串既然不是对象,为什么它会有属性呢?这就引出了今天介绍的内容——包装对象
定义
在javascript中,“一切皆对象”,就连三种原始类型的值(数值、字符串、布尔值),在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”
包装对象是特殊的引用类型。每当读取字符串、数字或布尔值的属性或方法时,创建的临时对象称做包装对象
为了便于引用字符串的属性和方法,javascript将字符串值通过调用new String()的方式转换成对象,这个对象继承了字符串的属性和方法,并被用来处理属性和方法的引用。一旦属性或方法引用结束,这个新创建的对象就会销毁。数字或布尔值也类似
[注意]实际上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样的
var s1 = 'some text';
var s2 = s1.substring(2);
//上述过程看起来发生了三个步骤
var s1 = new String('some text'); //(1)创建String类型的一个实例
var s2 = s1.substring(2); //(2)在实例上调用指定的方法
s1 = null; //(3)销毁这个实例
生存期
引用类型和基本包装类型的主要区别是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着不能在运行时为基本类型值添加属性和方法
var s1 = 'some text';
s1.color = 'red';
alert(s1.color);//undefined
var s2 = new Boolean('some text');
s2.color = 'red';
alert(s2.color);//'red'
显式创建
可以通过new操作符显式创建包装对象,但应该在绝对必要的情况下再这样做。因为这种做法,很容易让人分不清是在处理基本类型还是引用类型的值
有两种方式显式创建包装类型的方式:
【1】Object方式
var s = new Object('abc');
var b = new Object(true);
var n = new Object(123);
【2】构造函数方式
var s = new String('abc');
var b = new Boolean(true);
var n = new Number(123);
转型函数
直接调用转型函数与使用new调用基本包装类型的构造函数是不一样的,使用转型函数返回的是基本类型值
var s = 'abc';
var s1 = String(s);
var s2 = new String(s);
var s3 = new Object(s);
console.log(typeof s,typeof s1,typeof s2,typeof s3);//string string object object
比较运算
【1】等于运算符'=='将原始值和其包装对象视为相等,因为其中一个操作数是对象,需要调用对象的valueOf()方法,Number对象、Boolean对象和String对象的valueOf()方法都返回其对应的原始值
var s1 = new String('abc');
var s2 = 'abc';
var n1 = new Number(123);
var n2 = 123;
var b1 = new Boolean(true);
var b2 = true;
console.log(s1 == s2, n1 == n2, b1 == b2);//true true true
【2】全等运算符'==='将原始值和其包装对象视为不相等。因为全等运算符要比较类型和值,原始值和其包装对象的类型不同
var s1 = new String('abc');
var s2 = 'abc';
var n1 = new Number(123);
var n2 = 123;
var b1 = new Boolean(true);
var b2 = true;
console.log(s1 === s2, n1 === n2, b1 === b2);//false false false
参考资料
【1】《javascript高级程序设计(第3版)》第3章 基本概念 第5章 引用类型
【2】《javascript权威指南(第6版)》第3章 类型、值和变量
javascript类型系统——包装对象的更多相关文章
- 学习笔记:Javascript 变量 包装对象
学习笔记:Javascript 变量 包装对象 如下代码,可以输出字符的长度. var str = "Tony"; str.length; 这时再试试以下代码,返回是 undefi ...
- JavaScript之包装对象
JavaScript对象是一种复合值:它是属性和已命名值的集合.通过"."符号来引用属性值.当属性值是一个函数时,称为方法. ①一段你常用但却未必明白其真正底层原理的代码: var ...
- [学习笔记]Javascript的包装对象
例子1: var s="test"; s.len = 4; var t = s.len // t is undefined 原因是s是字符串,第二行代码,实际上是创建一个临时字符串 ...
- javascript类型系统——Math对象
× 目录 [1]常量 [2]函数 前面的话 javascript使用算术运算符实现基本的算术运算,如果要实现更加复杂的算术运算,需要通过Math对象定义的常量和函数来实现.和其他对象不同,Math只是 ...
- JavaScript包装对象
JavaScript是面向对象的语言,使用”.”操作符可以访问对象的属性和方法,而对于基本类型(null, undefined, bool, number, string)应该是值类型,没有属性和方法 ...
- 每日分享!~ vue JavaScript中为什么可以读取到字符串的长度!(包装对象)
首先需要知道什么是包装对象? 对象是JavaScript语言下最主要的数据类型,三种原始的值-----数值,字符串,布尔值,在一定条件下会自动的转为对象.也就是原始类型的包装对象: 也就是通过如下方式 ...
- javascript深入浅出——学习笔记(包装对象和类型检测)
3包装对象:https://www.imooc.com/video/5676 当我们尝试把基本类型已对象的方式访问时,javascript会把该基本类型转换为对应的包装类型对象(临时对象),相当于ne ...
- 理解JavaScript的临时包装对象
Javascript语言中的对象和基础类型string.number.boolean都可以使用"."符号访问属性和方法,但是本质上只有对象才可以使用".",那么 ...
- JavaScript 包装对象
万物皆对象 在JavaScript里,万物皆对象.但是某些对象有别于其它对象,我们可以用 typeof 来获取一个对象的类型,它总是返回一个字符串. typeof 123; // 'number' t ...
随机推荐
- C#数据结构杂记
定义任何类时记得要定义无参构造函数,否则在反序列化的时候会抛出异常. [Serialize]声明该类可以被序列化 Const与readonly的区别 const本质上是常量没有任何方法修改值,read ...
- iOS进阶_动画的多种实现方式
一.UIView动画 //UIView动画有开始beginAnimation,有结束commitAnimation //第一步:开始UIView动画 [UIView beginAnimat ...
- iOS进阶_三方使用步骤
一.配置环境(:后为在终端输入的命令) 打开终端 查看自己电脑的Ruby环境:gem sources -l 如果环境已经是淘宝镜像了,此时不需要再进行环境的修改. 如果不是,发送gem sources ...
- 持续集成(CI)相关的一些工具,后续补充。。。。
持续集成的目标:使项目开发更加便捷 1.make工具 最原始的工具,负责组织构建的过程,即指挥编译器如何编译,连接器如何链接,最后生成一个可用文件. 2.Ant工具 Ant是一个构建工具,它只有一个配 ...
- 使用UG UISTYLER 窗体编辑器,创建对话框 part 2
接下来看看自动生成的cs文件里的东西吧,下面是之前保存的窗体的cs文件: 如果仅仅做一些UG开发没有太多的语言基础,那并不需要去了解初始函数内的东西.只需要了解下3类入口函数如何修改和如何应用就可以了 ...
- WebRTC实现网页版多人视频聊天室
因为产品中要加入网页中网络会议的功能,这几天都在倒腾 WebRTC,现在分享下工作成果. 话说 WebRTC Real Time Communication 简称 RTC,是谷歌若干年前收购的一项技术 ...
- C# System.Threading.Timer 使用方法
public class TimerHelper { System.Threading.Timer timer; public TaskSendMMS tasksendmms { get; set; ...
- 【Python】调用WPS V9 API,实现PPT转PDF
WPS 的API,即COM,主要分为V8与V9两个版本,网上容易查到的例子,都是V8的. 现在官网上可以下载的,2013抢鲜版,就是V9的API. Python 调用COM 需要安装 Python f ...
- 【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一.为什么需要自定义锁屏页 锁屏 ...
- Newtonsoft.Json中的时间格式详解.
Newtonsoft.json是一款不错的序列化反序列化第三方组件,具体如何使用属于基础知识,此处不再讲解.看以下代码: public class OutgameEntity { public str ...