首页新闻动态正文

JS内存机制和运算符【黑马web前端】

更新时间:2019年07月26日 11时15分48秒 来源:黑马程序员论坛



每一种语言都会存在内存机制,往往是需要调用内存的时候占用一部分内存空间,当不需要调用的时候自动清除这部分内存(垃圾回收),在JS里也是这样,只是在某些时候,JS解析器(解释分析并运行JS代码的东西)不知道什么时候可以回收该内存(闭包就是这样,在后续会讲)。而且JS里的基本数据类型和引用数据类型占用内存的方法也不一样哦,下面就一一分析:


1基本数据类型只用栈内存


<script>
    var a=10;
</script>
当JS解释器在运行到这个代码时,会做两件事,一是先声明一个变量a,然后再给这个变量a赋值为数字10
那么在内存里这个过程是怎么实现的呢?
首先,会在栈内存(可以想象成堆叠起来的方块)里开辟一块给这个变量,然后直接在当前栈内存里给这个变量赋值数字10,不管赋值的是数字还是字符串,只要属于基本数据类型,都会占用栈内存空间,当多个变量值相等时,改变一个变量值,其余的变量不会发生改变,因为只是变量的值发生了改变。

2
引用数据类型同时使用栈内存和堆内存
<script>
    var a=new Array()   //数组的构造器写法
</script>
当JS解释器在运行到这个代码时,会做两件事,一是先声明一个变量a,然后再给这个变量a赋值为一个空数组
那么在内存里这个过程是怎么实现的呢?
首先,会在栈内存(可以想象成堆叠起来的方块)里开辟一块给这个变量,然后在堆内存(可以想象成无序排列的圆圈)里给这个数组开辟一个空间,接着栈内存里的变量会被赋值成堆内存的内存地址(一个指针,指向堆内存空间的挂钩,且唯一),所以引用数据类型同时使用了栈内存和堆内存,当多个变量都赋值为同一个数组(或者是对象)时,改变一个变量的属性,其余的变量的属性会发生改变,因为都指向一个堆内存,所以相当于直接对数组进行了操作。
可能这样写大家还是一脸懵逼,没事,咋们举个例子:
<script>
    var a=10,b=a   /*如果多个变量声明只写一个var关键字,需要将声明写在同一行,以逗号隔开*/
</script>
如果a=20;
b==a?,答案是肯定不等于,因为b当前的栈内存里面赋值的是数字10,只是a的栈内存赋值被改变成了20,相互不会影响。
再举一个例子:
<script>
    var a=[1,2,3]   //数组的字面量写法
    var b=a /*相当于b的栈内存里面赋值了a一样的内存地址,都指向同一个数组*/
    a[3]=4; /*给数组增加一个值,值为4,数组会在后续讲*/
</script>
b==a?,答案是相等的,我们可以打印下此时的b,console.log(b)。会在浏览器控制台打印出[1,2,3,4],为什么会这样呢?因为a的操作运用了数组的方法,相当于堆内存里的数组自身发生了变化,而栈内存里a和b的地址并没有发生改变
再举一个不同的例子:
<script>
    var a=[1,2,3]   //数组的字面量写法
    var b=a //相当于b的栈内存里面赋值了a一样的内存地址,都指向同一个数组
    a=[]; //给a重新赋值了一个空数组,改变了a栈内存的内存地址
</script>
这个时候a==b?肯定是不等的,因为这个时候,内存空间被会重新划分,栈内存里,a赋值为空数组的内存地址,b还是之前数组的内存地址,此时堆内存里面会有两个堆,一个是之前的数组,另一个是空数组。
最后给大家上一张图,可能会更好理解,不同数据类型的内存机制大家一定要好好理解,对后面的学习很重要。



JS里面不同变量和数据之间经常会用到运算符

1
一个等号=
JS里面一个等号可不是数学里的等于,而是赋值的意思,就是将等号后面的赋值给等号前面的

2
两个等号==和其余的数学运算符
两个等号才是数学里面的相等,可以比较==前后的值是否相等,数学里面的加减乘除在JS里也适用

只是这里有两个坑:
  • 一是加号+如果遇到前后不是纯数字会进行拼接,比如:1+”22”,只会得到字符串”122”,如果是1+22,就会得到23。
  • 第二坑是除了加号以外,所有的数学运算符在遇到字符串和数字计算时都会将字符串隐式转换成数字后再运算,比如:33-“22”会得到数字11,乘除和取余数都是一样。这个坑灵活运用起来也可以将字符串快速转换成数字,如:”22”*1或者”22”-0都可以将字符串22变成数字22


3
逻辑运算符和比较运算符
逻辑与&&        只有当前后两个都为真,才会得到true
逻辑或 ||          前后只要有一个为真,都会得到true
逻辑非!         将值取反,如果值为true,取反得到false  !=是不等于,不是逻辑运算符
逻辑运算符和两个等号一般用于判断,因为得到的值都是布尔值true或者false

4
位移运算符(用的相当少)
>>,<<,~ 这三个属于位于运算符,前两个是将值先转换成二进制,然后位移小数点再转换回十进制,最后一个也需要转换进制,取反码。这里只做了解,用的非常少

5
逗号运算符和函数运算符
(逗号用的也很少,面试可能会遇到,坑)
JS里面单独的逗号也属于运算符,意思是从左往右计算,会返回最后一个值
比如:
<script>
    var a=(1,2,3)   //最终a会赋值成3
</script>
函数运算符主要是指函数调用会用一堆圆括号();
比如:alert();这里是调用的window对象的方法

好了,讲了这么多运算符,那么它们之间有没有先后顺序呢?Bingo,运算符是有优先级的,目前Alan所了解的运算符里优先级顺序是:
数学运算符>逻辑运算符>赋值运算符>函数运算符>逗号运算符

举个例子:
<script>
    alert(3+5>5)   //会弹出true
    //这里有一个坑哦
    alert(1,2,3)   //会弹出1而不是3,因为函数运算符优先级比逗号运算符高
    alert((1,2,3))  /*如果像让逗号运算符先运算,只需在外面加一个圆括号,圆括号会使优先级提高*/
</script>

推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!