代码之谜(二)- 语句与表达式
虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每个表达式都有一个值。在此之外,也会继续表述这个『代码之谜』系列的主题——数学与计算机之间被经常忽略的矛盾。
简单的讲
- "表达式"(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
代码之谜(二)- 语句与表达式相关推荐
- C语言二 运算符、表达式及语句
一.运算符 C语言的运算符按运算时操作数的个数可分为单目运算符().双目运算符和三目运算符.按运算符在运算时的功能可分为:算术运算符.关系运算符.逻辑运算符.位操作运算符.赋值运算符.条件运算符.逗号 ...
- 009_JavaScript语句、表达式和代码块
1. JavaScript程序 1.1. 计算机程序是由计算机"执行"的一系列"指令". 1.2. 在编程语言中, 这些编程指令被称为语句. 1.3. Java ...
- Kotlin入门与进阶:语法(二)类成员,运算符,语句,表达式
上一篇文章着重介绍了Kotlin中的常量与变量,函数和Lambda表达式(点我补课),这一篇文章专注于类成员,运算符,各种语句和表达式. 类成员 包括属性和方法. 属性:也就是成员变量,是指类范围内的 ...
- JavaScript基础05-day07【条件运算符、运算符优先级、代码块、if语句】
学习地址: 谷粒学院---尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版J ...
- Oracle的CASE语句和表达式
http://space.itpub.net/15203236/viewspace-534849 Oracle的CASE语句和表达式 上一篇 /下一篇 2009-01-09 23:19:46 / 天 ...
- 代码块、if语句、if-else语句、switch语句、while循环、do-while循环、for循环——JS流程控制
目录 一.代码块 二.if语句(条件判断语句) 三.if-else语句(条件分支语句) 四.if练习(prompt()函数.isNaN()函数) 五.switch语句(条件分支语句) 六.while循 ...
- python(6):条件语句和循环语句 + 三元表达式
文章目录 一.if语句 1.if单分支语句 2.if多分支语句 3.if..else多分支语句 4.if...elif...else多分支语句 5.循环嵌套 二.三元表达式 三.while语句 1.基 ...
- 干货 | 收藏!16段代码入门Python循环语句
(图片付费下载于视觉中国) 作者 | 李明江 张良均 周东平 张尚佳,本文摘编自<Python3智能数据分析快速入门> 来源 | 大数据(ID:hzdashuju) [导读]本文将重点讲述 ...
- 值得收藏!16段代码入门Python循环语句
来源:大数据 本文约6000字,建议阅读10分钟. 本文重点讲述for语句和while语句. [ 导读 ]本文重点讲述for语句和while语句.for语句属于遍历循环,while语句属于当型循环.除 ...
最新文章
- 如何利用 nbconvert将 IPYNB文档转换 Markdown文档?
- Windows Service Wrapper:将程序注册为windows系统服务工具
- Java架构师在线视频,架构师的7大必备技能
- Spring MVC 中的基于注解的 Controller
- Map字符串类型去掉空格处理
- SilverlightCMS开发之3经典三页面CMS浮现
- fish工具_Python程序员使用哪些开发工具
- 需求分析——调研需求时如何调查系统相关者?
- C++STL笔记(三):array详解
- Python基础【day03】:字典(一)
- Alienbrain-数字资源在团队三维动画制作行业中的应用
- LoadModule php5_module modules/libphp5.so在httpd.conf中的由来
- 驱动精灵w8ndows xp sp2,爱普生Epson TM-T86FII打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
- Excel如何批量插入删除复选框
- Ubuntu登陆不进去输入密码后黑屏又返回登陆界面
- 如何快速通过信息系统管理工程师考试
- 转录组分析_转录组分析的正确姿势
- c语言程序设计移动字母,C语言程序设计实例大全(220个例子)
- 计算机开机最快,你电脑开机要多久?4招让你的电脑开机速度比之前快几倍
- Centos7下挂载超过2T以上硬盘
热门文章
- 李开复:白手起家的10个步骤
- Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”
- 实现主成分分析和白化
- [并发编程] - Executor框架#ThreadPoolExecutor源码解读03
- MyBatis-14MyBatis动态SQL之【foreach】
- python 计算算术平方根
- inaflash什么意思中文_英文“flash”翻译成中文是什么意思?
- 5m 云服务器2核4g_阿里云服务器2核4gb
- python mql4_可以转发文章不?老外用随机森林预测外汇分钟涨跌准确率高达85%。求高手用python重写。...
- Halcon知识: 矩形测量