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

在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. Apache ShardingSphere 邀您相约 Open Source Day

    Apache ShardingSphere 很荣幸接受 AnitaB.org 的邀请参加 OpenSourceDay Summer 2021 活动. Open Source Day (OSD) 是一个 ...

  2. The type name or alias SqlServer could not be resolved.Please check your configuration

    The type name or alias SqlServer could not be resolved.Please check your configuration file.... 检查一下 ...

  3. 洛谷2151[SDOI2009]HH去散步(dp+矩阵乘法优化)

    一道良好的矩阵乘法优化\(dp\)的题. 首先,一个比较\(naive\)的想法. 我们定义\(dp[i][j]\)表示已经走了\(i\)步,当前在点\(j\)的方案数. 由于题目中限制了不能立即走之 ...

  4. 洛谷4234最小差值生成树 (LCT维护生成树)

    这也是一道LCT维护生成树的题. 那么我们还是按照套路,先对边进行排序,然后顺次加入. 不过和别的题有所不同的是: 在本题中,我们需要保证LCT中正好有\(n-1\)条边的时候,才能更新\(ans\) ...

  5. 其他css属性和特性

    其他css属性和特性 设置元素的颜色和透明度 下表列出了这些属性. 颜色相关属性 属 性 说 明 值 color 设置元素的前景色 <颜色> opacity 设置颜色的透明度 <数值 ...

  6. 【UE4】基础概念——文件结构、类型、反射、编译、接口、垃圾回收、序列化

    新标签打开或者下载看大图 思维导图 Engine Structure Pipeline Programming Pipeline Blueprint Pipeline

  7. SpringCloud 2020.0.4 系列之服务降级

    1. 概述 老话说的好:做人要正直,做事要正派,胸怀坦荡.光明磊落,才会赢得他人的信赖与尊敬. 言归正传,之前聊了服务间通信的组件 Feign,今天我们来聊聊服务降级. 服务降级简单的理解就是给一个备 ...

  8. Prometheus监控Canal

    Prometheus监控Canal 一.背景 二.实现步骤 1.修改prometheus.yml配置文件 2.启动prometheus 3.查看prometheus是否成功接入canal 4.cana ...

  9. 滑动窗口的最大值 牛客网 剑指Offer

    滑动窗口的最大值 牛客网 剑指Offer 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6 ...

  10. JS基础面试

    1. JS是高级语言弱类型语言 脚本语言 1.1高级语言我们写完的代码不能直接执行,要先经过js引擎翻译成0101这种机器语言才能执行 1.2 弱类型语言变量可以在前一行设置为一个数字,下一行修改为一 ...