(二)语句与表达式 每个表达式都有一个值
(⼆)语句与表达式 每个表达式都有⼀个值
虽然⽂章标题是『语句与表达式』,在这篇⽂章中,我将陈述⼀个观点 每个表达式都有⼀个值。 在此之外,也会继续表述这个『』系列的主题——数学与计算机之间被经常忽略的⽭盾。简单的讲
" 表达式" (expression )是⼀个单纯的运算过程,总是有返回值;" 语句" (statement )是执⾏某种操作,没有返回值。
使⽤表达式也是函数式编程语⾔所提倡的,⽽传统命令式编程语⾔都是语句的堆砌。表达式和语句如何区分呢? 最简单最直观的鉴别⽅法就是, 后⾯有分号的是语句,这是⼀个充分条件⽽不是必要条件。 有分号,就是语句;没有分号,就不⼀定了,也可能是语句,也可能是表达式。
在动态语⾔——⽐如javascript——中是通过上下⽂来区分这两者的。
假如如果 function foo(){} 在⼀个赋值表达式的⼀部分,则认为它是⼀个表达式。 表达式的⼀部分,也是表达式。 ⽽如果 function foo(){} 被包含在⼀个函数体内,或者位于程序中,则将它作为⼀个语句。
function foo(){}; // 声明,因为它是程序的⼀部分
var bar = function foo(){}; // 表达式,因为它是赋值表达式的⼀部分new function bar(){}; // 表达式,因为它是New 表达式的⼀部分
(function(){
function bar(){}; // 声明,因为它是函数体的⼀部分
})();
还有⼀种不那么显⽽易见的表达式,就是被包含在⼀对圆括号中—— (functionfoo(){})。 将这种形式看成表达式同样是因为上下⽂的关系: (和) 构成⼀个分组操作符,⽽ 分组操作符只能包含表达式:
(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(函数式编程)的⼀些核⼼思想了。
W3Cschool (www.w3cschool.cn )最⼤的技术知识分享与学习平台此篇内容来⾃于w3cschool.cn ⽹站⽤户上传并发布。