之前在学习js的结合性的时候,我有点不太明白,在网上找到一个比较经典的C语言优先级结合性的案例,就是下边这一个。本想在js之中测试一番,结果竟然发现得出的结果和网上的不一样,这令我百思不得其解,后经高人指点,我知道了这是因为js和C语言的存储方式不同,所以我就查了一点资料,了解了一下js的数据存储机制。下面我们就先来看一下这道题目吧

 

    这里是在C语言中的推导步骤 

推导步骤:
表达式:a += a -= a*a

第一步:a += a -= (a*a)
解释:表达式有三个运算符,+= ,-= , * 。会把表达式分成四个部分(a,a,a,a)。其中 * 的优先级最大。因为没有同优先级的运算符,所以不考虑结合律。* 的表达式就是 (a*a),后面看成一个整体就行了。

第二步:(a += (a -= (a*a)))
解释:还剩两个运算符,+= ,-=。这两个是赋值运算符,优先级一样,所以要考虑赋值运算符的结合律了,赋值运算结合律从右到左。所以(a -= (a*a))就是一个 -= 的表达式。
(a += (a -= (a*a)))就是 += 的表达式。

第三步:(a = a + ( a = a - (a*a)))
解释:这个不用讲了吧,ASCI标准中+=和-=的解释就是这样的。

第四部:(a = a + (a = a - (5*5)))
解释:ASCI标准中说了,赋值表达式会改变左值对象的值,所以我们不确定a的值会不会改变之前不要全部替换成5。按照算法优先级一个一个来算。不用说a*a一定是第一个算的。最里面的括号。而且a*a并没有改变a的值。

第五步:(a = a + (a = 5 - 25))
解释:继续算第二个括号,发现是一个赋值表达式,表达式的值就是左值的值,并且a的值会改变成-20啦。

第六步:(a = -20 + -20) 
解释:继续算第三个括号,里面有两个运算符,= + ,因为+的优先级高,所以+的表达式就是(-20 + -20),并且没有在改变a的值。表达式的值等于 -40

最后:a = -40

   恩,不错,写的很好很完美,那么我就在js当中运行一下吧

var a=5;a+=a-=a*a;alert('您的结果为:'+a)

 纳尼,怎么会是-15

  其实要想解决这个问题,就要知道C语言和JS在数据存储方面的不同。

首先,C语言是定义一个变量是,会在内存里开辟一个地方供变量使用,我们给这个变量起个名字a就是给这个地方,a起到的是一个指示标的作用,当我们在程序中用到a变量时,其实就是通过这个指示查到内存然后调用,而当我们修改数据是是同样的修改内存里面的数值,所以只要已修改,整个式子的a的值都变了。但是在js当中却不是这样,他的每一个a就是相当于一个盒子,并不会互相影响。那么问题就出现了。在上面第五步的时候,出现了一个赋值语句,所以在C中他找到了a变量的内存,改变了里边的数,所以第一个a也变成了-20.但是js中两个a互不影响第一个a依旧是5.

所以最后的结果C中变成了-20+(-20)=-40.

但是js中就是5+(-20)=-15.

转载于:https://www.cnblogs.com/HXP-RedBlue/p/6538245.html

