这篇文章开始,我们来对 JS 知识做一些总结。我们首先来看看 JS 的基本语法。
表达式与语句
表达式
表达式是一组代码的集合,它返回一个值。接下来我们来举例说明
- 1 + 2 表达式的值为 3
- add(1, 2) 表达式的值为函数的返回值
- console.log 表达式的值为函数本身
- console.log(3) 表达式的值 为 undefined ,打印 3 ,不代表返回值。
问号冒号表达式(三元运算符)
语法:表达式1 ? 表达式2 : 表达式3
n > 0 ? n :-n
&& 短路逻辑
A && B && C && D
取第一个假值或 D,并不会取 true / false
。window.f1 && console.log('f1存在')
取值为 undefined
。
|| 短路逻辑
A || B || C || D
取第一个真值或 D 。a = a || 100
这个表达式取不到值,程序会报错,因为 a 没有被创建。
语句
var a = 1 是一个语句
二者的区别
- 表达式一般都有值,语句可能有也可能没有
- 语句一般都会改变环境(声明,赋值)
注意:上面两点不是绝对的
大小写敏感
- var a 和 var A 是不同的
- object 和 Object 是不同的
- function 和 Function 是不同的
空格
大部分空格没有实际意义,var a = 1 和 var a=1 没有区别,加回车大部分时候也不影响,只有一个地方不能加回车,那就是 return 后面。
return 加回车,会在 return 后面自动补充一个 undefined,return undefined。
标识符
标识符就是代码中用来标识变量、函数、或属性的字符序列。
规则
第一个字符,可以是 Unicode 字母或 $ 或 _ 或中文,后面的字符,除了前面所说,还可以有数字。
举例:
- var _ = 1
- var $ = 2
- var ____ = 6
- var 你好 = 'hi'
if 语句
语法
if (表达式) {语句 1} else {语句 2}
{} 只在第一句的时候可以忽略,不建议这样做。
特殊情况
- 表达式可以是 a = 1
- 语句 1 和语句 2 里可以嵌套 if...else
- 不带{}时,缩进需要注意,只有第一行代码属于 if...else 的执行语句
写法
最推荐写法
if (表达式) {
语句
} else if (表达式) {
语句
} else {
语句
}
次推荐写法
function fn() {
if (表达式) {
return 表达式
}
if (表达式) {
return 表达式
}
return 表达式
}
switch 语句
语法
switch (fruit) {
case "banana":
// ...
break;
case "apple":
// ...
break;
default:
break;
}
在 JS 中,switch 语句如果不添加 break 关键字,会造成事件穿透,开发中不推荐使用。
while 语句
语法
while (表达式) {语句}
执行流程:判断表达式的真假
- 当表达式为真,执行语句,执行完再次判断表达式的真假
- 当表达式为假,执行后面的语句
特殊举例:
let a = 0.1;
while (a !== 1) {
console.log(a);
a = a + 0.1;
}
这个例子会进入死循环,原因是因为浮点数运算,可能丢失精度。
for 循环
实际上 for 循环就是一个语法糖,是 while 循环的方便写法。
语法
for (语句1; 表达式2; 语句3) {
循环体
}
执行流程:先执行语句 1,然后判断表达式 2。
- 如果为真,执行循环体,然后执行语句 3。
- 如果为假,直接退出循环,执行后面的语句。
特殊举例:
for (var i = 0; i < 5; i++){
setTimeout(() => {
console.log(i);
}, 0);
}
这个例子,结果会打印 5 个 5。
原因:循环执行结束,i == 5 ,延迟打印 i 的值为 5。与 var 的提升有关。
上述代码可以变形为:
var a = 1;
function fn() {
console.log(a);
}
打印值取决于函数什么时候调用,我们开始一个延迟函数 setTimeout(fn)
,a = 5,打印出 5 。
如果我们将 var 替换为 let ,则会以此打印 0 1 2 3 4 。
break 和 continue
break 为退出所有循环,continue 为退出当前一次循环。
注意:break 只退出离得最近的循环
label
label 为标记语句,可以和 break
或 continue
语句一起使用。
语法
foo: {
cosole.log(1);
break foo;
console.log('本行不会输出');
}
console.log(2)
通过 label 的这种语法,我们可以做到让多层循环内的最里层循环执行 break label来退出指定层循环。
注意:{foo: 1}
在浏览器中,这就是一个标签,值为 1。只有 var a = {foo: 1}
时,才是一个对象。