数据、内存、变量的概念及三者之间的关系

什么是数据

数据就是存储在内存中代表特定信息的东西,这个东西本质上就是许多个0和1组成的

数据的特点

可传递

var a = 123
var b = 123

可运算

var a = 123
a += 1

什么是内存

内存是电脑硬件中的内存条在通电后产生的可以用于储存数据的空间,这些空间是临时的(在断电后空间会消失,数据会丢失)

内存的产生与死亡(生命周期)

内存条 ==> 通电 ==> 产生可以存储数据的内存空间 ==> 储存数据 ==> 处理数据 ==> 断电 ==> 内存空间与数据都消失

每一块内存都有对应的唯一的内存地址值

栈内存

存储着全局变量局部变量等一些基本类型数据

堆内存

储存各种对象

JS引擎如何管理内存

内存的产生与死亡(生命周期)

内存条 ==> 通电 ==> 产生可以存储数据的内存空间 ==> 储存数据 ==> 处理数据 ==> 断电 ==> 内存空间与数据都消失

内存释放的细节

  • 全局变量: 变量申明时产生,浏览器环境关闭后释放
  • 局部变量: 函数调用是产生,函数调用完毕后自动释放,被垃圾回收器回收
  • 对象类型数据: 对象先需要成为垃圾对象,然后在某一时刻(时间很快)被垃圾回收器回收

内存的自动释放,和垃圾回收器回收机制不是同一时刻进行的,即使两者的时刻相差可以忽略不计

什么是变量

变量存储着可以变化的值, 每个变量都对应着一块内存(有内存地址),变量名作为标识可以查找到对应的内存,变量值就是内存中保存的数据

变量是普通类型时

var a = 123
console.log(a)
/*
此时的状况是:
- 栈内存中开辟出了一块保存这个为123的值
- 变量名a对应着这块保存着123的内存,当然变量名也是在栈内存中的
- console.log(a)就是直接读取保存在栈内存中的变量名为a的值,这个值就是123
*/

变量是引用类型时

// obj这个变量保存的是引用类型(对象类型)的数据,所以obj是个引用类型变量
var obj = {
name: 'Fitz'
}
console.log(obj)
/*
此时的状况是:
- 栈内存中开辟出了一块保存obj这个变量名的内存
- 堆内存中开辟一块保存着对象的内存,(此时重点说明一下,无论栈内存还是堆内存中的每块内存都有其内存地址值), 对象中保存着'Fitz'这个值
- console.log(obj)读取栈内存中obj这个变量名对应的变量值,只不过这个变量值是在堆内存中保存的对象所对应的那块内存的地址值,而不是普通类型变量那样,变量值就是普通类型数据
*/ var obj2 = obj
/*
此时的状况是:
- 将在栈内存中保存的变量名为obj的变量值(内存地址),赋值给obj2
*/

数据、内存、变量的三者之间的关系

  • 内存是用于储存数据的空间
  • 变量是内存的标识,用于找到对应的内存空间,达到读取数据的目的

给函数传递实参时,是值传递还是引用传递

理解1: 都是值传递, 即都是将变量的值作为实参传递给函数的形参

var a = 1
var obj = {name: 'Fitz'}
function func1 (a) {
a = a + 1
}
function func2 (obj) {
console.log(obj.name)
obj = {name: 'Lx'}
console.log(obj.name)
} func1(a)
console.log(a) // 1
func2(obj) // 'Fitz' 'Lx'
console.log(obj.name) // 'Fitz'
/*
这个例子能说明都是值传递的理由:
- 在调用函数传递实参时,都是将变量的值(变量a的值, 变量obj的值)传递给函数的形参,只不过这个变量的值分为两种:
1. 普通数据类型的变量值就是普通类型数据
2. 对象类型(引用类型)的变量值是内存地址值(对象在堆内存中的)
*/ /*
console.log(obj.name)依然是Fitz的原因:
- 把obj的值(内存地址值)作为实参赋值给func2的形参(obj)
- 函数内部执行语句obj = {name: 'Lx'}
- 重点: 此时函数外部(全局)中的obj仍然指向{name: 'Fitz'}
而函数内部(局部)中的obj改变指向{name: 'Lx'}
- 在函数执行完毕后,形参的这个obj(局部的obj)就会变成垃圾对象准备被垃圾处理器处理
*/

理解2: 既有值传递,又有引用传递, 即变量的值是普通类型数据时是值传递,变量值是对象类型数据时是引用传递

var a = 1                   // 变量值是普通类型数据
var obj = {name: 'Fitz'} // 变量值是对象类型数据
function func1 (a) {
a = a + 1
}
function func2 (obj) {
console.log(obj.name)
obj = {name: 'Lx'}
console.log(obj.name)
} func1(a) // 此时外部变量a(全局中的a)通过值传递,传递给形参a(局部中的a)
console.log(a) // 1
func2(obj) // 'Fitz' 'Lx' 此时将外部变量obj(全局中的obj)的值(内存地址值)传递给形参obj(局部中的obj),这种传递方式叫做引用传递
console.log(obj.name) // 'Fitz'

