表达式:是由运算元和运算符(可选)构成,并产生运算结果的语法结构。

基本表达式

以下在ES5中被称为基本表达式(Primary Expression)
  • this、null、arguments等内置的关键字
  • 变量。即一个已声明的标识符
  • 字面量。仅包括数字字面量、布尔值字面量、字符串字面量、正则字面量
  • 分组表达式,即用来表示立刻进行计算的

这类表达式是原子表达式,是无法再分解的表达式。

复杂表达式

除基本表达式以外,还有如下表达式,称为复杂表达式,这类表达式需要其它表达式参与

  • 对象的初始化表达式、数组的初始化表达式:分明也是字面量的一种,但不把它们算作基本表达式,是因为对象字面量、数组字面量所包含的成员也都是表达式。数组初始化表达式语法如下:

    [expression,expression,expression]
    
    可以有0个及其以上个子表达式

    对象的初始化表达式如下:

    {
    expression1: expression2,
    expression1: expression2,
    expression1: expression2
    }
    在ES5及其之前,expression1只能是字符串字面量; ES6开始支持如下语法: {
    [expression1]: expression,
    [expression1]: expression,
    [expression1]: expression
    }
    expression1可以是任何返回值为字符串或Symbol类型的表达式(ES6新增的一种数据类型,Symbol可用来定义对象的唯一属性名;)
  • 函数定义表达式(注意,需与函数声明语句区分开)
  • 属性访问表达式:之前一直以为跟在对象后面的句点或者方括号是运算符,实际上不是,它们是属性访问表达式的语法结构的一部分。属性访问表达式语法如下:
    expression.identifier
    
    其中,expression可以是任意的表达式,identifier是属性名(必须合法)

    或者

    expression1[expression2]
    
    其中,两个expression可以是任意的表达式
    expression2的值会被转化为字符串(除非它是一个Symbol类型)
  • 调用表达式: 分为“方法调用”与“函数调用”。方法调用的语法是:
    expression0([[expression1[,expression2[,expression3]]])
    
    其中,expression是一个返回值为函数对象的属性访问表达式,小括号提供一个逗号分隔的参数列表。

以上所有表达式,由于未使用运算符,称为单值表达式。除此之外的叫做复合表达式

JavaScript表达式总有返回值,其中,单值表达式的结果是值本身,其他表达式结果是根据运算符进行运算的结果值。

由于每个表达式都有返回值,因此每个表达式都能作为“邻近”的表达式的运算元参与运算。可以将无限个表达式“邻近”地连接成复合表达式

总结:分类如下

  • 单值表达式:不使用运算符的表达式

    • 简单表达式:不能再分解的表达式
    • 复杂表达式:需要其它表达式参与的表达式
  • 复合表达式:由运算符将多个单值表达式结合而成的表达式

所有表达式均有返回值

===============================

语句:JavaScript代码由语句构成,表明了执行过程的流程、限定和约定,形式上可以是单行语句,也可以是由大括号括起来的复合语句。语句由分号来分隔。语句是“使某事发生”的指令,不存在返回值一说

当语句位于以下地点之一时,可以省略分号(不会出现语法错误,但可能造成执行阶段的错误):

  • 一行的最后
  • 整个代码文件的最后
  • 在语法分隔符之前(如复合语句的大括号“}”)
  • 复合语句的大括号“}”之后

其它情况下遗漏分号,会在语法分析过程中报错,全部代码完全不执行。

语句中比较特殊的一类是表达式语句,表示“只有表达式,没有其它语法元素的语句”,例如:

1+2+3;

就是一个表达式语句。

链接:https://www.zhihu.com/question/39420977/answer/81250170

