关于ECMAScript中的原始值和引用值详解

目录
  • 前言
  • 什么是动态属性
  • 值的复制
  • 判断值类型
  • 总结

前言

这应该是很基础的 JavaScript 的知识点,但估计很多小伙伴都只是简单带过,到面试时一问三不知。这里结合我之前的笔记,再简单的介绍下原始值和引用值的相关知识,来,开始。

ECMAScript 规定变量可以包含两种数据类型,要么是原始值(primitive value),要么是引用值(reference value),原始值即为最简单的数据构成,而引用值是指由多个值构成的对象。

一共包含六种原始值,分别是:Undefined、Null、Boolean、Number、String和 Symbol,操作原始值就是操作存储变量中的实际值。

而引用值这玩意呢,它是保存在内存中的对象,由于 JavaScript 是不能直接访问内存位置的,因此也就不能直接操作对象所在的内存空间,当你操作对象的时候,实际也就是操作的对象的引用,而不是这个对象本身。

什么是动态属性

动态属性是指在创建一个引用值后,可以动态地添加、修改、删除其属性和方法。示例:

let obj = new Object();
obj.name = "Sam";

console.log(obj.name); // "Sam"

释义:首先创建一个引用值对象,并把它保存在变量 obj 中,第二步赋予 obj 一个 name 属性,值为“Sam”。除非这个属性被修改/删除,不然你是可以直接打印或者访问这个属性的。

原始值不能带有属性,尽管在给它进行属性操作的时候不会报错。示例:

let me = "Sam";
me.sex = "男";

console.log(me.sex); // undefined

这里使用的是字面量的形式初始化,因此尽管给 me 赋予了 sex 属性,也是无济于事的,无法访问该属性。
如果是使用 new 关键字初始化原始值,JavaScript 则会创建一个 Object 实例。示例:

let me = new String("Sam");
me.sex = "男";

console.log(me.sex); // "男"

值的复制

原始值和引用值在通过变量复制时也有所不同,原始值会被复制到一个新的变量,而引用值实际上是复制了值的指针。示例:

let name = "Sam";
let myName = name;

console.log(myName); // "Sam"

当 myName 初始化为 name 时,“Sam”也会被复制到 myName 中,与 name 相互独立,互不干扰,可以理解为 myName 是 name 的副本。

而引用值的复制,实际是复制了一个指针,指向堆内存中的对象,对复制后的变量进行属性操作,实际也是操作的被复制的对象,两个变量实际上是指同一对象。示例:

let me = new Object();
let you = me;

me.name = "Sam";

console.log(you.name); // "Sam"

判断值类型

我们经常使用 typeof 来判断一个变量的类型,对判断原始值的类型很有用,但如果是用来判断引用值,却显得用处不大,因为对于引用值和 null,typeof 都是返回的 object。

通常情况下,我们需要确切知道,这是一个什么类型的对象,于是便有了 instanceof 操作符。语法为:

result = variable instanceof constructor

instanceof 返回一个 Boolean 值。示例:

console.log(person instanceof Object);
// 变量 person 是 Object 吗?

console.log(colors instanceof Array);
// 变量 colors 是 Array 吗?

console.log(pattern instanceof RegExp);
// 变量 pattern 是 RegExp 吗?

如果使用 instanceof 检测原始值,则会始终返回 false,因为原始值不是对象。

总结