js中数据、内存、变量的概念及三者之间的关系的更多相关文章

  1. js中的blob,图片base64URL,file之间的关系

    js的base64编码和解码 英文是这样的:// atob() 将base64解码 // btoa() 将字符串转码为base64 var str = 'javascript'; window.bto ...

  2. 《挑战30天C++入门极限》新手入门:C++中堆内存(heap)的概念和操作方法

        新手入门:C++中堆内存(heap)的概念和操作方法 堆内存是什么呢? 我们知道在c/c++中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作 ...

  3. 在JS中调用JAVA变量

    在JS中调用JAVA变量可以,方法是:var JS变量名 = “<%=JAVA变量名 %>”<%中间写java代码,跟在JSP中一样%>在JAVA中 ,无法调用JS变量

  4. JS中的内存泄漏

    明天下午面试微店的前端开发职位,有点紧张~~ 刚刚正好看到js中的内存泄露,所以来整理一番. 给DOM对象添加的属性是对一个js对象的引用. var MyObject = {}; document.g ...

  5. js语法没有任何问题但是就是不走,检查js中命名的变量名,用 service-area错误,改service_area (原)

    js语法没有任何问题但是就是不走,检查js中命名的变量名,用 service-area错误,改service_area

  6. JS中数据类型转换

    JS中数据类型转换汇总 JS中的数据类型分为 [基本数据类型] 数字 number 字符串 string 布尔 boolean 空 null 未定义 undefined [引用数据类型] 对象 obj ...

  7. js中的定义变量之①用不用var

    var 是js定义变量的意思. 由于js中的变量是弱类型的,因此js中的所有变量包括number(数字型).string(字符串类型).boolean(布尔类型,true和false)等均通过var关 ...

  8. JS中的let变量

    介绍JS中的let变量: let允许你声明一个作用域被限制在块级中的变量.语句或者表达式.在Function中局部变量推荐使用let变量,避免变量名冲突. 作用域规则 let 声明的变量只在其声明的块 ...

  9. 电脑结构和CPU、内存、硬盘三者之间的关系

    前面提到了,电脑之父——冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器. 我们看一下现在我们电脑的: 键盘鼠标.显示器.机箱.音响等等. 这里显示器为比较老的CRT显示器 ...

随机推荐

  1. AtCoder Beginner Contest 176

    比赛链接:https://atcoder.jp/contests/abc176 A - Takoyaki #include <bits/stdc++.h> using namespace ...

  2. LIS(nlogn)算法描述//线性DP经典类型

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  3. 【poj 2752】Seek the Name, Seek the Fame(字符串--KMP)

    题意:给出一个字符串str,求出str中存在多少子串,使得这些子串既是str的前缀,又是str的后缀.从小到大依次输出这些子串的长度. 解法:利用KMP中next[ ]数组的性质,依次找到前缀.后缀匹 ...

  4. SPOJ - PHRASES Relevant Phrases of Annihilation

    传送门:SPOJ - PHRASES(后缀数组+二分) 题意:给你n个字符串,找出一个最长的子串,他必须在每次字符串中都出现至少两次. 题解:被自己蠢哭...记录一下自己憨憨的操作,还一度质疑评测鸡( ...

  5. POJ - 2406 Power Strings (后缀数组DC3版)

    题意:求最小循环节循环的次数. 题解:这个题其实可以直接用kmp去求最小循环节,然后在用总长度除以循环节.但是因为在练后缀数组,所以写的后缀数组版本.用倍增法会超时!!所以改用DC3法.对后缀数组还不 ...

  6. Codeforces Global Round 9 B. Neighbor Grid (构造,贪心)

    题意:给一个\(n\)X\(m\)的矩阵,矩阵中某个数字\(k\)表示其四周恰好有\(k\)个不为0的数字,你可以使任意位置上的数字变大,如果操作后满足条件,输出新矩阵,否则输出NO. 题解:贪心,既 ...

  7. Python 往Excel写数据

    一.需求描述: 1.一张人员信息表中生成人员信息,某些列的字段要进行递增操作: 2.一个组织节点下存在1000人的限制要求: 3.一张Excel表格生成45000条数据: 二.Excel表格的表头如下 ...

  8. 一个操作系统的实现sudo mount -o loop pm.img /mnt/floppy mount point /mnt/floppy does not exist losetup device is busy

    部分参考:https://blog.csdn.net/u012323667/article/details/79266623 一. sudo mount -o loop pm.img /mnt/flo ...

  9. mysql(二)--mysql索引剖析

    1.1. 索引是什么 1.1.1.索引图解 维基百科对数据库索引的定义: 数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询.更新数据库表中数据. 怎么理解这个定义呢?  首 ...

  10. JavaScript 的 7 种设计模式

    原文地址:Understanding Design Patterns in JavaScript 原文作者:Sukhjinder Arora 译者:HelloGitHub-Robert 当启动一个新的 ...