zoukankan      html  css  js  c++  java
  • js 关于运算顺序的问题

    先介绍涉及到的概念

    表达式:js中的短语,解释器在遇到表达式时,会将短语进行计算,然后再参与到运算中,表达式即js中的短语。

    j所有的s代码都是由操作符和表达式组成的,因此除了操作符,其他的都是js中的表达式。

    如1 + 1 这段代码中,+是操作符,前面的1和后面的1都是表达式。

    表达式的分类:

    原始表达式:常量(如π)、变量、直接量(数字、字符串、正则表达式)、关键字

    初始化表达式:初始化对象和初始化数组

    函数定义表达式:

    函数调用表达式:

    属性访问表达式:

    对象创建表达式:使用new操作符创建函数

    优先级:

    优先级由高至低顺序:属性访问、一元操作符、乘除、加减、比较(<,>等)、判断相等(==,===,!==,!=)、与、或、三目运算、赋值运算

    总结:属性访问表达式拥有最高优先级,其次是以操作符(new也属于一元操作符),优先级最低的是赋值运算。

    例子:

    var a = 3;
    ++a == 3;//false

    上面的例子的结果是数值还是布尔类型,取决于运算的优先级,如果先进行判断a == 3,然后再执行++操作,那么结果是 a = 2,如果是先执行++运算,再判断a == 3,结果是false.

    结和性:(优先级相同时看结合性)

    分为左结合和右结合,

    js中遵循右结合的有:一元操作符、三目运算、赋值运算,

    其他所有都是遵循左结合的。

    例子:

    var a = 3;
    !a++;

    上面的例子中有两个操作符,一个是!,另一个是++,这两个都是一元操作符,如果从左至右进行计算,那结果是1;但是一元操作符是遵循右结合的,也就是说这个语句会先进行a++运算,然后再对a进行取非运算,结果是false.

    再来一个例子:

    x = a ? b : c ? d : e ? f : g

    我看到的时候是很懵的,虽然应该不会有人这么写,但是这种写法是可以存在的,所以我们也要知道是怎么执行的,三目运算也是右结合性的,所以上面的例子等价于:x = a ? b : (c ? d : (e ? f : g )) 

    最后是运算顺序:

    js中的表达式包含表达式时,运算顺序是从左至右。

    var a = 1;
    b = a++ + a;
    var  a = 1;
    b = a++ + ++a;

    猜猜上面两个例子中执行后a和b分别等于什么

  • 相关阅读:
    (转)PHP 的 __FILE__ 常量
    smarty半小时快速上手教程(转)
    Namespace declaration statement has to be the very first
    ThinkPhp3.2 无法加载模块:Index
    注意mysql中的编码格式和php中的编码格式一致
    MySQL数据库备份与恢复方法(转)
    phpmyadmin设置id自增(AUTO_INCREMENT)(转)
    (转)用eclipse创建一个j2ee的web工程后,左面projects窗口中的项目如何没有显示webRoot文件夹,除了src的文件夹,其他都不显示
    CentOS6.8 安装 Nginx
    Eclipse Java注释模板设置详解
  • 原文地址:https://www.cnblogs.com/leraine/p/7610624.html
Copyright © 2011-2022 走看看