JavaScript 表达式与语句区别
Javascript 语言精粹:
表达式是由运算符构成,并运算产生结果的语法结构。
程序是由语句构成,语句则是由“;(分号)”分隔的句子或命令。
如果在表达式后面加上一个“;”分隔符,这就被称为“表达式语句”。它表明“只有表达式,而没有其他语法元素的语句”
JavaScript 一个表达式会产生一个值,它可以放在任何需要一个值的地方。比如,作为一个函数调用的参数。下面的每行代码都是一个表达式:
1 | myBook |
语句可以理解成一个行为。循环语句和 if 语句就是典型的语句。一个程序是由一系列语句组成的。JavaScript 中某些需要语句的地方,你可以使用一个表达式来代替。这样的语句称之为表达式语句。但反过来不可以:你不能在一个需要表达式的地方放一个语句。比如,一个if语句不能作为一个函数的参数。
json 与 eval 用法区别
- json字符串的解析方法
1 | var jsonData = '{"data1":"Hello,", "data2":"world!}'; |

结果分析
- 从控制输出台的结果可以看出,第一个 eval() 顺利执行,第二个报错了。
- 从上例就可以明显地看出,eval 在解析字符串时,会执行该字符串中的代码(这样的后果是相当恶劣的)
- 如上例中,由于用 eval 解析一个 json 字符串而造成原先的 value 的值改变。
- 在《高性能JavaScript》一书中指出,使用 eval 乱来解析 JSON 字符串是很危险的,容易将一些置于字符串中的危险代码一并执行。
- 所以我们应该尽量使用
JSON.parse()方法来解析 JSON 字符串。
补充理解
- 另外,在一个 字符串 中如果我们想输出“\”字符,我们必须使用 转义字符
- 所以最终形式是:
console.log("\\"); - 但是由于
JSON.parse解析的是字符串的真实含义 - 所以每一个
"\"又都要使用"\"来进行转义 - 所以最终形式为:
console.log(JSON.parse('{"a":"\\\\"}')); - 要注意理解其中意思。
为什么 eval() 解析的时候要加上括号?
- 因为 eval() 相当于一个执行环境
- 当你不加括号的时候,jsonData 会被认为是一条复合语句。运行的时候就会逐个字符的解析。
- 但是加上括号的时候,jsonData 就当做一个表达式去运算。从括号开始就被当做了对象进行识别。
js表达式与语句
基本含义
- 在 javascript 中所有表达式都有返回值(如果没有返回值就是 undefined),这个返回值就可以继续作为表达式的一部分。
- 大多数语言表达式的定义基本分为(忽略优先级):
- 运算符 表达式 (一元,比如 !true)
- 表达式 运算符 表达式 (二元,比如 1+2)
- 表达式1 ? 表达式2 : 表达式3 (三元,a>b?a:b)
- 左括号 表达式 右括号 (括号 (1+2))
- 表达式(参数列表) (函数调用)
- 可见这是一种递归的定义,所以又规定 字面量(就是1,2,3,“abc”),this等是表达式
- “语句”的意思是指不是表达式的语句。
- 在 javascript 里面满足这个条件的就函数声明、变量声明(var a=10是声明和赋值)、for语句、if语句、while语句、switch语句、return、try catch。
- javascript 还有一种函数表达式,它的形式跟函数声明一模一样。如果写
function fn() { return 0;}是函数声明而写var a = function fn(){ return 0;}等号后面的就是函数表达式。
- 最简单的区别
- 表达式可以嵌套在别的表达式中,但语句不行。语句只能独立出现。
- 另外,语句没有返回值。
- 表达式计算出一个值,但语句用来执行以使某件事发生。《JavaScript 权威指南》(第6版)
举例说明
- 在程序设计语言中,语句指的是执行单元,通常以行作为单位。
- 表达式指的是可用于计算的式子,即可能产生一个值的式子。
1 | aa=35; |
- 语句可以包含有表达式,表达式也可以单独形成一个语句,如上所示
- 其中
1+aa()和bb+56就是表达式 - 最后一句
aa++就是一个由单个表达式构成的语句
- 其中
- 如果你听到或看到有人说 if 语句、for 语句,其实大多数情况指的都是 if 分支结构,for 循环结构。
看似语句的表达式
下面是一个对象字面量,也就是一个可以生成一个对象值的表达式
1
2
3{
foo: bar(3, 5)
}不过同时,它也是一个完全合法的语句,这个语句的组成部分有:
- 一个代码块:一个由大括号包围的语句序列
- 一个标签:你可以在任何语句前面放置一个标签,这里的 foo 就是一个标签
- 一条语句:表达式语句 bar(3, 5)
你也许会感到震惊,那就是 JavaScript 居然可以有独立的代码块(常见的代码块是依托于循环或者 if 语句的)。下面的代码演示了这种代码块的作用:你可以给它设置一个标签然后跳出这个代码块.
1 | function test(printTwo) { |
简单用一幅图表示表达式与语句直接的关系
