1、语句&表达式
语句(statement):是为了完成某种任务而进行的操作,一般不需要返回值。
表达式(expression):是指一个为了得到返回值的计算式,一定会返回一个值。
var a = 1 + 2;
如上述代码就是一句赋值语句,1+2就是表达式,两者的区别就是语句是为了完成某种任务,而表达式是为了得到返回值。
语句一般用分号结尾,表达式不需要分号结尾,一旦表达式加上分号,就被JS引擎视为语句
1 + 1 ;'ccc';
比如上面两行语句只是单纯地产生一个值,没有任何实际的意义。
2、变量
变量是对‘值’的具名引用,简而言之,就是为‘值’起名。
var a = 1;
变量的声明和赋值是分两步走的,如上述语句:
声明创建一个变量a
将数值1赋值给变量a
也就是说实际步骤如下:
var a; a = 1;
2.1 只声明变量不赋值
var a; a // 变量值是undefined(无定义)
2.2未声明变量就直接使用
a;// ReferenceError : a is not defifned
JS会报错,告知变量未定义
2.3 var
var a = 1;// 基本等同于a = 1;
两个语句虽然基本等同,但是不写var不利于表达意图,很容易在不知不觉中创建全局变量
2.4 变量提升(hoisting)
JS 引擎工作方式是,先解析代码,获取所有被声明的变量,然后再一行行的运行,造成的结果就是所有变量的声明语句都会被提到代码头部,这就是变量提升。
我举个例子给你看
console.log(a);var a = 1;
按理说上述语句应该报错,因为打印变量a,但是a的声明赋值语句还没执行,但实际上不会报错,因为变量提升,真正的执行步骤是这样的:
var a;console.log(a); a = 1;
所以最后的结果不是报错,而是undefined,因为a只声明未赋值。
注:变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。
比如
console.log(a) a = 1;
这样语句将会报错,提示“ReferenceError: a is not defined”。即变量a未声明。
这是因为a不是用var命令声明的,变量提升没有发生。
3、标识符(identifier)
标识符用来是被各种值得合法名称,最常见的标识符就是变量名以及后面会提到的函数名。
注:JS语言的标识符对大小写敏感,a和A是不同的。
标识符命名规则:
第一个字符:可以是任意Unicode字母(包括英文以及其他语言字母),还有美元符号$与下划线_
第二个字符及后面的字符,除了Unicode字母,美元符号$和下划线_,还可以用数字0-9
// 合法标识符例子a$s000 _tmp $elem π// 非法标识符例子0uu$ // 标识符不能数字开头*** // 标识符不能包含星号a+b // 标识符不能包含加号-d // 标识符不能包含减号或连词线
JavaScript有一些保留字,不能用作标识符: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。
4、注释
单行注释
// 单行注释
多行注释
/* 这样 就是 多行 注释 */
此外,由于历史上 JavaScript 可以兼容 HTML 代码的注释,所以也被视为合法的单行注释。但是-->只能用再句首,否则会被当做运算符。
a = 1; <!-- a =2; -->
5、区块(block)
JS使用{}将多个相关语句组合在一起,称为区块
注:对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。
6、条件语句
6.1 if 语句
if结构先判断一个表达式的布尔值,然后根据布尔值的真伪,执行不同的语句。
所谓布尔值,指的是 JavaScript 的两个特殊值,true表示真,false表示伪。
if(布尔值){ 语句; }
上面是if结构的基本形式。需要注意的是,“布尔值”往往由一个条件表达式产生的,必须放在圆括号中,表示对表达式求值。
如果表达式的求值结果为true,就执行紧跟在后面的语句;如果结果为false,则跳过紧跟在后面的语句。
注:赋值表达式(=),相等运算符(==),严格相等运算符(===)要注意区分
尤其是赋值表达式,它不具备比较功能
var x = 1;var y = 2;if (x = y) { //应该使用严格相等运算符 x===y 就可以了 console.log(x); }// "2"
本意是使x=y,但是在JS中就成了把y的值赋给x,所以打印x就得到了2。
至于相等运算符(==)和严格相等运算符(===)的区别,简单来讲就是:
相等运算符(==)比较两个值是否相等,严格相等运算符(===)比较它们是否为“同一个值”。
如果两个值不是同一类型,严格相等运算符(===)直接返回false,而相等运算符(==)会将它们转换成同一个类型,再用严格相等运算符进行比较。
6.2 if···else
if(condition){ 代码块; //true statement }else { 代码块; //false statement }
其中condition可以是任意表达式,结果不一定是布尔值。
JavaScript解释器会自动调用Boolean()将表达式结果转为布尔值,如果表达式为真,执行第一个代码块内语句;如果为假,执行第二个代码块内语句
if语句可以单独使用,也可以和多个else连续使用
if (m === 0) { // ...} else if (m === 1) { // ...} else if (m === 2) { // ...} else { // ...}
这样似乎麻烦了一点,所以就引出了下面一个结构switch
6.3 switch结构
switch(expresstion){ case value1: //该条件:(满足)这个值 statement; //则执行该语句 break; //强制输出 case value2: statement; break; default: statement; }
switch和case可以使用任意表达式,不一定是常量
switch语句后面的表达式,与case语句后面的表示式比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。
image
6.4 三元运算符 ? :
//语法(条件) ? 表达式1 : 表达式2// 如果“条件”为true,则返回“表达式1”的值,否则返回“表达式2”的值。
例子:
var even = (n % 2 === 0)? true : false;// 等同于var even;if(n % 2 === 0){ even = true; }else{ even = false; }
7、循环语句
7.1 while循环
前测试循环语句,先条件判断,后执行。也就是说while循环最少执行0次,一开始条件就不符合,所以不予执行。
while(expression){ statement; } // 只要条件为true,就一直循环
image
7.2 do···while循环
后测试循环语句,先执行后条件判断,也就意味着不管条件真假,do···while循环至少要运行一次。这是与while循环的最大区别。
do{ statement; }while(expression);
image
作者:饥人谷_陈杨
链接:https://www.jianshu.com/p/6cd993927014