表达式与语句
表达式
- 1+2 表达式的值为3
- add(1+2) 表达式的值为函数的返回值
- console.log 表达式的值为函数本身
- console.log(3) 表达式的值为undefined
语句
var a = 1 + 3;
上面是一行赋值语句。
二者的区别
- 表达式一般都有值,语句可能有也可能没有
- 语句一般会改变环境(声明、赋值)
- 上面两句话并不是绝对的
大小写
JavaScript 中的大小写敏感,不要写错。
- var a 和 var A 是不同的
- object 和 Object 是不同的
- function 和 Function 是不同的
空格
大部分空格没有实际意义,var a = 1 和 var a=1 没有区别。
加回车大部分时候也不影响,只有一个地方不能加回车,那就是 return 后面,如果 return 后面不加任何东西,会自动补上 undefined。
function fn() {
return 3
}
fn() //3
function fn() {
return
3
}
fn() //undefined
标识符
- 第一个字符,可以是 Unicode 字母、美元符号( $ )、下划线( _ )或中文
- 后面的字符,除了上面所说,还可以用数字 0-9
下面是一些合法的标识符:
var _tmp = 1
var $elem = 2
var ______ = 6 //虽然合法,但是为了辨认,最多使用两个下划线 '_'
var 你好 = 'hi'
区块 block
JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。
对于var
命令来说,JavaScript 的区块不构成单独的作用域(scope)。
var a = 1
{
var a = 2
}
console.log(a) //2
区块 block 常与 if/for/while 配合使用。
if 结构
if( 表达式 ){
// 满足条件时,执行的语句1
} else{
// 不满足条件时,执行的语句2
}
语句1和语句2里都可以嵌套 if else。
{}
在语句只有一句的时候可以省略,但是不建议这样做。省略 {}
时要注意缩进:
var a = 1
if (a === 2)
console.log('a')
console.log('a等于2')
上面代码中,输出结果为:a等于2
if...else 结构最推荐使用的写法:
if (表达式) {
//语句
} else if (表达式) {
//语句
} else {
//语句
}
if...else 结构次推荐使用的写法:
function fn() {
if (表达式) {
return 表达式
}
if (表达式) {
return 表达式
}
return 表达式
}
if...else 的三种简写形式
1. 问号冒号表达式 条件 ? 表达式1 : 表达式2
如果“条件”为true
,返回“表达式1”的值,否则返回“表达式2”的值。
function max(a, b) {
return a > b ? a : b //如果 a > b,返回 a 值,否则返回 b 值
}
2. && 逻辑 A && B && C && D
返回第一个假值或者 D,并不会返回 true/false。
if (window.f1) { console.log('f1存在') }
//简写成 && 逻辑:
window.f1 && console.log('f1存在')
常用写法:
console && console.log && console.log('hi') // IE 没有 console
3. || 逻辑 A || B || C || D
返回第一个真值或 D,并不会返回 true/false
if (!a) { b } else {}
//简写成 || 逻辑:
a || b
常用写法:
var a = a || 100; // 100为保底值
whild 循环
while (表达式) { 语句 }
- 先判断表达式的真假
- 当表达式为
true
,执行语句,执行完再次判断表达式的真假 - 当表达式为
false
,执行后面的语句
var i = 0 //初始化
while (i < 10) { //判断
console.log(i) //循环体
i = i + 1 //自增
}
会死循环的一个例子:
var a = 0.1
while (a !== 1) {
console.log(a)
a = a + 0.1 //a 的值为浮点型,不精确,很难等于1
}
for 循环
for (语句1; 表达式2; 语句3) { 循环体 }
- 先执行语句1(初始化)
- 然后判断表达式2(条件)
- 如果为
true
,先执行循环体,然后执行语句3(递增表达式) - 如果为
false
,直接退出循环,执行后面的语句
可以省略初始化语句:
let i = 0;
for (; i < 5; i++) { console.log(i) }
示例1:
for (var i = 0; i < 5; i++) {
console.log(i)
}
i //循环结束后,i = 5
示例2:
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
上面代码中,结果会输出5个5,由于 setTimeout
是异步执行的,所以 for
循环执行结束后(此时 i = 5,见示例1)再执行 setTimeout
,且执行五次。
把 var
改为 let
能让示例2打印出0,1,2,3,4:
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
break 和 continue
break
会退出当前所有循环:
for (var i = 0; i < 10; i++) {
if (i % 2 === 1) {
break;
}
} //当i等于1时,跳出循环
continue
语句会退出当前一次循环:
for (var i = 0; i < 10; i++) {
if (i % 2 === 1) {
continue // i 为奇数时跳过
} else {
console.log(i) // i 为偶数时输出
}
}
// 输出结果
// 0
// 2
// 4
// 6
// 8
标签(label)
JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置。语法如下:
label:
语句
示例:
foo: {
console.log(1)
break foo //执行到这里就跳出代码块
console.log('本行不会输出')
}
console.log(2)
// 输出结果
// 1
// 2
值得注意的例子:
{
foo: 1;
}
上面代码表示:代码块中有一个名为 foo
的标签,其内容为 1
,它不是一个对象,而是一个代码块(block)。