用生命谱写代码的赞歌

0%

JS 语法中表达式与语句的区别

JavaScript 表达式与语句区别

Javascript 语言精粹

  1. 表达式是由运算符构成,并运算产生结果的语法结构。

  2. 程序是由语句构成,语句则是由“;(分号)”分隔的句子或命令。

  3. 如果在表达式后面加上一个“;”分隔符,这就被称为“表达式语句”。它表明“只有表达式,而没有其他语法元素的语句”

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

1
2
3
myBook
5 - x
myFunc('a', 'b')

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

json 与 eval 用法区别

  • json字符串的解析方法
1
2
3
4
5
6
7
8
9
10
var jsonData = '{"data1":"Hello,", "data2":"world!}';
var evalJson=eval('('+jsonData+')');
var jsonParseJson=JSON.parse(jsonData);

var value = 1;
var jsonstr = '{"data1":"hello","data2":++value}';
var data1 = eval('('+jsonstr+')');
console.log(data1);//这时value值为2
var data2=JSON.parse(jsonstr);
console.log(data2);//报错

Alt json字符串解析报错

  • 结果分析

    • 从控制输出台的结果可以看出,第一个 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
2
3
4
5
6
7
8
9
10
11
aa=35;
bb=1+aa;
// 或者
aa=35;
bb=1+aa();
// 或者
function aa(var aa){alert aa+1;}
bb=2;
aa(bb+56);

aa++;
  • 语句可以包含有表达式,表达式也可以单独形成一个语句,如上所示
    • 其中1+aa()bb+56就是表达式
    • 最后一句aa++就是一个由单个表达式构成的语句
  • 如果你听到或看到有人说 if 语句、for 语句,其实大多数情况指的都是 if 分支结构,for 循环结构。

看似语句的表达式

  1. 下面是一个对象字面量,也就是一个可以生成一个对象值的表达式

    1
    2
    3
    {
    foo: bar(3, 5)
    }
  2. 不过同时,它也是一个完全合法的语句,这个语句的组成部分有:

    1. 一个代码块:一个由大括号包围的语句序列
    2. 一个标签:你可以在任何语句前面放置一个标签,这里的 foo 就是一个标签
    3. 一条语句:表达式语句 bar(3, 5)

你也许会感到震惊,那就是 JavaScript 居然可以有独立的代码块(常见的代码块是依托于循环或者 if 语句的)。下面的代码演示了这种代码块的作用:你可以给它设置一个标签然后跳出这个代码块.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

简单用一幅图表示表达式与语句直接的关系

Alt 表达式与语句关系图