1 语句
JavaScript 程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句。
而表达式是为了完成某种任务才进行的操作
最根本的区别是:
语句一定没有返回值 ,比如 var a = 1+3;
表达式一定有返回值 比如 1+3;
语句以分号结尾,一个分号就表示一个语句结束。多个语句可以写在一行内。
特殊:
;;;
也是语句,视为空语句,但是是三个空语句,但是这样的语句也就在这扯扯,没有丝毫意义
2 变量
变量的作用就是为值起名,然后引用这这个名字,就等同于引用这个名字所指向的值!!!
var a = 1;
上述语句就是在a和1之间建立了引用关系,需要注意的是:上述语句其实是分为两步:
var a;
a = 1;
如果只是声明了变量但是没有给他赋值,则变量的值为undefined,undefined
是一个 JavaScript 关键字,表示“无定义”。
如果变量赋值的时候,忘了写var
命令,这条语句也是有效的。
var a = 1;
// 基本等同
a = 1;
但是不是用 var 关键字,非常不利于表达意图,并且常常神不知鬼不觉的创建全局变量,导致污染,因此不建议使用!
如果一个变量未声明就直接使用,会报错,提示你undefined
x
// ReferenceError: x is not defined
变量的类型没有限制,可以随时更改
var a = 1;
a = 'hello';
如果使用var
重新声明一个已经存在的变量,是无效的。
var x = 1;
var x;
x // 1
但是,如果第二次声明的时候还进行了赋值,则会覆盖掉前面的值。
var x = 1;
var x = 2;
// 等同于
var x = 1;
var x;
x = 2;
变量的提升:
JavaScript 引擎的工作方式是,先解析代码,然后获取所有的被声明的变量,然后一行一行的运行,这造成的结构就是所哟的声明语句都会被提到代码的头部,这就是变量提升
console.log(a);
var a = 1;
相当于
var a;
console.log(a);
a =1;
最后结果为undefined,无可厚非
3 标识符
标识符(identifier)指的是用来识别各种值的合法名称。最常见的标识符就是变量名,以及后面要提到的函数名
第一个字符不能为数字,可以是字母,下划线,美元符号,后边的所有字符均可以为数字,字母,下划线,美元符号
注意:标识符不能包含-(减号或横线),中文也是合法的标识符,标识符不能为关键字
4 注释
单行注释://
多行注释:/**/
此外,由于历史上 JavaScript 可以兼容 HTML 代码的注释,所以<!--和-->也被视为合法的单行注释。
但是-->只有在行首才会被当作单行注释
x = 1; <!-- x = 2;
--> x = 3;
上面代码中,只有x = 1会执行,其他的部分都被注释掉了。
需要注意的是,-->只有在行首,才会被当成单行注释,否则会当作正常的运算。
function countdown(n) {
while (n --> 0) console.log(n);
}
countdown(3)
// 2
// 1
// 0
上面代码中,n --> 0实际上会当作n-- > 0,因此输出2、1、0。
5 区块
JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。
对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。
{
var a = 1;
}
a // 1
6 条件语句
i f 结构
var x = 1;
var y = 2;
if (x = y) {
console.log(x);
}
// "2"
上面代码的原意是,当x等于y的时候,才执行相关语句。但是,不小心将严格相等运算符写成赋值表达式,结果变成了将y赋值给变量x,再判断变量x的值(等于2)的布尔值(结果为true)。
这种错误可以正常生成一个布尔值,因而不会报错。为了避免这种情况,有些开发者习惯将常量写在运算符的左边,这样的话,一旦不小心将相等运算符写成赋值运算符,就会报错,因为常量不能被赋值。
if (x = 2) { // 不报错
if (2 = x) { // 报错 Invalid left-hand side in assignment
if…else 结构
else代码块总是与离自己最近的那个if语句配对。
var m = 1;
var n = 2;
if (m !== 1)
if (n === 2) console.log('hello');
else console.log('world');
相当于
if (m !== 1) {
if (n === 2) {
console.log('hello');
} else {
console.log('world');
}
}
如果想让else代码块跟随最上面的那个if语句,就要改变大括号的位置。换成传统的if--else,规矩点!!!
switch结构
var x = 1;
switch (x) {
case true:
console.log('x 发生类型转换');
default:
console.log('x 没有发生类型转换');
}
// x 没有发生类型转换
switch语句内部采用的是“严格相等运算符”,不进行类型转换
7 循环语句
for while do...whiile 都很简单
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。break语句用于跳出代码块或循环。continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环
语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
continue语句也可以与标签配合使用。
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) continue top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// i=2, j=0
// i=2, j=1
// i=2, j=2
当跳到1,1的时候此时i=1,j=1,就跳到最外层的循环哪里去了,i=2,j=0;