这是一个“然并卵”的问题,因为没有人愿意在代码中给自己找这种麻烦,看到书上讲到这个问题忍不住想顺势总结下,就从表达式说起吧。

  在js中,同一般的语言一样,表达式分很多种。

  • 对象和数组的初始化表达式:即声明一个对象或数组(有时也可看成对象)值,如
    var arr1 = [];                 //空数组
var arr2 = [1,2,3+5];
var arr3 = [1,,3,,6];
var obj1 = {}; //空对象
var obj2 = {x:3, y:5};

  逗号之间可以空着不写,js默认将其定义为undefined,而对象的属性在有空格时需要加引号以构成字符串的属性名,属性值可以是任意类型。嵌套定义也可以。通过这个中直接声明而来的,一般将其称为原始值或直接量,因为它们与真正通过new关键字得到的对象数组有一点差别。

  • 函数定义表达式:即将函数定义赋给一个变量,函数通过变量来调用,如
    var vl = function(){ document.write("function to a var.<br/>"); };
vl();
  • 属性访问表达式:主要是obj[index]跟obj.prop两种形式,前者一般用于数组,后者一般用于对象,如
    var arr = [1,2,3];
document.write(arr[0]+"<br/>");
var obj = {x:1, y:5};
document.write(obj.x+" "+obj["y"]);
  • 调用表达式:对普通函数的调用统称为函数调用,如果调用的是一个对象的方法,则可称为方法调用,如
   function  fun(){
;
}
fun(); //函数调用
function Game(name){ //构造函数
this.name = name;
this.fly = function(){;}
}
var flappy_bird = new Game("flappy_bird");
flappy_bird.fly(); //方法调用

  类似于对对象属性的引用,方法调用也会先计算点号左边是否是一个对象,不是对象的话将会抛出类型错误。

  • 对象创建:跟其他高级语言有点像,如
    var arr = new Array(1,2,3);
var o = new Object;
var date = new Date();

  还有跟运算符相关的算术表达式、关系表达式、逻辑表达式等、赋值表达式等,值得注意的是js的逻辑表达式并不一定返回布尔类型的true和false,如

    var ret1 = 5 && [1,2,3];
document.write("ret1: type=>"+typeof(ret1)+" val:"+ret1+"<br/>");
var ret2 = 0 || 5;
document.write("ret2: type=>"+typeof(ret2)+" val:"+ret2+"<br/>");

  输出  

  但是在其他语言,比如php中,逻辑表达式的最终结果一定是布尔型的,这点需要区别。

  我们更容易忘记的是最简单的情形:原始表达式。所谓原始表达式是表达式的最小单位,它不在包含其他表达式,它就是最简单的常量、变量、原始值或关键字,如

    //原始值
15;
"hello";
/[A-Z]\d+/; //关键字
null;
false; //变量
index;
sum;

  跟运算符扯上关系的,肯定要考虑运算符的优先级、结合性,优先级高的先运算,优先级高的先运算,还要看看是从左到右还是从右到左,比如经常用的连续赋值

    var a = b = c = 1;

  因为赋值运算符的结合性是从右到左,所以上面又等价于下面这样的:

    var a = (b = (c = 0));

  最后一点是运算符的运算顺序,通常我们只需要考虑优先级与结合性就够了,谈到运算顺序,它涉及的的是子表达式(父子关系总是相对的),如下面一段计算式

   w = x + y * z

  子表达式就是w、x、y、z,因为是最简单的变量,所以它们是原始表达式,js是按照从左到右的顺序来计算子表达式的,这里先依次计算w、x、y、z的子表达式的值,然后根据优先级和结合性,先计算y+z的值,再与x相加,将结果赋值给表达式w所指代的某个变量。

而我们一般碰到的情况是,计算x子表达式的时候,对y不会产生什么影响,一旦产生了影响(使用特殊运算符),如改变了y子表达式的值,这称为运算符的副作用(side effect)。能改变子表达式的值,肯定要对它赋值,所以一般具有赋值作用的运算符容易产生副作用,严格的说等号具有副作用,当然一般用等号肯定就是要改变等号左边表达式的值,谈个毛线副作用。

  回到(i++)+(++i),使用具有隐式赋值作用的自增运算符,自减自然也算,就产生副作用了,前面的先各一个i子表达式的初始值,假设i初始值为1,然后计算i++时,由于自增原因,自增计算过程中对 i 进行了赋值运算,i++这个整体表达式的值仍为1,再计算++i 时,i 这个子表达式的值已经是2(前面的赋值改变了它的大小),所以后面 i++的值是3,总的结果就是4。其他的,c/c++等的理解方式几乎相同。

  放佛又回到曾今被老师坑惨的c语言考试题=_=

