携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
大家好!我是前端爬楼工程师🚹,一个野生程序员。好奇新技术,仰慕牛大佬。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
如何区分表达式和语句 ?
var a = 3 * 6
var b = a
b
3 * 6、第二行的a和第三行的b都是表达式, 三行代码都是包含表达式的语句。a = 3 * 6也叫赋值表达式。b同时也是个语句,即表达式语句。 第一行和第二行代码也称声明语句。
每个语句都有返回值
声明语句的返回值是
undefined,赋值语句的返回值是右边表达式的结果。
代码块的结果值是其最后一个语句/表达式的结果。上述代码中代码块最后一个语句是
b = 4 + 38,所以它的结果是42。
如何获得语句的结果值?
var a , b;
a = eval("if(true){b = 4 + 38};")
a; // 42
使用eval()可以获取到语句的结果值。
var a, b ;
a = do{
if(true){
b = 4 + 38;
}
}
a // 42
上述代码中,do {..} 表达式执行一个代码块(包含一个或多个语句),返回最后一个语句的结果值,赋值给变量a。这个的好处就是减少eval()的使用。
表达式的副作用
var a = 2;
var b = a + 3;
大部分表达式都没有副作用,最常见的有副作用(也可能没有)的表达式是函数调用。
function foo (){
a = a + 1
}
var a = 1
foo()
结果值undefined , 副作用是a的值改变了。
其他一些表达式也有副作用
var a = 42
var b = a++
首先返回变量a的当前值42,赋值给b,然后将a的值加1。
运算符要将产生的副作用赋值给一个变量。
var a = 42
++a++ // reference Error
首先执行 a++, 返回42 ,然后执行 ++42 ,因为这里42不是一个变量,所以++ 42报错。
var a = 42;
var b = (a ++)
a // 43
b // 42
()并不能影响副作用的执行顺序。
var a = 42, b;
b = (a ++ , a);
a // 43
b // 43
a++执行,然后执行a,结果为43,赋值给b.
delete 表达式也有结果值,副作用是删除对象中的属性。
var obj = {
a: 42
}
delete a; // true
结果值:true , 副作用:obj的属性a被删除了 ,操作失败返回false
=、+=、-=运算符
var a ;
a = 42 // 42
b = a+=1 // 43
结果值是42,副作用是将42赋值给a
var a , b ,c;
a = b = c = 42
多个表达式串联时,c = 42结果为42,将42赋值给c,b = 42 结果值是 42,将42赋值给b, 最后a = 42结果值是42,将42赋值给a
!!误用
var a = b = 42 // 这里b没有声明,会在全局变量里创建一个`b,严格模式会报错