JavaScript中的表达式和语句

JavaScript中的表达式和语句,javascript,expression,statements,Javascript,Expression,Statements,我刚开始学习JavaScript的书“Eloquent JavaScript”,这本书可以在eloquentjavascript.net上免费访问。到目前为止,我真的很喜欢这本书,只有一部分我不懂。它是关于表达式和语句的: 我知道这个话题以前在StackOverflow上提到过,但是,这些都是更具体的问题,坦率地说,我并不完全明白 在本段开头,作者解释了什么是表达式:如果我理解正确,42或“23”等原子值被视为表达式。如果将这些值应用于运算符(如42-19),这也将被视为一个表达式。(我猜是因

我刚开始学习JavaScript的书“Eloquent JavaScript”,这本书可以在eloquentjavascript.net上免费访问。到目前为止,我真的很喜欢这本书,只有一部分我不懂。它是关于表达式和语句的:

我知道这个话题以前在StackOverflow上提到过,但是,这些都是更具体的问题,坦率地说,我并不完全明白

在本段开头,作者解释了什么是表达式:如果我理解正确,42或“23”等原子值被视为表达式。如果将这些值应用于运算符(如42-19),这也将被视为一个表达式。(我猜是因为它显然是23,这又是一个原子值。)我这样解释:每个值——不管它是直接输入的还是尚未计算的——都被称为表达式。对吗?

然后作者说:“存在一个比表达式更大的单位。它被称为语句。[…]大多数语句以分号(;)结尾。最简单的语句是后面有分号的表达式。”他举了一个例子!虚假的;作为示例语句。我的问题是“这是一个什么样的语句?仅仅是结尾的分号?”当我使用JavaScript控制台时,无论我键入该语句时是否使用分号,都没有任何区别。它总是返回真的。然而,作者说“[A]语句只有在它以某种方式改变世界时才有意义。”因此,给出的示例甚至不是一个语句,因为它“只是生成值[…]true,然后立即将其扔进位桶”我现在真的很困惑。。。如果我没有完全把它搞砸,那么一个语句肯定会有一些“副作用”(比如变量的声明),对吗

!false;
然而,如果有人能解释什么是陈述,我会非常高兴。如果有人能举一个例子,说明这些术语的区别实际上是有用的,这也会非常有帮助,因为现在我甚至无法想象作者为什么还要费心介绍这些词汇。提前非常感谢

一个简单但模糊的类比是自然语言的文本,由短语组合成句子。一个短语,比如“下雨了”,可以自己组成一个句子,比如“我不出去了,下雨了。”或者是一个更大句子的一部分,比如“糟糕的天气,一直在下雨。”

也就是说,在javascript中表达式和语句之间的区别非常模糊。与其他类似C语言不同,您不仅可以在语句中包含表达式,还可以在表达式中包含语句:

a = 1 + function(x) { if(x > 1) return 10 } (20) 
一些现代javascript程序,如Jquery,使用声明技术,基本上使它们成为一个表达式

这种模糊的区别(更不用说混淆)来自这样一个事实:Javascript作为一种类似C/pascal/algol的命令式语言,同时受到Lisp等函数式语言的严重影响,而Lisp没有“语句”的概念。在函数式语言中,一切都是表达式

为了让事情变得更有趣,语句之间的分号(有时)是可选的,因此很难判断两个表达式是属于一个语句还是形成两个不同的语句。考虑:

 a = 1  // two
 !2     // statements

 a = 1  // one
 +2     // statement

是的,任何类型的每个值本身都是一个表达式。一种类型的语句也是表达式,并不是分号使其成为语句;它既是一个表达式又是一个语句。(分号不是表达式的一部分。)无论如何,语句只是一个语法结构。当作者谈到“相当于某事”的陈述时,这是一个非正式的笑话。不执行任何操作的语句(如
false;
)仍然是一个语句。您可以将其视为表达式是语句的子集,因为每个表达式也是一个表达式语句。或者这会让你更加困惑吗?;)哦,最后,知道这些术语的含义是好的,因为它们是在描述其他句法结构时出现的。也就是说,有时描述某件事时,知道可以插入“任意表达式”或“任意语句”会产生很大的不同。@FelixKling所以每个表达式也是一个语句。所以,我想一定有一个陈述,它不是同时表达的。那会是什么样子?我不同意表达式中的语句是可能的。只需浏览一下表达式列表(),看看其中是否有允许语句。有些构造可以解释为表达式或语句,但在其他方面,区别非常明显。@FelixKling:添加了一个示例。啊。。。嗯,好的。我猜函数表达式在某种程度上是“特殊的”;)(他们在规范中有自己的部分,这在某种程度上得到了支持)。@thg435感谢您提供的自然语言示例。如果“我不出去了,下雨了”代表一种说法,我不认为这是一个更大的词组或句子的一部分。所以这个例子并不完全符合语句也可以是表达式的一部分的观点@杜贝尔曼:想想:
“‘我不出去了,下雨了,’茱莉亚说。”