原始值包装类型 (特殊引用类型)

在ES6 时,ECMAScript 数据类型是这样去分类的:

  • 原始值(基本数据类型)

    • Number
    • String
    • Boolean
    • Undefined
    • Null
    • Symbol
  • 引用值(复杂数据类型)

    • Object

      函数也是一种引用类型

且我们知道,通常情况下,只有对象才有方法。但是我们知道,实际上,字符串有字符串方法,如:

  • indexOf() , lastIndexOf()
  • search()
  • slice(), substring(), substr()
  • replace()
  • toUpperCase(), toLowerCase()
  • concat()
  • trim()
  • 等等...

Number 有Number 方法,如:

  • toExponential()
  • toFixed()
  • toPrecision()
  • 等等...

Boolean 有 Boolean 方法,如:

  • toString()
  • valueOf()

这些都是基本的数据类型, 但是却有着对象的方法。

实际上,ECMAScript 为了方便的操作原始值,提供了3中 特殊的引用类型 :

  1. Boolean
  2. Number
  3. String
let s1 = "some text";
let s2 = s1.substring(2);

这里,第二行在访问s1 的时候,是以读模式访问的。 也就是要从内存中读取变量保存的值, 以读模式访问字符串值的任何时候,后台都会执行以下3个步骤:

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

布尔值和数值也是一样的, 以上3步也会在后台发生,不过使用的是Boolean 和 Number 包装类型而已 。

这三种特殊的引用类型,也叫做原始值包装类型。

原始值包装类型和应用类型的区别

引用类型与原始包装类型的主要区别在于对象的生命周期。 在通过new 实例化引用类型后。 得到的实例会在离开作用域时被销毁,而自创建的原始值包装对象则只存在于访问它的那行代码执行期间。 这也为之不能在运行时给原始值添加属性和方法。

let s1 = "some text";
s1.color = "red"; // 创建临时String 对象,并在执行完该行后立即被销毁。
console.log(s1.color);// undefined

不过如果真的期望达到给一个原始值添加属性。 可以显式的去调用 new Boolean()new Number()new String() 这些构造函数以创建原始值包装对象。

有几点值得注意:

  1. 不推荐使用, 因为会让开发者容易疑惑。

  2. 原始值包装类型的实例上使用 typeof 会返回 "object"

    let objNumb = new Number(100);
    let objStr = new String("some text");
    let objBool = new Boolean(true); typeof objNumb; //'object'
    typeof objStr; //'object'
    typeof objBool; //'object'
  3. 通过原始值包装类型构造函数显式的实例化对象 都是 对应原始值包装类型的实例

    objNumb instanceof Number;	// true
    objStr instanceof String; // true
    objBool instanceof Boolean; // true
  4. 通过工厂方法 Object构造函数,也能够根据传入值的类型返回相应原始值包装类型的实例

    let Ostr = new Object("some text");
    let Onum = new Object(100);
    let Obool = new Object(false); Ostr instanceof String; // true
    Onum instanceof Number; // true
    Obool instanceof Boolean; // true

