书写
- 大小写 敏感,
a和A是不同的 - 空格 无实际意义,大部分并不影响书写,书写注意不要影响机器识别。例如单词与单词间的空格
- 回车 大部分并不影响书写,但在return后面加回车例外,不要在return后面加回车
- 注释
- 单行注释,用
//起头; - 多行注释,注释内容放在
/* */里面。
- 单行注释,用
语句和表达式
- 语句(statement):是为了完成某种任务而进行的操作。例如:
var a = 1 + 3;
这条语句先用var命令,声明了变量a,然后将1 + 3的运算结果赋值给变量a。
-
表达式(expression):指一个为了得到返回值的计算式。上面例子中
1 + 3就叫做表达式。1+2表达式的值是3add(1,2)表达式的值是函数的返回值console.log(3)的值是undefined,因为返回值是undefinedconsole.log()的值是其本身
-
语句和表达式的区别
- 前者主要为了进行某种操作,一般会改变环境(声明、赋值)。一般情况下不需要返回值;后者则是为了得到返回值,一定会返回一个值。
标识符
- 标识符(identifier)指的是用来识别各种值的合法名称。
- 标识符的命名规则:
- 第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母)、美元符号
$、下划线_以及中文 - 后面的字符,除了上述合法字符外,还可以用数字
- 第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母)、美元符号
合法的标识符:
arg0
_tmp
$elem
π
var 临时变量 = 1;
不合法的标识符:
1a // 第一个字符不能是数字
*** // 标识符不能包含星号
a+b // 标识符不能包含加号
-d // 标识符不能包含减号或连词线
区块
- JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。
{
let a = 1
let b = 2
}
- 对于
var命令来说,JavaScript 的区块不构成单独的作用域(scope)。
{
var a = 1;
}
a // 1
上面代码在区块内部,使用var命令声明并赋值了变量a,然后在区块外部,变量a依然有效,区块对于var命令不构成单独的作用域,与不使用区块的情况没有任何区别。在 JavaScript 语言中,单独使用区块并不常见,区块往往用来构成其他更复杂的语法结构,比如for、if、while、function等。
条件语句
JavaScript 提供if结构和switch结构,完成条件判断,即只有满足预设的条件,才会执行相应的语句。
if 语句
语法
if (表达式1) {
语句1
} else if (表达式2) {
语句2
} else {
语句3
}
在函数里使用if语句
function fn() {
if (表达式) {
return 表达式
}
if (表达式) {
return 表达式
}
return 表达式
}
特殊情况:
{}在只有一个语句时可以省略,注意是一个语句而不是一行!- 省略加缩进
switch 语句
- 多个
if...else连在一起使用的时候,可以转为使用更方便的switch结构。
语法
switch (fruit) {
case "banana":
// ...
break;
case "apple":
// ...
break;
default:
// ...
}
例如:
switch (x) {
case 1:
console.log('x 等于1');
break;
case 2:
console.log('x 等于2');
break;
default:
console.log('x 等于其他值');
}
每个case都需要写一个break,不然,如果banana没有break, 那么它会继续执行apple的部分,直到碰到了Break
问号冒号表达式:
表达式1 ? 表达式2 : 表达式3- 例如:
funtion max(a,b) {
if(a>b) return a;
else return b;
}
可以写成:
funtion max(a,b) {
return a>b ? a : b
}
$$ 短路逻辑
A && B && C && D: 取第一个假值 或者 D;并不会取true/false- 例如:
if (window.f1) {
console.log('f1存在')
}
可以写成:
window.f1 && console.log('f1存在')
|| 短路逻辑
A || B || C || D:取第一个真值 或者 D;并不会取true/false- 例如:
if (a) {
a = a
} else {
a = 100 //保底值
}
//如果a存在就a=a, 如果a不存在, a=100
可以写成:
a = a || 100
- 例如:
if(!a) {
b
}
可以写成:
a||b
循环语句
while 循环
语法
while (表达式) {
语句;
}
While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。- 判断表达式真假;
- 为真,执行语句,执行后再判断表达式的真假;
- 为假,结束循环,执行后面其他的语句。
while语句的循环条件是一个表达式,必须放在圆括号中。代码块部分,如果只有一条语句,可以省略大括号,否则就必须加上大括号。
特殊情况:
- 情况1:
正常应当输出0-9。但是在Chrome或是Edge上却是0-10。10并非正常会出现的,不知道为啥。
- 情况2:
let a = 0.1;
while (a !== 1) {
console.log(a)
a = a + 0.1
}
由于浮点数的计算是不精确的,所以上述代码会死循环。(如下图所示)
while (true) {
console.log('Hello, world');
}
这也是一个无限循环,因为循环条件总是为真。
for 循环
语法糖 : for循环是while循环的方便写法
语法
for (语句1 ;表达式2 ;语句3) {
循环体
}
- 先执行1,然后判断2
- 2为真,执行循环体,再执行3
- 2为假,直接退出循环,执行后面其他的语句
例如:
for (var i = 0; i < 5; i++) {
console.log(i)
}
console.log(i)在这里打印出的是0,1,2,3,4 。最终i 的值是 5 , 因为当i == 4, i = i + 1 = 5, 然后退出循环
特殊情况:
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。
for (let i = 0; i < 5; i++) {
setTimeout(()=>{
console.log(i)
}, 0)
}
当把var 换成 let, 就会打印出 0, 1, 2, 3, 4。因为 for循环 在用 let 时有单独逻辑。
break 和 continue
- break:退出所有循环(指的是所在的离自身最近的for循环不再执行了)
- continue:退出当前一次循环
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循环
for (var i = 0; i < 10; i++) {
for (i%2 === 1) {
continue
} else {
console.log(i)
}
}
会打印出0,2,4,6,8。(i%2 === 1表示 i 除以2余数为1得数,即单数)
label 标签
- JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。
label:
语句
- 标签可以是任意的标识符,但不能是保留字,语句部分可以是任意语句。
- 标签通常与
break语句和continue语句配合使用,跳出特定的循环。
foo: {
console.log(1);
break foo;
console.log('本行不会输出');
}
console.log(2);
foo 表示 label的标识符是 foo,break foo 表示退出当前的Label, 所以代码会输出 1 ,2
- 特殊例子:
{
foo:1;
}
上述的代码表示:有一个代码块,代码块里有一个label标签foo, 标签的内容是 1
上述代码不是一个对象!
「资料来源:饥人谷、[JavaScript的基本语法-wangdoc.com](https://wangdoc.com/javascript/basic/grammar.html)」