之前在学习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.

关于javascript数据存储机制的一个案例。的更多相关文章

  1. JavaScript -- 数据存储

    Cookie Web应用程序是使用HTTP协议传输数据的.HTTP协议是无状态的协议. 一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从连接上跟踪 ...

  2. Java数据存储机制的实现

    原文地址:http://yanwushu.sinaapp.com/java_data_storage/ Java程序在执行时须要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存 ...

  3. Java的运行时数据存储机制

    原文地址:http://yanwushu.sinaapp.com/java_data_storage/ Java程序在运行时需要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存 ...

  4. 1、安卓数据存储机制——sharedPreference

    项目中用到的数据存储方式: 1.这个项目里的“个人标签“.”个性签名“页面的文字存储——sharedPreference:我们项目中用到的Preference来保存用户编辑的标签.签名内容,并支持用户 ...

  5. JS中浏览器的数据存储机制

    一.JS中的三种数据存储方式 cookie.sessionStorage.localStorage 二.cookie 1.cookie的定义: cookie是存储在浏览器上的一小段数据,用来记录某些当 ...

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

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

  7. JavaScript数据存储和深浅拷贝实际运用

    JavaScript分两种数据类型.1.简单数据类型有:number, string, boolean, undefined和null当声明一个简单数据类型的变量时,在内存中会把数据存在栈里.2.复杂 ...

  8. 【前端学习笔记05】JavaScript数据存储Cookie相关方法封装

    //Cookie设置 //设置新cookie function setCookie(name,value,duration){ var date = new Date(); date.setTime( ...

  9. Android数据存储(三)——SQLite

    如果需要一个更加健壮的数据存储机制,则需要使用一个关系型数据库,在Android上,则为SQLlite. SQLite的特点:轻量级.嵌入式的.关系型数据库.可移植性好,易使用,小,高效且可靠,与使用 ...

随机推荐

  1. 第五章 深入class文件结构(待续)

    JVM指令集简介 class文件头的表示形式 常量池 类信息 Fields和Methods定义 类属性描述 Javap生成的class文件结构

  2. 11-10SQLserver基础--数据库之视图

    视图 视图实际就是对表的连接展现出来的结果建成的虚拟表.简单来说,视图实际上就是一个虚拟的表,通过表与表之间的关系连接起来,方便查询时使用. 首先,将需要连接的语句存储到数据库中,定义新的视图名代替连 ...

  3. 类型:.net;问题:asp.net window验证;结果:细说ASP.NET Windows身份认证

    细说ASP.NET Windows身份认证 阅读目录 开始 认识ASP.NET Windows身份认证 访问 Active Directory 在ASP.NET中访问Active Directory ...

  4. ORA-00904: 标识符无效——解决方案

    转自:https://blog.csdn.net/jajavaja/article/details/49122639 建表时列名用双引号引着(用Navicat工具建表默认是加上双引号的),java连接 ...

  5. 部署和调优 2.8 mysql主从配置-2

    配置主从准备工作 在主上创建一个测试的数据库 首先登录主的mysql,或者用绝对路径 /usr/local/mysql/bin/mysql mysql > create database db1 ...

  6. LAMP 2.2 Apache配置静态缓存

    这里的静态文件指的是图片.js.css 等文件,用户访问一个站点,其实大多数元素都是图片.js.css 等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器 ...

  7. Hadoop运行程序不报错只有warn也没反应也不输出结果的解决办法

    log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFact ...

  8. Codeforces 1114D Flood Fill (区间DP or 最长公共子序列)

    题意:给你n个颜色块,颜色相同并且相邻的颜色块是互相连通的(连通块).你可以改变其中的某个颜色块的颜色,不过每次改变会把它所在的连通块的颜色也改变,问最少需要多少次操作,使得n个颜色块的颜色相同. 例 ...

  9. Tensorflow梯度下降应用

    import tensorflow as tfimport numpy as np #使用numpy生成随机点x_data = np.random.rand(100)y_data = x_data*0 ...

  10. EZOJ #79

    传送门 分析 在经过若干次操作之后一定会产生一堆环 而我们又发现从一个点到另一个点实际可以经过所有环 于是问题就转换成了$k_1s_1 + k_2s_2 + ... + len = t$ 其中$s_i ...