理解JS表达式的更多相关文章

  1. 怎么理解js中的事件委托

    怎么理解js中的事件委托 时间 2015-01-15 00:59:59  SegmentFault 原文  http://segmentfault.com/blog/sunchengli/119000 ...

  2. 理解JS闭包

    从事web开发工作,尤其主要是做服务器端开发的,难免会对客户端语言JavaScript一些概念有些似懂非懂的,甚至仅停留在实现功能的层面上,接下来的文章,是记录我对JavaScript的一些概念的理解 ...

  3. 全面理解js面向对象

    前言 当今 JavaScript 大行其道,各种应用对其依赖日深.web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学 ...

  4. javascript深入理解js闭包(转)

    javascript深入理解js闭包 转载  2010-07-03   作者:    我要评论 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...

  5. 【学习笔记】深入理解js原型和闭包系列学习笔记——精华

    深入理解js原型和闭包笔记: 1.“一切皆是对象”,对象是属性的集合. 丨 函数也是对象,但是使用typeof时为什么函数返回function而 丨  不是object呢,js为何要对函数做这样的区分 ...

  6. 【学习笔记】深入理解js原型和闭包(9)—— 简述【执行上下文】下

    继续上一篇文章(https://www.cnblogs.com/lauzhishuai/p/10078231.html)的内容. 上一篇我们讲到在全局环境下的代码段中,执行上下文环境中有如何数据: 变 ...

  7. 【学习笔记】深入理解js原型和闭包(8)——简述【执行上下文】上

    什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览器在执行console.log(a)时, ...

  8. 深入理解JS中的对象(三):class 的工作原理

    目录 序言 class 是一个特殊的函数 class 的工作原理 class 继承的原型链关系 参考 1.序言 ECMAScript 2015(ES6) 中引入的 JavaScript 类实质上是 J ...

  9. 深入理解JS:执行上下文中的this(二)

    目录 序言 Function.prototype.bind() 方法 箭头函数 参考 1.序言 在 深入理解JS:执行上下文中的this(一) 中,我们主要深入分析全局环境和函数环境中函数调用的 th ...

随机推荐

  1. js 实现tab栏切换效果

    效果图: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  2. python使用easyinstall安装xlrd、xlwt、pandas等功能模块的方法

    在日常工作中,使用Python时经常要引入一些集成好的第三方功能模块,如读写excel的xlrd和xlwt模块,以及数据分析常用的pandas模块等. 原生的python并不含这些模块,在使用这些功能 ...

  3. centos崩溃后如何修复

    首先看能不能进单用户模式,能进去,就用mount -o remount,rw / 重置成可写的. 不能进单用户模式,就进入光盘救援模式,进去挂载了系统,这时候通常是必要的动态静态库出了问题,先应该做的 ...

  4. element-ui table多选CheckBox参数解析

    element-UI里的table表格与多选框CheckBox的组合很常用,官网也给了很多参数,自己总结了一下,方便日后使用 1.简易用法,没有附加的功能 要在表格里使用CheckBox很简单,只需设 ...

  5. vue,新手上路,基础,常见问题

    1. 报这个错的  都是关键字问题,不要用关键字 做为组件的名字,不然肯定都会报错,如果找不到就一个字母的看,我就是 忘记改组件的名字导致报错,这个问题   改个名字就好,切记改全不然只有页面报错,文 ...

  6. js中报错"Maximum call stack size exceeded"解决方法

    Uncaught RangeError: Maximum call stack size exceeded 错误直译过来就是“栈溢出”,出现这个错误的原因是因为我进行了递归运算,但是忘记添加判断条件, ...

  7. Java_方法的基本语法格式

    [修饰符] 返回值类型 方法名称([参数列表]){ 方法体 } [ ]中的内容是可有可无的 暂时将方法的修饰符编写为 public static 返回值类型有两种情况 : 第一种:无返回值类型,也就是 ...

  8. cuda9.0 中不存在libnppi.so

    编译一个caffe版本,报错找不到 -lnppi 发现使用打是cuda9.0, 但是cuda9.0 中不存在libnppi.so. 只好换成cuda8.0.

  9. Ubuntu 16.04安装IntelliJ出品的数据库管理工具DataGrip

    IntelliJ出品的东西有一个共同特定,就是代码提示做的非常好. DataGrip是除了MySQL Workbench之外的另一个选择. 一.下载 https://www.jetbrains.com ...

  10. mysql故障总结

    MYSQL故障排查 https://zhuanlan.zhihu.com/p/27834293