什么是表达式?

1 + 1 、2 + 2 、3 * 4 等这类的为表达式,值分别为2、4、12;
add(1,2)也是表达式,这个表达式的值为函数的返回值;
console.log表达式的值为函数本身;

【问】:console.log(3) 表达式的值为多少?
【答】:undefined。

如果不熟悉,就会觉得这是数字3,但实际上是undefined?
根据上面的定义“console.log表达式的值为函数本身”可知,console.log(3)的值为自己的函数,则为undefined;而数字3只是console.log(3)的返回值!!
如图:

image.png

什么是值?什么是返回值?

值就是直接由表达式得出的结果;而返回值是由函数里面把处理后的结果反馈给调用者。

所以很明显,刚刚的那个console.log(3)的值与返回值就很容易区分了!

语句是什么?

JavaScript 程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句。 ——-网道JavaScript

所以,像是 var a = 1这类的就是语句了。

那么语句和表达式有什么区别?

  • 前者一般没有值,后者可能有值。当然这不是判断的唯一标准,有时候两者都有值,有时候没有,这种情况相对比较少。
  • 语句一般会改变环境(声明、赋值),如var a = 1,a就是一个环境,声明了变量a之后原本是没有值的,现在就赋值为1,这个过程就是在改变环境。同样这也不是绝对区分。
  • 结尾为分号;的话JS就会视为一个语句,即使这一行只有分号之外什么都不写,同样还是一条语句,只不过是空的语句。
  • 注意,如果一条语句后加了个逗号,表示这条语句没完,后面再写一些东西才是一条完整的语句,JS是这么判断的,跟语文的逗号语义没有区别。

标识符是什么?

简单来说就是给容器起个名字,这个名字就是标识符,如var a = 1表示声明一个容器,并给该容器起名为a,值为数字1。

规则:

  • 标识符大小写敏感,A与a是不一样的,如object和Object是不一样的,只有一字母大小写之差。
  • 标识符只能由是Unicode字母、$、_、数字组成甚至可以是中文或其中的随机几样组成,其他无效,注意标识符第一个字符不能是数字,否则无效。

空格与回车

大部分的空格其实是没有实际意义的,如var a = 1var a=1这两种没有区别,只是为了好看而已。

但注意关键字两边要有空格,不然两边没有空格接上别的字符可能就不是原来的关键字了,如vara=1,vara是什么?JS也不知道。

大部分的回车其实也不影响,如图
image.png

三种函数其实是一样的,没有区别。但是,只有return后面是不可以回车的,不然return后面就什么都没有!如图

image.png
显然,return后就不会继续往下走了。

如何写出好的注释?

