原始值与引用值

《JavaScript高级程序设计-第四版》笔记

原始值与引用值

ECMAScript变量包含两种类型:原始值和引用值。

动态属性:引用值可以随时添加、修改和删除其属下和方法;原始值不行

//引用值:将创建的对象赋值给person变量;给该对象添加了一个name属性let person=new Object()person.name='小明'
//原始值:不能有属性let name='小明'name.age=16 //undefined

复制值

原始值的复制

let num1=5let num2=num1 //num2会得到5,变成了num1的副本。但num2与num1是完全独立的。

引用值的复制

let obj1=new Object()let obj2=obj1 

引用值的复制实际上是复制了指针,两个变量指向的是同一个对象,及两者改变与访问的都是同一个对象。

传递参数

ECMAScript中所有函数的参数都是按值传递的,即函数外的值会被复制到函数内部的参数中。如果是原始值,那么就跟原始值变量的复制一样,如果是引用值,就跟引用值变量的复制一样。

原始值的传递

function addTen(num){    num =10    return num}let count1=10let count2=addTen(count1)consolo.log(count1)//10consolo.log(count2)//20

addTen(num)的参数num是一个局部变量。在调用函数时,count作为参数传入函数中,count的值会被复制到num中。参数num与变量count互不干扰。

引用值的传递

function setName(obj){    obj.name='小明'    obj=new Object()//设置成新对象    obj.name='小红'}let person=new Object()setName(person)consolo.log(person.name)//小明

同理,变量person被复制到参数obj中,此时变量person与参数obj指向的是同一个对象。所以当函数内部给obj添加了name属性,该结果也会反映在外部变量person身上。

而为什么结果不是小红,这是因为参数是按值传递的,其原始的引用不变。当参数obj被设置成了新对象时,它变成了指向本地对象的指针, 该本地对象在函数执行结束时会被销毁。

确定类型

前面提到了typeof操作符,适合用来判断一个变量是否为原始值。如下图,其在判断原始值类型是很有用,但是不能判断引用值类型。

可见typeof不能判断引用值的类型,为解决该问题,可以使用instanceof操作符,它可以帮助我们判断某一变量是否属于某一对象。此外,如果检测到的是原始值,会直接返回false。

//语法result=variable instanceof constructor//例子console.log(person instanceof Objcet) //变量person是由Objcet对象构建的吗?console.log(person instanceof Array) //变量person是由Array对象构建的吗?console.log(person instanceof RegRxp) //变量person是由RegRxp构建的吗?

所有引用值都是Object实例,因此通过instanceof操作符检测任何引用值和Objcet构造函数都会返回true。下面例子中,Array就是一个构造函数,它是Object的实例:

console.log(Array instanceof Object)//true

来源:https://www.icode9.com/content-4-845051.html

(0)

相关推荐

  • 深入理解new运算符

    在 JavaScript 中,new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例.创建一个对象很简单,为什么我们还要多此一举使用 new 运算符呢?它到底有什么样的魔力? 认 ...

  • 面向对象编程(中)

    继承性(inheritance) 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类 中, 那么多个类无需再定义这些属性和行为,只要继承那个类即可 多个类称为子类(派生类),单独的这个类称为父类 ...

  • 求你了,别再用 print 调试代码了

    大家好,我是小五. 对于每个程序开发者来说,调试几乎是必备技能.代码写到一半卡住了,不知道这个函数执行完的返回结果是怎样的?调试一下看看代码运行到一半报错了,什么情况?怎么跟预期的不一样?调试一下看看 ...

  • ECMAScript中的函数

    有 3 种定义函数的方式 函数声明 函数表达式 Function 构造函数(很少使用) 函数声明 function 关键字后需要指定函数名 function sum(num1, num2) { ret ...

  • 菜鸟记165-有些单元格不用让领导看见,浅谈EXCEL中零值、错误值的处理

    关键词:EXCEL2016:零值:错误值:COUNTIF函数:IFERROR函数:操作难度* 温馨提示:结合以下文章阅读收获更大 <菜鸟记51-查询家族lookup的必杀技套路> < ...

  • 奇门遁甲知识 | 奇门遁甲专论值符、值使门 —— 值使门内在因素

    怎样求值符与值使? 求值符的公式是,值符随时干.值符的位置随着时干走,时干在哪里,值符就跟随时干落到哪一宫位里.值符落在哪一宫,与其在原宫的地盘奇仪和九星要一起跟着走,随值符落宫同时入此宫内.下面举例 ...

  • 齐炳权:详解奇门遁甲中的值符与值使

    文/齐炳权 学习奇门遁甲要理清主次.脉络.<奇门大全>曰:"凡奇门占法,静则只查值符值使,动则专看方向.盖动者机之先见者也." 奇门遁甲局中先看值符,值使,这是纲领性的 ...

  • 值符与值使在奇门遁甲中的地位

    大家好,我是罗江普 在奇门遁甲中,谈到值符和值使,很多人可能不知道它们具体分别代表什么意思.但是,这两个符号却引领了整个事件的走向. 我来举个简单的例子,拿一个国家来讲,国家的首领就是值符,比首领小一 ...

  • e奇门遁甲知识 | 奇门遁甲专论值符、值使门 —— 值使门内在因素

    怎样求值符与值使? 求值符的公式是,值符随时干.值符的位置随着时干走,时干在哪里,值符就跟随时干落到哪一宫位里.值符落在哪一宫,与其在原宫的地盘奇仪和九星要一起跟着走,随值符落宫同时入此宫内.下面举例 ...

  • VBA实用小程序79:统计不同值或唯一值的VBA自定义函数

    excelperfect 在文章开始之前,解释一下什么是不同值?什么是唯一值? 例如,下面的一组数据: a,a,b,b,c,d,e,e,f 我们说,这组数据有6个不同值:a,b,c,d,e,f:有3个 ...

  • 高考最值及取值范围(一)斜率模型的应用

    " 斜率模型是简单解析几何中常考的类型." 斜率模型:一个分式有两个变量,自变量和因变量各自在分式的两侧,可用此模型解决最值及取值范围的题型. 课程内容引入复习 在必修二课程教材第 ...

  • Excel公式技巧88:使用FREQUENCY函数统计不同值、唯一值和连续值(上)

    excelperfect FREQUENCY函数是一个较难掌握的Excel工作表函数,这篇文章收集整理了一组运用FREQUENCY函数的公式,用来统计不同值.唯一值和连续值的数量,希望能够帮助有兴趣的 ...

  • Excel公式技巧89:使用FREQUENCY函数统计不同值、唯一值和连续值(下)

    统计满足条件的不同值 如下图5所示,想要得到与列A中字母b相对应的列B中的不同值的数量. 图5 很显然,对应于字母b的不同值为2.aa和3,共3个.使用数组公式: =SUM(--(FREQUENCY( ...