JavaScript语法(二)

77 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

大家好!我是前端爬楼工程师🚹,一个野生程序员。好奇新技术,仰慕牛大佬。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~

上下文规则

有时候同样的语法在不同的情况下会有不同的解释。

大括号{..}
  • 对象常量
var a = {
    foo:bar()
}

a是赋值的对象,叫左值,{..}是所赋的值,叫右值。

  • 标签
// 将上例中的 var a 去掉
{
    foo:bar()
}

这里 {..}是代码块。也叫做标签语句。foo 是语句bar()的标签

标签语句的作用可以进跳转,比如

foo: for(var i = 0; i<4;i ++){
        for(var j =0; j< 4;j++){
            if(j == i){
                continue foo; //跳转到foo的下一个循环
            }
            if((j*i) % 2 == 1){
                continue; // 继续内层循环
            }
        }
    }

continue foo;执行foo循环的下一轮循环。

代码块
[] + {} // "[Object object]"
{} + [] // 0

第二行代码{}被当做一个独立的空代码块。 + [] 强制类型转换为0;

对象解构
function getData(){
    return {
        a:42,
        b:"foo"
    }
}
var {a, b} = getData()

function foo({a,b,c}){
    console.log(a,b,c)
}
foo({
    c:[1,2,3],
    a: 42,
    b: "foo"
})

else if 和可选代码块

if(a){
    //..
}else if(b){
    //..
}else {
    // ..
}

事实上Javascript里没有else ifif在单条语句里可以省略{}

if(a){doSomething(a)} => if(a) doSomething(a)

else也是如此

if(a){
    //..
}else{
    if(b){
        //..    =>
    }else{
        //..
    }
}
// 省略{} 变成 else if
if(a){
    //..
}else
    if(b){
        //..    
    }else{
        //..
  }

运算符的优先级

看个之前的例子

var a = 42, b;
b = (a++, a) 
a //43
b //43

//去掉括号
var a = 42, b;
b = a++ , b;
a // 43
b // 42

逗号的优先级比=低, 所以可以理解为(b = a ++),a,前面说过a++有副作用,所以b的值是++a做递增之前的值42.

关联

关联和代码的执行顺序不是一回事。

a && b && c  

先计算a && b,后 b && c

 //?:
 a ? b: c?d:e;

a ? b : (c ? d : e)组合顺序应该是这样的。所以?:是右关联即从右到左。


错误

JavaScript有各种类型的错误: TypeError, ReferenceError,SyntaxError

提前使用变量

TDZ:Temporal Dead Zone(暂时性死区)指的是由于代码中的变量还没初始化而不能被引用的情况。

{
    a = 2;
    let a  // ReferenceError 这里是`a`的TDZ
}
 {
     typeof a ;
     typeof b;
     let b // ReferenceError 这里是`b`的TDZ
 }

函数参数

 var b = 3;
 function foo(a = 42, b = a + b+ 5){

 }

参数bTDZ会访问b,所以会出错,a不会出错,因为前面a=42声明过了,所以后面的a+b+5中的a跨出了aTDZ