什么是不好的注释?

  • 把代码翻译成中文:(程序员会看不懂代码讲什么吗?如var a = 1 //声明一个变量a赋值为1
  • 发泄不满的注释:(首先要对人对事,个人恩怨是自己跟对方的恩怨,无关其他。代码是许多人的心血,因为个人恩怨在代码里面写了一些不好听的话结果影响产品,这是不可取的。)
  • 过时的注释:(如果第一条代码写多了就很容易变成过时的注释,如var age = 18万一以后不是18怎么办?)

所以,好的注释应该是:

  • 发现了一个bug,然后自己解决了这个bug,然后为了防止自己忘记,就写注释,内容为有什么bug以及解决的过程。
  • 有时候因为某些人的需求写了个让人摸不着头脑的代码(如故意在加载页面的时候故意延迟10秒加载完成的代码,交了钱的用户才能直接跳过10秒的延迟),但可能其他的程序员不知道,就把这个需求写进注释里。

if else语句

这是判断语句,用来判断结果为真就会执行相应的代码,否则不执行。

格式为:if(表达式){语句1}else{语句2}

正常情况下应该是这样子的,如图

image.png

如果是执行多条语句,就可以用多条if...else语句连在一起。如图

image.png

其实这个是简化写法,完整写法应该是,如图

image.png

原本是没有else if的写法,但是后来的人发现只要里面只有一条语句时,就可以去掉花括号,不会影响什么就会变成这样,如图

image.png

根据回车在这里没有什么意义,直接简化为上面第一张图!这就是else if的由来!

踩坑环节

因为花括号是可以去掉的,所以很容易照成歧义,如

  1. a = 1
  2. if(a === 2)
  3. console.log('a')
  4. console.log('a等于2')
  5. //请问会打印出什么?

答案是会执行第二条 console.log('a等于2') ,如果把花括号还原应该是这样子的

  1. a = 1
  2. if(a === 2){
  3. console.log('a')
  4. }
  5. console.log('a等于2')

所以忽略花括号很容易出现歧义,建议使用最没有歧义的写法!!!这是程序员的戒律!

最推荐的写法

  1. if(表达式){
  2. 语句
  3. } eles if(表达式){
  4. 语句2
  5. } else {
  6. 语句3
  7. }

次推荐的写法

  1. function fn(){
  2. if(表达式){
  3. return 表达式
  4. }
  5. if(表达式){
  6. return 表达式
  7. }
  8. return 表达式
  9. }

switch 语句

该语句根据选什么就会选什么。

  1. switch (要选择什么){
  2. case '选项1':
  3. //...
  4. break;
  5. case '选项2':
  6. //...
  7. break;
  8. case '选项3':
  9. //...
  10. break;
  11. default:
  12. //都不选就选这个
  13. break;
  14. }

注意,这个语法不能省略 break !如果省略 break ,否则会执行所有省略 break 的选项!

不建议使用此语法,完全可以用 if else 代替。

问号冒号表达式(三元运算符 )

语法: 条件判断 ? 表达式1 : 表达式2

判断条件为真,返回 表达式1 的值,否则返回 表达式2 的值。
这个比较常用,如果可以用这个代替 if else 语句,就直接用问号冒号表达式!如

  1. var even;
  2. if (n % 2 === 0) {
  3. even = true;
  4. } else {
  5. even = false;
  6. }

可以这样写

  1. var even = (n % 2 === 0) ? true : false;

短路逻辑

学过数学都知道且(&&)和或(||)在编程里有语法可以代表着两种概念。这个十分常用,能代替 if else 就代替。

  1. a||b
  2. //代表或,如果a为真,直接返回a的值,且直接忽视第二个值;如果a为假,不管b是否为真,都会返回b。
  3. a&&b
  4. //代表且,跟或反着来的。如果a值为真,返回b的值,如果a为假,返回a的值。

常见用法为

  1. fn && fn() //如果fn为真,就可以执行函数fn(),方便吧!
  2. a = a || b

空值合并运算符 ‘??’

例子: 如果a ?? b,假如anull/undefined,那么结果就为b,反之a不为null/undefined,结果就为a。

功能上类似与||,而且兼容也没那么好,是最近加上来的,并且两种运算符有时候是可以相互代替。但是,??可以分辨0、''与null/undefined的区别,而||分别不出来。

注意:??禁止与||&&一起使用,需要分开,否则报错。

while 循环

  1. //语法
  2. while(表达式){
  3. //语句
  4. }
  5. //如果表达式一直判断为真,就会一直执行语句,直到判断为假的时候才会结束循环。如
  6. var a = 0
  7. while (a < 10){
  8. console.log(a)
  9. a++
  10. }

do…while循环

do...while 用得不多,但还是要了解一下的。

do...whilewhile 循环其实差不多,区别在于 do...while 是先直接执行语句再判断条件,而 while 先判断条件才执行语句。

  1. //语法
  2. do {
  3. 语句
  4. } while (条件);
  5. //或者
  6. do
  7. 语句
  8. while (条件);

for 循环

for 相对 while 来说更方便。

  1. //语法
  2. for(语句1;表达式2;语句3){
  3. 循环体
  4. }

执行步骤:

  1. 先执行语句1;
  2. 判断表达式2;
  3. 如果判断为真,执行循环体,然后执行语句3,接着就判断表达式2,一直如此反复直到判断为假,即每次执行循环体结束后,都会执行一次语句3,包括最后一次判断为假的时候没有执行循环体,也会再执行一次语句3;
  4. 如果判断为假,就退出循环体,执行后面道语句。

注意:
步骤三有个十分重要的细节,在判断为假的时候,最后会再执行一次语句3,之后才执行后面的语句!如图

图片.png

没错,虽然最后打印出来的数字是最大是2,但是最后一次判断为假的时候因为没有执行循环体,然后再执行一次语句3,所以 i 赋值为3;

break 语句和 continue 语句

break 语句和 continue 语句都具有跳转作用,可以让代码不按既有的顺序执行。

break:直接跳出当前循环体,执行后面的语句,如图
Screenshot_20200514_113413.png

continue:忽略当前循环,继续执行之后的循环,如图:

Screenshot_20200514_113839.png

标签(label)

JavaScript 语言允许语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下

  1. label:
  2. 语句

一般用来面试用的。。。。如

  1. {
  2. foo:1
  3. }
  4. //问:这是什么?
  5. //答:这是一个label标签,这个label里面有个数字1。