到此这篇关于关于ECMAScript中的原始值和引用值的文章就介绍到这了,更多相关ECMAScript原始值和引用值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于ECMAScript中的原始值和引用值详解

    目录 前言 什么是动态属性 值的复制 判断值类型 总结 前言 这应该是很基础的 JavaScript 的知识点,但估计很多小伙伴都只是简单带过,到面试时一问三不知.这里结合我之前的笔记,再简单的介绍下原始值和引用值的相关知识,来,开始. ECMAScript 规定变量可以包含两种数据类型,要么是原始值(primitive value),要么是引用值(reference value),原始值即为最简单的数据构成,而引用值是指由多个值构成的对象. 一共包含六种原始值,分别是:Undefined.Nu

  • JS中原始值和引用值的储存方式示例详解

    在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfined 引用值指的是复合数据类型的值,包括:Object.Function.Array.Date.RegExp 根据数据类型不同,有的变量储存在栈中,有的储存在堆中.具体区别如下: 原始变量及他们的值储存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始

  • JavaScript中原始值和引用值深入讲解

    目录 值和引用相关内容 1. 简单值(原始值) 2. 复杂值(引用值) 3. 访问方式 4. 比较方式 5. 动态属性 6. 变量赋值 灵魂拷问 总结 值和引用相关内容 在 JavaScript 中,数据类型整体上来讲可以分为两大类:基本类型和引用数据类型 基本数据类型,一共有 6 种: string,symbol,number,boolean,undefined,null 其中 symbol 类型是在 ES6 里面新添加的基本数据类型. 引用数据类型,就只有 1 种: object 基本数据类

  • JavaScript检测原始值、引用值、属性

    在 JavaScript 中,我们常常会看到这样的代码:变量与 null 的比较(这种用法很有问题),用来判断变量是否被赋予了一个合理的值.比如: var Controller = { process: function(items) { if (items !== null) { // 不好的写法 items.sort(); items.forEach(function(item) { // 执行一些逻辑 }); } } } 在这段代码中, process() 方法显然希望 items 是一个

  • JavaScript数据操作_浅谈原始值和引用值的操作本质

    我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两个不同的概念.例如,null是null类型的唯一值.undefined是undefined类型的唯一值.而true和false是boolean类型仅有的两个值等.在任何语言中,值的操作都可以归纳为以下3个方面. 复制值:即把值赋值给新变量,或者通过变量把值赋值给另一个变量.属性或数组元素. 传递值:

  • 浅析JS原始值和引用值问题

    原始值->基本类型 Number String Boolean undefined null 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置 动态语言->脚本语言->解释型语言->弱类型语言 静态语言->编译型语言->强类型语言 null 空值 初始化组件 函数 销毁函数 占位 引用值 object array function date RegExp 如果一个值是引用类型的,那么它的存储空间将从堆中分配.由于引用值的大小会改变,所以不

  • C++11右值引用和转发型引用教程详解

    右值引用 为了解决移动语义及完美转发问题,C++11标准引入了右值引用(rvalue reference)这一重要的新概念.右值引用采用T&&这一语法形式,比传统的引用T&(如今被称作左值引用 lvalue reference)多一个&. 如果把经由T&&这一语法形式所产生的引用类型都叫做右值引用,那么这种广义的右值引用又可分为以下三种类型: 无名右值引用 具名右值引用 转发型引用 无名右值引用和具名右值引用的引入主要是为了解决移动语义问题. 转发型引用的引

  • Java中值类型和引用类型详解

    我们都知道java是一种面向对象的编程语言,但是在实际意义上java并不是纯面向对象,因为面向对象的意义就是万物皆对象,那么如果说int类型的变量也是一个对象的话,那么我们应该能用"."这个东西访问到它的属性或者是方法,例如: import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List<Integer>

  • python中函数默认值使用注意点详解

    当在函数中定义默认值时,值初始化只会进行一次,就是执行到def methodname时执行.看下面代码: from datetime import datetime def test(t=datetime.today()): print t if __name__ == "__main__": test() test() 两次方法调用输出的时间都为同一个值,而不是我们预想当前执行时间.对于上面这种情况,建议用下面的方式实现: from datetime import datetime

  • C# List集合中获取重复值及集合运算详解

    话不多说,直接上实例: 一.获取集合内重复值 public void GetDuplicateValue() { List<string> lisA = new List<string> { "A", "B", "C", "A" }; //方式一 借助字典 Dictionary<string, int> dic = new Dictionary<string, int>(); l

随机推荐