携手创作,共同成长!这是我参与「掘金日新计划 · 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 if。
if在单条语句里可以省略{}
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){
}
参数b的TDZ会访问b,所以会出错,a不会出错,因为前面a=42声明过了,所以后面的a+b+5中的a跨出了a的TDZ