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

在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. MySQL8 根据某属性查询字段排名由自定义变量到rank()的变动

    在mysql8 之前的版本,因为没有rank()方法的存在,所以在对字段进行排名时,使用的是自定义自变量的方法,比如: select id,name,@rank=@rank+1 as ranks fr ...

  2. Ubuntu安装 配置GCC和Vim

    VMware14.0和Ubuntu镜像安装 https://mp.weixin.qq.com/s/045wrbdv92PkUQn2abddvA 适应屏幕设置 按照下列流程检查虚拟机设置 查看 -> ...

  3. 用css写三角形

    html部分 <div class="triangle></div> css部分 .triangle{ width:0; height:0; overflow:hid ...

  4. WEB安全指南

    说明:本文是Mozilla Web应用部署文档,对运维或者后端开发团队的部署行为进行指导.该部署安全规范内容充实,对于部署有很大意义.同时也涉及到了许多web前端应用安全的基本知识,如CSP, TOK ...

  5. kivy Label触发事件

    kivy  label也可以触发事件,为什么只有我这么无聊学垃圾kivy """ 在通过ref标记一段文本后点击这段文本就可以触发'on_ref_press'事件,在该事 ...

  6. 通过简单例子 | 快速理清 UML 中类与类的六大关系

    关于封面:我想我们都会离开 类与类之间的六大关系 泛化 ( Generalization ) ---> 表继承关系 实现 ( Realization ) 关联 ( Association ) 聚 ...

  7. 2021.8.19考试总结[NOIP模拟44]

    T1 emotional flutter 把脚长合到黑条中. 每个黑条可以映射到统一区间,实际操作就是左右端点取模.长度大于$k$时显然不合法. 然后检查一遍区间内有没有不被黑条覆盖的点即可. 区间端 ...

  8. 零基础入门stm32基本定时器详解

    一.基本定时器介绍 在STM32中,基本定时器有TIM6.TIM7等.基本定时器主要包含时基单元,提供16位的计数,能计数0~65535.基本定时器除了计数功能以外,还能输出给DAC模块一个TRGO信 ...

  9. Machine learning (7-Regularization)

    1.The Problem of Over-fitting 2.Cost Function 3.Regularized Linear Regression 4.Regularized Logistic ...

  10. VS2013快捷键及技巧 / 智能插件

    复制/剪切/删除整行代码 1)如果你想复制一整行代码,只需将光标移至该行,再使用组合键"Ctrl+C"来完成复制操作,而无需选择整行. 2)如果你想剪切一整行代码,只需将光标移至该 ...