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;