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

基本表达式

以下在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. 【算法笔记】B1050 螺旋矩阵

    1050 螺旋矩阵 (25 分)   本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行  ...

  2. CAS总结

    n++的问题不能保证原子操作. 因为被编译后拆分成了3个指令,先获取值,然后加一,然后写回内存.把变量声明为volatile,volatile只能保证内存可见性,但是不能保证原子性,在多线程并发下,无 ...

  3. jquery ajax的getJSON使用

    getJSON的定义和用法 通过 HTTP GET 请求载入 JSON 数据. 在 jQuery 1.2 中,您可以通过使用 JSONP 形式的回调函数来加载其他网域的 JSON 数据,如 " ...

  4. Xpath常用总结

    XPath常用定位节点元素语句总结 将一个XML或HTML文档转换成了DOM树结构后,如何才能定位到特定的节点?XPath实现了这样的功能,它通过DOM树中节点的路径和属性来导航,通过XPath路径表 ...

  5. android 捕获未try的异常

    1.Thread.UncaughtExceptionHandler java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等.如果自己没有try / catch 那么线程就 ...

  6. element-ui多层嵌套表格数据删除

    很多表格都要一个移除的功能,所谓移除,就是前端把表格的数据删除,普通的表格删除很简单,调用数据的删除方法就行.但是当表格是多层的嵌套类型时,就不能再使用普通的删除方法了.下面介绍一种自己在项目中用的方 ...

  7. 'node' 不是内部或外部命令,也不是可运行的程序或批处理文件

    状况:安装完nodejs之后,命令行输入node -v, 提示 'node' 不是内部或外部命令,也不是可运行的程序或批处理文件原因:检查环境变量没有配置正确配置环境变量: windows系统里, 需 ...

  8. URL中参数为数组

    今天写代码时候碰到了一个需要在URL中传递数组类型的参数,记录一下. var urlstr = "http://test"; var test = new Array(); for ...

  9. DIY FRDM-KL25Z开发环境 -- 基于GNU工具链

    IDE大行其道的今天,一键make极大的便利了开发的同时,也每每让各种半路出家的猿们遇到工具链的问题感到束手无策(不就是说自己嘛?^_^!!!).也玩过不少板子了,始终没去深究工具链方面的问题,对于嵌 ...

  10. 移动工程后,打开ROM核无配置信息

    问题: 从他人处下载的ISE工程,打开dw51的ROM IP核,无配置信息,为block memory generator的初始配置,并显示无法找到coe文件 原因:ROM配置过程中的部分内容丢失导致 ...