Javascript高级编程学习笔记(8)—— 变量

时间:2022-09-23 16:42:37

日常更新~~

变量

所有的编程语言中,变量都是赋予语言灵活性的根本所在。

那么JS中的变量又有那些与众不同的地方呢、?

按照ECMA-262的定义,JS的变量和其他编程语言的变量有很大的区别

其松散类型的本质,决定了JS中的变量只是在某个特定的时期,用于保存特定值的一个名字

变量保存的值及其类型可以在脚本的生命周期内进行改变,这也是JS强大又让人难受的关键。

基本类型的值和引用类型的值

首先,在许多编程语言中几乎都有基本类型和引用类型这两个概念。

通常来说,对于基本类型的值变量保存的是值本身。

对于引用类型,变量保存的往往是值的地址。

在JS中这两个概念与之十分类似,但又有所区别。

定义如下:

基本类型的值指的是简单的数据段,而引用类型指的是那些可能由多个值构成的对象

按照该定义,在6大数据类型中(不算ES6新增)

有5类属于基本数据类型 Undefined Null Number  String Boolean

只有Object属于引用类型的值

PS. 在其它语言中String往往以对象的形式存在,所以是引用类型

而对于引用类型,JS和其他语言也有许多的区别。

1.引用类型保存在内存中,但JS无法直接访问内存中的位置,所以无法操作对象的内存空间

2.在操作引用类型的值的时候,如果是赋值等操作操作的是对象的引用而非实际的对象 ,而为对象添加属性,那么操作的是对象本身

关于属性

在JS中我们可以为基本类型的值添加属性,但这个操作并没有用,说明只能给引用类型动态地添加属性

Javascript高级编程学习笔记(8)—— 变量

那么许多小伙伴们可能就有疑问了,既然基础类型不能添加属性,那么基础类型的那些方法又是从那来的呢?

这些方法都来自基本包装类,具体的之后写对象的时候会详细介绍

复制变量值

除了保存方式之外,关于两种类型的值的赋值,也存在许多差异。

对于基本类型,复制值会为新的变量创建一个值的副本,所以前后两个变量相互独立,对其进行操作互不影响。

Javascript高级编程学习笔记(8)—— 变量

而对于引用类型,复制只会复制引用(即指针也就是说两个变量都指向同一个地址)

由于二者都指向堆内存中的同一地址,所以对一个进行修改另一个也会随之改变。

Javascript高级编程学习笔记(8)—— 变量

要注意的是关于引用类型的复制,其复制了引用的意思不是复制了一个指针,而是复制了一个地址

也就是说上方的a,b实际上是两个指针,通过复制让两个指针指向了同一个地址,而不是代表a,b引用了同一个指针

不相信的同学可以看看下方的例子:

Javascript高级编程学习笔记(8)—— 变量

如果a、b是同一个指针,那么我让b指向另一个对象后,a也应该指向另一个对象,然而结果并非如此。

传递参数

有了之前的铺垫,关于JS中的参数传递就很好理解了

只需记住一点:JS中参数是按值传递的

也就是说js在进行参数传递时会对变量的值进行复制,然后将复制后的值传递给函数的局部变量

两种类型的复制,规则上方已经讲解过

基础类型的值不去多说,主要看一下引用类型的值

Javascript高级编程学习笔记(8)—— 变量

我们可以看到,setName函数成功为person设置了name属性,但是obj的指向改变后person没有改变

这也能够充分地说明JS中的函数是按值传递的,只不过这个值不是对象本身,而是地址

检测类型

我们已经大致地了解了,基本数据类型,和引用数据类型的区别。

那么对于JS这种值类型可以随时转换的语言,当然是有办法判断一个变量是基本类型,还是引用类型的。

办法就是typeof操作符,以及instanceof操作符

通常来说,确定一个值的类型,会走如下流程:

1.typeof判断是否为基础数据类型

2.若为“object”,再使用instanceof判断到底是哪一类的引用类型(对象)

PS. instanceof对于基础数据类型始终返回false,所以需要先使用typeof判断该变量到底是不是基础数据类型

PS. 对于正则对象,一些低版本浏览器中typeof会返回”function“,这是因为在这些浏览器内部正则对象都实现了[[call]]方法