[JS高程] 特殊的原始值类型的更多相关文章

  1. js 不可变的原始值和可变的对象引用

    javascript中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着根本区别.原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值.对数字和布尔值 ...

  2. 【js高程学习笔记】Object类型

    创建一组Object的实例的方式有两种: 方法一: var person = new Object(); person.name = '团子'; person.race = '猫'; person.s ...

  3. JS面向对象特性和值类型与复合类型

      JS面向对象之特性已经值类型与复合类型 一些属性 空对象 空对象也是对象, 只是有存变量的变量名, 没有对象属性 var o ={}; 参数传递 值类型: 函数内外两个变量, 两个数据, 都不相同 ...

  4. 匹夫细说C#:可以为null的值类型,详解可空值类型

    首先祝大家中秋佳节快乐~ 0x00 前言 众所周知的一点是C#语言是一种强调类型的语言,而C#作为Unity3D中的游戏脚本主流语言,在我们的开发工作中能够驾驭好它的这个特点便十分重要.事实上,怎么强 ...

  5. C# 值类型和引用类型

    一.基本概念 C#只有两种数据类型:值类型和引用类型 值类型在线程栈分配空间,引用类型在托管堆分配空间 值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱 以下是值类型和引用类型对照表 从上图可 ...

  6. C#的is和as操作符来进行强制类型转换&&值类型的拆箱、装箱

    if(o is Employee) { Employee e=(Employee)o; //在if语句剩余的部分中使用e; } Employee e=o as Employee; if(e!=null ...

  7. [CLR via C#]5.3 值类型的装箱和拆箱

    原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管 ...

  8. C#中的基元类型、值类型和引用类型

    C# 中的基元类型.值类型和引用类型 1. 基元类型(Primitive Type) 编译器直接支持的类型称为基元类型.基元类型可以直接映射到 FCL 中存在的类型.例如,int a = 10 中的 ...

  9. CLR via 笔记 5.3 值类型的装箱和拆箱

    1.装箱 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(Boxing)的机制. 1.在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆的所有对象都有的两个额外成员(类 ...

随机推荐

  1. Go语言核心36讲(Go语言基础知识三)--学习笔记

    03 | 库源码文件 在我的定义中,库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从 Go 语言规范的话). 这里的"其他代码" ...

  2. 洛谷4606 SDOI2018战略游戏(圆方树+虚树)

    QWQ深受其害 当时在现场是真的绝望...... 现在再重新来看这个题 QWQ 根据题目所说,我们可以发现,对于每一个集合中的节点,我们实际上就是要求两两路径上的割点的数目 考虑到又是关于点双的题目, ...

  3. bzoj3073Journeys(线段树优化最短路)

    这里还是一道涉及到区间连边的问题. 如果暴力去做,那么就会爆炸 那么这时候就需要线段树来优化了. 因为是双向边 所以需要两颗线段树来分别对应入边和出边 QwQ然后做就好了咯 不过需要注意的是,这个边数 ...

  4. mysql update语句的执行流程是怎样的

    update更新语句流程是怎么样的 update更新语句基本流程也会查询select流程一样,都会走一遍. update涉及更新数据,会对行加dml写锁,这个DML读锁是互斥的.其他dml写锁需要等待 ...

  5. Golang通脉之流程控制

    流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码. ...

  6. 从源码层面深度剖析Redisson实现分布式锁的原理(全程干货,注意收藏)

    Redis实现分布式锁的原理 前面讲了Redis在实际业务场景中的应用,那么下面再来了解一下Redisson功能性场景的应用,也就是大家经常使用的分布式锁的实现场景. 引入redisson依赖 < ...

  7. 初学Python-day12 装饰器函数

    装饰器 1.概念 本质就是一个Python函数,其他函数在本身不变的情况下去增加额外的功能,装饰器的返回值是一个函数. 常用的场景:插入日志,事务处理,缓存,权限校验等. 2.普通函数回顾 1 def ...

  8. 兜底机制——leader到底做了什么?

    Case 在之前一次年底考评的时候,有一位leader将一个案例同时用到了自己和下属身上,老板发出了责问: 这个项目到底你是负责人,还是你下面的同学是负责人,如果下面的同学是负责人,为什么要算到你的头 ...

  9. 如何知道当前使用的python的安装路径

    电脑里多处安装了python,那么如何得知当前使用python的安装路径呢? 方法一 运行python指令: import sys print(sys.executable) 方法二 对于终端和Win ...

  10. [技术博客] BeautifulSoup4分析网页

    [技术博客] BeautifulSoup4分析网页 使用BeautifulSoup4进行网页文本分析 前言 进行网络爬虫时我们需要从网页源代码中提取自己所需要的信息,分析整理后存入数据库中. 在pyt ...