关于类似(i++)+(++i)的更多相关文章

  1. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  2. CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口

    CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口 开始 像下面这样的四个视口的功能是很常用的,所以我花了几天时间在CSharpGL中集成了这个功能. 在CSh ...

  3. 自己动手,实现一种类似List<T>的数据结构(一)

    前言 上一篇文章<Unity3D中常用的数据结构总结与分析>简单总结了一下小匹夫工作中经常遇到的一些数据结构.不过小匹夫一直有种观点,就是光说的热闹实际啥也不做真的没啥意思.光说不练假把式 ...

  4. 自己动手,实现一种类似List<T>的数据结构(二)

    前言: 首先,小匹夫要祝各位看官圣诞快乐,新年愉快-.上一篇文章<自己动手,实现一种类似List<T>的数据结构(一)> 介绍了一下不依靠List<T>实现的各种接 ...

  5. 1000行代码实现MVVM (类似Angular1.x.x , Vue)

    最近花了近半个多月的时间, 自己纯手工写了一个很小型的类angularjs/vue的mvvm 库. 目前已经用于公司一个项目. 项目托管在github https://github.com/leonw ...

  6. 如何在web中实现类似excel的表格控件

    Execl功能非常强大,内置的很多函数或公式可以大大提高对数据的加工处理能力.那么在web中有没有类似的控件呢?经过一番搜寻,发现handsontable具备了基本的excel功能支持公式,同时能对数 ...

  7. CSS类似微软中国首页的竖向选项卡

    效果体验:http://hovertree.com/texiao/css/24/ 源码下载:http://hovertree.com/h/bjaf/hardklps.htm 代码如下: <!DO ...

  8. 【WP8.1】类似“IT之家” 自定义消息 的实现

    曾经在WP7.WP8下的消息 使用的都是Coding4Fun.Phone.Toolkit里面的ToastPrompt类来实现的. 现在我们来自己做个类似IT之家的这种效果:从右边弹出,经过几秒后会自动 ...

  9. kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  10. Mac下的类似apt-get的包管理工具Homebrew(笔记)

    对于一个习惯了在 Ubuntu 的终端上通过 apt-get 来安装工具软件的我来说,也希望在Mac上找到类似的工具,能很方便的一条命令就能安装所需的软件,而不用手工的去查找下载编译,或者是折腾安装所 ...

随机推荐

  1. Swift 实现Bitmask Option(Enum)

    在Swift中实现ObjC中的NS_OPTION不是通过enum,而是通过conform RawOptionSetType protocol的struct来实现的. 代码如下: struct Test ...

  2. myeclipse如何导入相应的jar包

    方法一: 相应的项目------>右键------->build path-------->Config BuildPath...------->Libraries------ ...

  3. C# 如何编辑文件的摘要信息

    我的以前的测试报告程序需要在倒完测试数据报告后,在文件摘要中加上一些类似版权说明的文字等等. 因此需要对文件摘要信息进行编辑. 我的记忆中以前好像只有office文档才可以又摘要信息, 现在看来基本上 ...

  4. Java读取Properties配置文件

    1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,使用键值对的形式来保存属性集.不过Properties的键和值都是字符串 ...

  5. 离线安装Android开发环境的方法

    对于大家从官网上下载下来的SDK其实是一个安装工具,里面啥都没有,如果在线安装的话会需要很长时间.我们同样可以从网络上用下载工具将所需要安装的东西下载下来,(同样有劳大家自己动手找找了)然后直接放入相 ...

  6. Swift - 本地消息的推送通知(附样例)

    使用UILocalNotification可以很方便的实现消息的推送功能.我们可以设置这个消息的推送时间,推送内容等. 当推送时间一到,不管用户在桌面还是其他应用中,屏幕上方会都显示出推送消息. 1, ...

  7. iOS-swift环形进度指示器+图片加载动画

    demo.gif 如图,这个动画的是如何做的呢? 分析: 1.环形进度指示器,根据下载进度来更新它 2.扩展环,向内向外扩展这个环,中间扩展的时候,去掉这个遮盖 一.环形进度指示器 1.自定义View ...

  8. linux 文件系统的管理 (硬盘) 工作原理

    一.系统在初始化时如何识别硬盘 1.系统初始时根据MBR的信息来识别硬盘,其中包括了一些执行文件就来载入系统,这些执行文件就是MBR里前面446bytes里的boot loader 程式,而后面的16 ...

  9. 架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层

    1.概述 前两遍文章中,我们一直在说后文要介绍Nginx + Keepalived的搭建方式.这篇文章开始,我们就来兑现前文的承诺,后续的两篇文章我们将介绍Nginx + Keepalived和 LV ...

  10. Line in和Mic in的区别及使用

    Line in和Mic in的区别及使用 我们的电脑声卡上,一般都会有Line in和Mic in两个接口,翻译成中文就是“线性输入”和“麦克风输入”,这两个都是输入端口,但是还是有区别的: 1.Li ...