对于JS中的变量就谈到这里,欲知后事如何请听下回分解

Javascript高级编程学习笔记(8)—— 变量的更多相关文章

  1. Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量

    私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...

  2. Javascript高级编程学习笔记(3)—— JS中的数据类型(1)

    前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列. 文章中有什么不足之处,还望各位大佬指出. JS中的数据类型 上一篇中我写了有关JS引入的Script标签相关的东西 ...

  3. JavaScript高级编程学习笔记(第三章之一)

    继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...

  4. Javascript高级编程学习笔记(98)—— WebGL(4) WebGL上下文(2)

    错误 Javascript与WebGL之间的一个最大区别在于,WebGL的操作一般不会抛出错误 如果希望获取WebGL的错误信息,那么就需要手动调用  gl.getError() 方法 该方法会返回以 ...

  5. Javascript高级编程学习笔记(1)—— JS简介

    此系列文章,用于记录所学,如有错误欢迎指出. Javascript组成 1.核心(ECMAScript) 2.文档对象模型(DOM) 3.浏览器对象模型(BOM) 1.核心(ECMAScript) E ...

  6. Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域

    昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...

  7. Javascript高级编程学习笔记(23)—— 函数表达式(1)递归

    前面的文章中,我在介绍JS中引用类型的时候提过,JS中函数有两种定义方式 第一种是声明函数,即使用function关键字来声明 第二种就是使用函数表达式,将函数以表达式的形式赋值给一个变量,这个变量就 ...

  8. Javascript高级编程学习笔记(18)—— 引用类型(7)单体内置对象

    什么是内置对象呢? js高级程序设计中给出的定义为:由ES规定不依赖于宿主环境的对象,这些对象在JS执行前就已经存在 前面我们介绍的引用类型都是内置对象 除了这些对象外ECMA还规定了两个单体内置对象 ...

  9. Javascript高级编程学习笔记(10)—— 作用域、作用域链

    昨天介绍了,JS中函数的作用域 什么词法环境之类的,可能很多小伙伴不太明白. 在今天的内容开始之前,先做个简短的声明: 词法环境这一概念是在ES5中提出的,因为词法环境主要用于保存let.const声 ...

随机推荐

  1. EXCEL如何提取文字中包含的数字?

    方法1:=IF(ISERROR(FIND("-",A1)),"","-")&MID(SUM(MID(101&A1,2+LAR ...

  2. 讨论一下js获取响应中后台传回来的BigInteger类型的数字时,后几位会自动变为0的问题

    后台返回的json:{"data":12345678912345678912} 在js中获取该data得到的值为:12345678912345680000 后经过实验发现,只有数字 ...

  3. nginx自学

    需要了解的linux的命令: linux的命令:netstat -antnetstat -antp(天假了参数P)ps aux | grep 80kill -9 2985 号进程pkill -9 ht ...

  4. C++之路进阶——hdu2222(Keywords Search)

    /*Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...

  5. python 基础——generate生成器

    通过列表表达式可以直接生成列表,不过列表一旦生成就需要为所有元素分配内存,有时候会很消耗资源. 所以,如果列表元素可以按照某种算法推算出来,这样就不必创建完整的list,从而节省大量的内存空间. 在P ...

  6. 网络安装CentOS 5.3

    转自网络安装CentOS 5.3 0. 基本要求 (1) 需要使用至少两台服务器:其中一台没有操作系统,是我们即将安装的服务器;另外一台是已经安装好操作系统的服务器,我们用来存储CentOS的安装文件 ...

  7. 02-从零玩转JavaWeb-类与对象

    配套视频:对象与类 一.什么是对象 包含特性和行为的一个实体   下图当中,"颜色"和"体重"属于"特性或叫状态" "咬人&quo ...

  8. java线程通信与协作小结 多线程中篇(十六)

      在锁与监视器中我们对Object中的方法进行了简单介绍 以监视器原理为核心,三个方法:wait,notify.notifyAll,可以完成线程之间的通信 当然,不会像“语言”似的,有多种多样的沟通 ...

  9. JAVA获取汉字拼音首字母

    package com.common.util; import java.io.UnsupportedEncodingException; /** * 取得给定汉字串的首字母串,即声母串 * Titl ...

  10. Leetcode 145

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...