首页 web前端 js教程 JavaScript中:表达式和语句的区别[译]_javascript技巧

JavaScript中:表达式和语句的区别[译]_javascript技巧

May 16, 2016 pm 05:49 PM
表达式 语句

1.语句和表达式

JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式:

myvar3 + xmyfunc("a", "b")语句可以理解成一个行为.循环语句和if语句就是典型的语句.一个程序是由一系列语句组成的.JavaScript中某些需要语句的地方,你可以使用一个表达式来代替.这样的语句称之为表达式语句.但反过来不可以:你不能在一个需要表达式的地方放一个语句.比如,一个if语句不能作为一个函数的参数.

2.其他语法

看看下面这两对类似的语法,搞懂这些后,能够帮助我们更好的理解语句和表达式之间的关系.

2.1 If语句和条件运算符
下面是一个if语句的例子:

复制代码 代码如下:

var x;
if (y >= 0) {
x = y;
} else {
x = -y;
}


类似if语句功能的表达式叫做条件运算符.上面的语句等价于下面的.

var x = (y >= 0 ? y : -y);

在等于号=和分号;之间的代码就是条件表达式.两边的小括号不是必需的,但我觉得小括号能让条件表达式更易读.

2.2 分号和逗号运算符
在JavaScript中,使用分号可以连接两个语句:

foo(); bar()要想连接两个表达式,使用的是不常见的逗号运算符:

foo(), bar()逗号运算符会计算前后两个表达式,然后返回右边表达式的计算结果.例如:
复制代码 代码如下:

> "a", "b"
'b'

> var x = ("a", "b");
> x
'b'

> console.log(("a", "b"));



3.看似语句的表达式

一些表达式看起来像是语句,这可能会带来一些麻烦.

3.1 对象字面量和语句块
下面是一个对象字面量,也就是一个可以生成一个对象值的表达式.
复制代码 代码如下:

{
foo: bar(3, 5)
}

不过同时,它也是一个完全合法的语句,这个语句的组成部分有:

•一个代码块:一个由大括号包围的语句序列.
•一个标签:你可以在任何语句前面放置一个标签.这里的foo就是一个标签.
•一条语句:表达式语句bar(3, 5).
你也许会感到震惊,那就是JavaScript居然可以有独立的代码块(常见的代码块是依托于循环或者if语句的).下面的代码演示了这种代码块的作用:你可以给它设置一个标签然后跳出这个代码块.
复制代码 代码如下:

function test(printTwo) {
printing: {
console.log("One");
if (!printTwo) break printing;
console.log("Two");
}
console.log("Three");
}
> test(false)
One
Three
> test(true)
One
Two
Three

3.2 函数表达式和函数声明
下面的代码是一个函数表达式:

function () { }你还可以给这个函数表达式起一个名字,将它转变为一个命名(非匿名)的函数表达式:

function foo() { }这个函数的函数名(foo)只存在于函数内部,比如,可以用它来做递归运算:

复制代码 代码如下:

