表达式和语句
- 1+2表达式的值是3
- add(1,2)表达式的值是函数的返回值
- console.log(3)的值是Undefined,因为返回值是undefined.
JS大小写敏感
空格
大部分空格都没有实际含义
加回车大部分也没有实际影响
只有一个地方不能加回车,那就是return后面, 否则会返回undefined
标识符
标识符是指变量的合法命名。规则如下:
- 第一个字符,可以是任意Unicode字母(包括英文字母、希腊字母、中文)、下划线(_)、$符号,不可以是数字开头
- 第二个字符及后面的字符,除了 Unicode 字母、美元符号和下划线,还可以用数字0-9
如图,如果用数字作为变量名的开头,会报错invalid or unexpected token
if语句
if(表达式){}
{}在只有一个语句时可以省略,注意是一个语句而不是一行!
js
复制代码
const a = 1;
if (a === 2)
console.log('打印a'); console.log('打印b')
这里只会打印b
Switch语句
每个case都需要写一个break,不然,如果banana没有break, 那么它会继续执行apple的部分,直到碰到了Break
&&短路逻辑
js
复制代码
if (window.f1) {
console.log('f1存在')
}
js
复制代码
window.f1 && console.log('f1存在')
这两句语句等价
js
复制代码
a&&b
等价于
if (a) {
b
}
A&&B: 如果A是真,就看B的值;如果A是假,就看A的值,就不会管B
短路A&&B&&C&&D : 取第一个假值 或者 B
||短路逻辑
js
复制代码
a||b
等价于
if(!a) {
b
}
常见的应用场景就是给a设定默认值
js
复制代码
a = a || 100
如果a存在就a=a, 如果a不存在, a=100
等价于
if (a) {
a = a
} else {
a = 100
}
while循环
js
复制代码
let a = 0.1;
while (a !== 1) {
console.log(a)
a = a + 0.1
}
由于浮点数的计算时不精确的,所以以上代码会死循环
For循环
js
复制代码
for (let i = 0; i < 5; i++) {
console.log(i)
}
请问这里打印出的i是多少?
console.log(i)
答案是5, 因为当i == 4, i = i + 1 = 5, 然后退出循环
setTimeout就是过一段时间执行
js
复制代码
for (var i = 0; i < 5; i++) {
setTimeout(()=>{
console.log(i)
}, 0)
}
会打印出5次5
我们已经知道for (var i = 0; i < 5; i++) {}执行完毕后,i的值是5 而setTimeout就是过一段时间执行, 而for循环是当前任务,所以这段代码意思就是说等到for循环执行完毕了,再打印5次i,所以就会打印5个5
js
复制代码
for (let i = 0; i < 5; i++) {
setTimeout(()=>{
console.log(i)
}, 0)
}
当把var 换成 let, 就会打印出 0, 1, 2, 3, 4
break 和 continue
- break是跳出离它最近的一个for循环
- continue是跳出本次循环,下次继续
js
复制代码
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 5; j++) {
if (i===5) {
break;
}
}
console.log(i)
}
会打印出0,1,2,3,4,5,6,7,8,9
因为break只会跳出和他最近的一个for循环
label
js
复制代码
{
a:1;
}
- 以上的代码是:有一个代码块,代码块里有一个label, a: 1 表示这个标签是a, a的值是1
- 以上代码不是一个对象!
js
复制代码
foo: {
console.log(1)
break foo;
console.log('本行不会输出')
}
console.log(2)
foo 表示 label的标识符是 foo, break foo 表示退出当前的Label, 所以代码会输出1, 2