虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每个表达式都有一个值。在此之外,也会继续表述这个『代码之谜』系列的主题——数学与计算机之间被经常忽略的矛盾。

简单的讲

  • "表达式"(expression)是一个单纯的运算过程,总是有返回值;
  • "语句"(statement)是执行某种操作,没有返回值。

使用表达式也是函数式编程语言所提倡的,而传统命令式编程语言都是语句的堆砌。

表达式和语句如何区分呢?最简单最直观的鉴别方法就是, 后面有分号的是语句, 这是一个充分条件而不是必要条件。有分号,就是语句;没有分号,就不一定了,也可能是语句,也可能是表达式。

在动态语言——比如javascript——中是通过上下文来区分这两者的。

假如如果 function foo(){} 在一个赋值表达式的一部分,则认为它是一个表达式。表达式的一部分,也是表达式。而如果function foo(){} 被包含在一个函数体内,或者位于程序中,则将它作为一个语句。

function foo(){}; // 声明,因为它是程序的一部分
var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分new function bar(){}; // 表达式,因为它是New表达式的一部分(function(){function bar(){}; // 声明,因为它是函数体的一部分
})();

还有一种不那么显而易见的表达式,就是被包含在一对圆括号中—— (function foo(){})。将这种形式看成表达式同样是因为上下文的关系:(和)构成一个分组操作符,而分组操作符只能包含表达式

(function foo(){}); // 函数表达式:注意它被包含在分组操作符中
(var x = 5);  // error! 分组操作符只能包含表达式,不能包含语句(这里的var就是语句)

今天突然有人问我:

alert(eval(data));

为什么会报错呢?data 是一个对象,按理说应该会弹出 Object[Object] 啊。这是因为,当我们写

{"username" : "justjavac"}

时,它并不是一个对象。因为我们知道有一种表示数据的方法叫做 json(javascript对象表示法),所以想当然的认为这应该是一个对象。其实,在大部分编程语言中,大括号({})表示的不是对象,而是代码块,这段代码其实等价于

{"username" : "justjavac"
}

很显然,"username" : "justjavac" 并不是合法的语句。然而解决方法也很简单,就是添加括号——分组操作符

({"username" : "justjavac"})

这样就构成了一个合法的表达式,当我们进行 json 对象解析的时候可以写如下代码:

eval('(' + json + ')')

在表达式中,只能存在表达式,不能存在语句。

例如表达式

(var a = 4) + 4;

这段代码将产生一个错误,因为 var a = 4 是一个语句,而不是表达式—— 对表达式求值必须返回值,但对语句求值则未必有返回值

类似的

if (var a = 0) {}

也产生错误,因为 var a = 0 是一条语句,而 语句没有返回值。if 语句的语法结构为

if (expression) {statement;statement;……
}

因此

if (var a = 0) {}

是错误的,但是

if (true) {var a = 0;
}

则是正确的。

最后重申一下,每个表达式都有一个值。理解了这个,就可以很容易的理解 FP(函数式编程)的一些核心思想了。

from: http://justjavac.com/codepuzzle/2012/10/28/codepuzzle-expression-and-statement.html

代码之谜(二)- 语句与表达式相关推荐

  1. C语言二 运算符、表达式及语句

    一.运算符 C语言的运算符按运算时操作数的个数可分为单目运算符().双目运算符和三目运算符.按运算符在运算时的功能可分为:算术运算符.关系运算符.逻辑运算符.位操作运算符.赋值运算符.条件运算符.逗号 ...

  2. 009_JavaScript语句、表达式和代码块

    1. JavaScript程序 1.1. 计算机程序是由计算机"执行"的一系列"指令". 1.2. 在编程语言中, 这些编程指令被称为语句. 1.3. Java ...

  3. Kotlin入门与进阶:语法(二)类成员,运算符,语句,表达式

    上一篇文章着重介绍了Kotlin中的常量与变量,函数和Lambda表达式(点我补课),这一篇文章专注于类成员,运算符,各种语句和表达式. 类成员 包括属性和方法. 属性:也就是成员变量,是指类范围内的 ...

  4. JavaScript基础05-day07【条件运算符、运算符优先级、代码块、if语句】

    学习地址: 谷粒学院---尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版J ...

  5. Oracle的CASE语句和表达式

    http://space.itpub.net/15203236/viewspace-534849 Oracle的CASE语句和表达式 上一篇 /下一篇  2009-01-09 23:19:46 / 天 ...

  6. 代码块、if语句、if-else语句、switch语句、while循环、do-while循环、for循环——JS流程控制

    目录 一.代码块 二.if语句(条件判断语句) 三.if-else语句(条件分支语句) 四.if练习(prompt()函数.isNaN()函数) 五.switch语句(条件分支语句) 六.while循 ...

  7. python(6):条件语句和循环语句 + 三元表达式

    文章目录 一.if语句 1.if单分支语句 2.if多分支语句 3.if..else多分支语句 4.if...elif...else多分支语句 5.循环嵌套 二.三元表达式 三.while语句 1.基 ...

  8. 干货 | 收藏!16段代码入门Python循环语句

    (图片付费下载于视觉中国) 作者 | 李明江 张良均 周东平 张尚佳,本文摘编自<Python3智能数据分析快速入门> 来源 | 大数据(ID:hzdashuju) [导读]本文将重点讲述 ...

  9. 值得收藏!16段代码入门Python循环语句

    来源:大数据 本文约6000字,建议阅读10分钟. 本文重点讲述for语句和while语句. [ 导读 ]本文重点讲述for语句和while语句.for语句属于遍历循环,while语句属于当型循环.除 ...

最新文章

  1. 如何利用 nbconvert将 IPYNB文档转换 Markdown文档?
  2. Windows Service Wrapper:将程序注册为windows系统服务工具
  3. Java架构师在线视频,架构师的7大必备技能
  4. Spring MVC 中的基于注解的 Controller
  5. Map字符串类型去掉空格处理
  6. SilverlightCMS开发之3经典三页面CMS浮现
  7. fish工具_Python程序员使用哪些开发工具
  8. 需求分析——调研需求时如何调查系统相关者?
  9. C++STL笔记(三):array详解
  10. Python基础【day03】:字典(一)
  11. Alienbrain-数字资源在团队三维动画制作行业中的应用
  12. LoadModule php5_module modules/libphp5.so在httpd.conf中的由来
  13. 驱动精灵w8ndows xp sp2,爱普生Epson TM-T86FII打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
  14. Excel如何批量插入删除复选框
  15. Ubuntu登陆不进去输入密码后黑屏又返回登陆界面
  16. 如何快速通过信息系统管理工程师考试
  17. 转录组分析_转录组分析的正确姿势
  18. c语言程序设计移动字母,C语言程序设计实例大全(220个例子)
  19. 计算机开机最快,你电脑开机要多久?4招让你的电脑开机速度比之前快几倍
  20. Centos7下挂载超过2T以上硬盘

热门文章

  1. 李开复:白手起家的10个步骤
  2. Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”
  3. 实现主成分分析和白化
  4. [并发编程] - Executor框架#ThreadPoolExecutor源码解读03
  5. MyBatis-14MyBatis动态SQL之【foreach】
  6. python 计算算术平方根
  7. inaflash什么意思中文_英文“flash”翻译成中文是什么意思?
  8. 5m 云服务器2核4g_阿里云服务器2核4gb
  9. python mql4_可以转发文章不?老外用随机森林预测外汇分钟涨跌准确率高达85%。求高手用python重写。...
  10. Halcon知识: 矩形测量