关于javascript数据存储机制的一个案例。相关推荐

  1. 初探元宇宙存储,数据存储市场下一个爆点?

    2021年,元宇宙一词火爆全球,成为全社会关注的焦点. 除了在游戏和娱乐领域大有前途之外,元宇宙还能干嘛?让我们来看看元宇宙在医疗领域如何小试牛刀. "把二维CT切片组合成三维立体的'全息数 ...

  2. 全闪存助攻:数据存储迎来又一个“新元年”

    每一次数据存储产业的发展,都离不开存储技术的进步.闪存技术发展的日新月异,也带来了全闪存阵列的创新与崛起. 2020进入了全闪存元年 源自企业级用户应用需求对存储性能有了更高的要求,最终驱动闪存技术飞 ...

  3. JavaWeb-----Ajax异步请求 json对象 服务器如何返回json数据 使用ajax完成一个案例

    1. 回顾 1. servlet的生命周期: 2. filter: 过滤放行和拦截一些资源.比如:黑白名单,登录校验,编码设置等.    (1)创建一个类并实现Filter接口以及重写接口的抽象方法 ...

  4. JavaScript变量存储机制

    本文分两个部分讨论变量存储模式 局部/ 全局/ 闭包变量的存储机制: 在这部分我们讨论什么样的变量有资格存储在栈中 不同类型变量的存储机制: 在这部分我们讨论存储在栈中的元素究竟存的是字面量还是引用 ...

  5. Android 数据存储和文件使用案例分析

    很多时候我们的软件需要对处理后的数据进行存储或再次访问.Android为数据存储提供了如下几种方式: 文件 SharedPreferences(参数) SQLite数据库 内容提供者(Content ...

  6. 数据存储机制之文件存储

    今天我们来学习下文件存储.文件存储算是Android中最为基础的一种数据存储方式了.它比较适合用于存储一些简单的文本数据后二进制数据. 那么我们就先来看下Android是如何通过文件来保存数据的 将数 ...

  7. HTML5客户端数据存储机制Web Storage和Web SQL Database

    引言 html5本地存储可以选择两种方式,一种是本地存储,一种是sqlite. 比如开发html5的购物车功能,就可以考虑选择其中之一,进行本地存储与操作. 又或者保存用户登录信息,可以使用local ...

  8. mysql内置多个数据存储引擎_一个mysql数据库,既有myisam存储引擎,又有innodb存储引擎,参数如...

    key_buffer_size - 这对MyISAM表往说十分紧张.假设只是利用MyISAM表,可以把它设置为可用内存的 30-40%.合理的值取决于索引大年夜小.数据量和背载 -- 记住,MyISA ...

  9. 微信聊天记录数据存储机制

    直接在聊天框中左拉删除,sqllite数据库中仍存在聊天记录,只是不显示而已 直接删除好友,数据库中将删除有关的表,因此无法进行找回备份 软件环境:windows 7,IOS 9, itunes,pp ...

最新文章

  1. SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存
  2. 尝试在centos5下运行phantomjs2
  3. C++Runge-Kutta龙格-库塔法求非线性常微分方程的解(附完整源码)
  4. javaweb 导出文件名乱码的问题解决方案
  5. BookKeeper总结
  6. spring+redis自主实现分布式session(非spring-session方式)
  7. 7005.element-ui组件
  8. oracle wm_concat(column)函数的使用
  9. 谈家装安防防盗设备的重要性
  10. LibreCAD的基本使用
  11. 并网逆变器PI控制(并网模式)
  12. 安卓手机投屏软件_适合智能电视手机投屏的软件
  13. 【Vuforia】制作简单的AR--demo(有卡识别)
  14. [Vue warn]: Failed to resolve component: xxx
  15. UEFI开发探索32 – 有趣的图像特效
  16. 公司笔试题练习AWS
  17. 补一个游记(多图杀猫)
  18. NeuroFluid: 流体仿真的人工智能新范式
  19. 就算真的遇到卸磨杀驴了 也应该有应对策略
  20. 透彻理解css的grid布局

热门文章

  1. 百度:这次在AI领域我要做领头羊
  2. 推荐系统正成为所有领域的一种标配
  3. 全球AI人才数量“热图”分析:中国全球第7 欧洲是人才聚集地
  4. 未来智能实验室成立,建设世界第一个AI智商评测和趋势研究机构
  5. 拟阵(matroid)
  6. 信息大脑如何从物理大脑中涌现?
  7. 卫星对于物联网来说是一个非常好的选择
  8. 类脑量子叠加脉冲神经网络:从量子大脑假说到更好的人工智能
  9. 赛迪研究院发布《2019量子计算发展白皮书》
  10. 最全芯片产业报告出炉,计算、存储、模拟IC一文扫尽