目录:
一:语句
js程序的执行顺序是从上到下执行。
js程序执行单位为行,一般情况下,一行就是一个语句,但语句可以以分号结尾,一个分号标识一个语句结束,故可以多个语句写在一行内。
var a = 1 + 3; //这是一个标准的JS赋值语句,先声明变量,再赋值。
var a = 1 + 3; var b = 'abc';//因为分号的存在,多个语句可写在一行内。
;;;//如果仅仅写分号,代表三个空的JS语句
有些时候写代码的时候并没有在语句的后面添加分号,是因为浏览器或者编辑器也会默认一行为一个JS语句,默认帮我们加上了分号。
二:变量声明及提升
(1):变量及其声明
变量是对"值"的引用,使用变量等同于引用一个值,每一个变量都有一个变量名。
var a = 1;
在上面的代码中,先是声明变量a,然后在a与数值1之间建立引用关系,完成了将数值1赋值给变量a,以后引用变量a就会得到数值1。其中最前面的var,是变量声明命令,告诉浏览器要创建变量a,而a则是变量名,等号表示引用关系。
变量的声明与赋值,在实际上是分开的两个步骤,等同于下面的代码:
var a; // 声明变量,此时变量a是undefined,相当于只声明未赋值
a = 1; // 完成赋值,此时变量a与数值1完成引用关系,a就代表数值1
变量如果没有声明就直接使用,回报变量未定义的错。
JS之所以是一种动态类型的语言,是因为变量的类型没有限制,可以给任何变量赋予任何类型的值。
var a = 1; // 给变量a赋值为数值类型的值
a = 'hello'; // 给变量a赋值一个字符串的值。
var a;//变量的二次声明,二次声明是无效的。
var a = 2; // 变量的二次声明并赋值,会讲第一次赋值给覆盖掉
(2):变量声明提升
js引擎的工作方式是:先解析代码,获取所有的被声明的变量,然后再一行一行的运行。这样造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,称之为变量提升。
在JS引擎解析代码的过程中,会将函数的JS区块也提升,不过是将其放到内存的堆中,所以写在后面的函数,同样可以在前面直接调用。
变量声明提升只对var 声明的变量有提升效果,对于ES6中let和const等声明的变量无提升效果,这一点将会在ES6中详细说明。
console.log(a); // undefined,并不会报变量未声明的错,原因就在于var a 这条声明语句会提前
var a = 1
console.log(a); // 1
上面的代码等同于:
var a
console.log(a) // undefined
a = 1
console.log(a) // 1
所以变量声明提升就是一行语句中的声明赋值回分开进行,将声明语句提升到前面,赋值语句则在原地,当在前面用到该变量是,并不会报未声明的错误。
三:标识符
标识符是用来识别具体对象的名称,例如变量名称,函数名称。JS对标识符大小写敏感,所以a和A是两个不同的标识符。
标识符的命名规则:
- 第一个字符,可以是任意Unicode字母(包括英文字母和其他语言的字母)、美元符号"$“和下划线”_"
- 第二个字母及后面的字符,除了Unicode字母,还可以用数字0-9.
arg0、_tmp、$elem、π // 合法标识符
1a、23、****、a+b、-d // 不合法字母,第一个标识符不能是数字,标识符也不能包含星号,加好,减号或者连线词
var 中文变量 = 1; // 合法标识符,中文名称可用作标识符。
JS还有一些保留字,不能用作标识符,如下:
arguments、 break、 case、 catch、 class、
const、 continue、 debugger、 default、 delete、
do、 else、 enum、 eval、 export、
extends、 false、 finally、 for、 function、
if、 implements、 import、 in、 instanceof、
interface、 let、 new、 null、 package、
private、 protected、 public、 return、 static、
super、 switch、 this、 throw、 true、
try、 typeof、 var、 void、 while、
with、 yield
此外,还有一些特别含义的字也不能当做标识符:infinity
,NaN
,undefined
四:注释
源码中被JS引擎忽略的部分就叫做注释,它的作用是对代码进行解释。JS提供两种注释:一种是单行注释,用//起头;另一种是多行注释,放在/* 和 */之间
// 单行注释
/*
多
行
注
释
*/
此外,JS在历史上为兼容HTML代码的注释,还有一种单行注释:
x = 1; <!-- x=2;
--> x =3; //只会执行x=1,其中x=2和x=3都被注释掉了,
// 需要注意的是"-->"只有在行首,才会被当成单行注释,否则会被当"-- >"两个运算符。
function countdown(n) {
while (n --> 0) console.log(n);
}
countdown(3)
// 2
// 1
// 0
五:区块
JS使用大括号,将多个相关的语句组合在一起,称为"区块"(block).
{
var a = 1
}
不过,在js中,区块不构成单独的作用域,区块内的变量与区块外的变量,属于同一个作用域。所以在JS中,单独使用区块的意义不大。区块往往用来构成其他更复杂的语法结构,比如for
、if
、while
、function
等。