> var fac = function me(x) { return x > fac(10)
3628800
> console.log(me)
ReferenceError: me is not defined


一个命名的函数表达式从表面上看起来,和一个函数声明并没有什么区别.但他们的效果是不同的:一个函数表达式产生一个值(一个函数).一个函数声明执行一个动作:将一个函数赋值给一个变量. 此外,只有函数表达式可以被立即调用,函数声明不可以.

3.3 解决冲突
从3.1和3.2可以看出,有些表达式和语句在表面上看不出有什么区别.也就意味着,相同的代码,出现在表达式上下文和出现在语句上下文会表现出不同的作用.通常情况下,这两种上下文是没有交集的.但是,如果是表达式语句的话,会有一个重叠:也就是说,会有一些表达式出现在语句上下文上.为了解决这种歧义,JavaScript语法禁止表达式语句以大括号或关键字"function"开头:
复制代码 代码如下:

ExpressionStatement :
[lookahead ∉ {"{", "function"}] Expression ;

那么,如果你想写一个以那些标志开头的表达式语句,该怎办呢? 你可以把它放在一个括号内部,这样并不会改变运行结果,只会确保该表达式被解析在表达式上下文中.让我们看两个例子.第一个例子:eval会按照语句上下文解析它的参数.如果你想让eval返回一个对象,你必须在对象字面量两边加上一个括号.
复制代码 代码如下:

> eval("{ foo: 123 }")
123
> eval("({ foo: 123 })")
{ foo: 123 }

第二个例子:下面的例子是一个立即执行的函数表达式.
复制代码 代码如下:

> (function () { return "abc" }())
'abc'

如果你省略了小括号,你会得到一个语法错误(函数声明不可以是匿名的):
复制代码 代码如下:

> function () { return "abc" }()
SyntaxError: function statement requires a name

如果你添加上函数名,还会得到一个语法错误(函数声明不能被理解执行):
复制代码 代码如下:

> function foo() { return "abc" }()
SyntaxError: syntax error


另外一个能让表达式在表达式上下文上被解析的办法是使用一元运算符,比如 + 或者 !.但是,和使用括号不同的是,这些操作符会改变表达式的运行结果.如果你不关心结果的话,完全可以使用:
复制代码 代码如下:

> +function () { console.log("hello") }()
hello
NaNNaN

是+作用在函数执行后的返回值undefined上的结果.

译者注:我觉的没翻译明白,所以用拙劣的水平画了张图.

JavaScript中:表达式和语句的区别[译]_javascript技巧
原文(英文):http://www.2ality.com/2012/09/expressions-vs-statements.html 
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP8.0中的multi-catch语句 PHP8.0中的multi-catch语句 May 14, 2023 pm 01:51 PM

随着Web应用程序的发展,PHP语言在Web开发中得到了广泛应用。而在PHP8.0版本中,一个新的语言特性被引入——multi-catch语句。什么是multi-catch语句?在先前的PHP版本中,对于多个异常类型的处理,开发人员需要写多个catch语句。例如,如下代码块展示了对两种不同异常的处理:try{//Somecodethatmay

如何解决Python的表达式语法错误? 如何解决Python的表达式语法错误? Jun 24, 2023 pm 05:04 PM

Python作为一种高级编程语言,易于学习和使用。一旦需要编写Python程序时,无法避免地遇到语法错误,表达式语法错误是常见的一种。在本文中,我们将讨论如何解决Python的表达式语法错误。表达式语法错误是Python中最常见的错误之一,它通常是由于错误的使用语法或缺少必要组件而导致的。在Python中,表达式通常由数字、字符串、变量和运算符组成。最常见的

如何实现MySQL中插入数据的语句? 如何实现MySQL中插入数据的语句? Nov 08, 2023 am 11:48 AM

如何实现MySQL中插入数据的语句?在使用MySQL数据库时,插入数据是一项非常基础且常见的操作。通过插入数据,可以将新的记录添加到数据库表中,为业务操作提供支持。本文将介绍如何使用MySQL中的INSERT语句来实现数据插入操作,并提供具体的代码示例。MySQL中的INSERT语句用于向数据库表中插入新的记录。其基本语法格式如下:INSERTINTOt

在C和C++中,逗号(comma)的用法是用来分隔表达式或语句 在C和C++中,逗号(comma)的用法是用来分隔表达式或语句 Sep 09, 2023 pm 05:33 PM

在C或C++中,逗号“,”有不同的用途。在这里我们将了解如何使用它们。逗号作为运算符。逗号运算符是一个二元运算符,它计算第一个操作数,然后丢弃结果,然后计算第二个操作数并返回值。逗号运算符在C或C++中的优先级最低。示例#include<stdio.h>intmain(){  intx=(50,60);  inty=(func1(),func2());}这里60将被分配给x。对于下一条语句,将首先执行func1(

掌握Python流程控制语句的种类,从零开始学习! 掌握Python流程控制语句的种类,从零开始学习! Jan 20, 2024 am 09:02 AM

从零开始学Python,先搞懂流程控制语句有几种!Python是一门简洁而强大的编程语言,广泛用于数据分析、人工智能、网络开发以及各种科学计算领域。作为初学者,掌握基本的流程控制语句是非常重要的,因为它们是实现逻辑判断和控制程序执行流程的基础。在Python中,主要有三种流程控制语句:顺序结构、条件结构和循环结构。下面将具体介绍这三种流程控制语句,并给出相应

了解Python中的流程控制语句需要掌握几种情况 了解Python中的流程控制语句需要掌握几种情况 Jan 20, 2024 am 08:06 AM

Python是一种广泛使用的高级编程语言,它具有简单易学、高效灵活的特点,深受开发者的喜爱。在Python中,流程控制语句是实现程序逻辑的重要部分。本文将介绍Python中常用的流程控制语句,并提供代码示例加深理解。在Python中,常见的流程控制语句包括条件语句和循环语句。条件语句根据条件的真假执行不同的代码块,用于判断和选择执行分支。而循环语句则用于重复

C#的try语句用法 C#的try语句用法 Feb 22, 2024 pm 12:45 PM

C#的try语句用法,需要具体代码示例C#是一种面向对象的编程语言,其中的try语句是一种用于捕获和处理异常的结构。通过try语句,我们可以编写代码来处理可能发生的异常情况,从而改善程序的稳定性和可靠性。在本文中,我们将介绍C#中try语句的用法,并提供一些具体的代码示例来帮助读者理解。在C#中,try语句由try块、catch块和optionalfina

介绍C语言中的指数函数表达式 介绍C语言中的指数函数表达式 Feb 18, 2024 pm 01:11 PM

C语言中指数函数表达式的写法介绍及代码示例什么是指数函数指数函数是数学中一类常见的函数,可以表示为f(x)=a^x的形式,其中a为底数,x为指数。指数函数主要用于描述指数增长或指数衰减的情况。指数函数的代码示例在C语言中,我们可以使用数学库中的pow()函数来计算指数函数,下面是一个示例程序:#include

See all articles