JavaScript 语法

160 阅读5分钟

学习资源

  • 网道 : wangdoc.com/javascript/

  • 网道有详细介绍JavaScript,可以参考学习.
  • 本文偏重一些语法/面试/题

表达式和语句

  • 什么是表达式/语句?
  • 像 var a =1+2 这就是一条语句 ,声明一个变量a 把1+2运算结果赋值给a.

  • 比如上一面的var a = 1+2 这个是一条语句, 其中的 1+2 就是表达式啦,计算机最后会自动计算出一个结果3. 表达式最终都会通过计算机

  • 表达式的类型:
    • 原始表达式: 1+1、
    • 访问属性表达式: wang.name、
    • 调用表达式 : getSomeData()、
    • 创建表达式 : new Date()
  • var a = 1 + 3; 1+3 就是表达式 那么它的值就是 4
  • add(1,2) 表达式的值是函数的返回值;
  • console.log(3) 返回值是什么?
    • 是undefined 因为默认就是undefined.
    • 3只是这个函数打应出来的而不是返回值

示意图

  • 二者的区别?
  • 语句和表达式的区别在于,前者主要为了进行某种操作,一般情况下不需要返回值;后者则是为了得到返回值。
  • 语句可能有值,也可能没有值,语句一般会改变换环境(声明,赋值)等
  • 表达式一般都有值.
  • 但是都不是绝对的.

空格/回车

  • 大部分空格是没有意义的
  • 回车大部分也是没有影响的
  • 但是在return会面不能加回车 看事例:
        //这两个函数调用的值是什么?
       function fn(){
         return 3
       }
       fn();
      
       function fn1(){
         return
             3
       }
       fn1();

  • 答案是: 3 ,undefined
  • 看似俩个函数是一样的,其实在第二个函数fn1中,return后面接的是一个回车,大家都知道,JavaScript是一行一行执行代码的,所以此时这个函数会执行俩条语句,一个是return,一个是3。这时JavaScript就会默认在return后面加上 undefined .

标识符

  • 标识符(identifier)指的是用来识别各种值的合法名称。
  • 标识符有一套命名规则,不符合规则的就是非法标识符。JavaScript 引擎遇到非法标识符,就会报错。
  • 标识符命名规则如下。
    • 第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母),以及美元符号($)和下划线(_)。
    • 第二个字符及后面的字符,除了 Unicode 字母、美元符号和下划线,还可以用数字0-9。
  • 不合法的标识符
    •     1a  // 第一个字符不能是数字
          23  // 同上
          ***  // 标识符不能包含星号
          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。

注释

源码中被 JavaScript 引擎忽略的部分就叫做注释,它的作用是对代码进行解释。JavaScript 提供两种注释的写法:一种是单行注释,用//起头;另一种是多行注释,放在//之间。

  • 避免不好的注释
    • 把代码翻译成中文(每行都翻译)
    • 过时的的注释不及时删除
    • 发泄不满的注释,职业素养的问题.
  • 好的注释
    • 比较有坑的地方.
    • 代码跟正常的业务逻辑不同,后者bug的地方
    • 不要过渡使用注释,这样会分不清主次.

区块

JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。

    {
     var a = 1;
    }

一般是配合 if/for/while 配合用

条件语句

JavaScript 提供if结构和switch结构,完成条件判断,即只有满足预设的条件,才会执行相应的语句。

if 语句

  • 语法
    • if(表达式){语句1}else{语句2}
        if (m === 3) {
           m += 1;
         }
    
    • {}在语句只有一句的时候可以省略,不推荐
  • 一些比较坑的情况
  • 表达式里面的非常态. 如 a= 1
    a= 1
  • 下面图为什么是"a等于2"?

  • 其实
   a = 1
   if(){
      console.log('a')
   }
      console.log('a等于2')
  • 花括号是不写的{},不写不代表不存在.还有就 前面说的空格是没有意义的

  • ","逗号是这句好没结束, 分号";" 才是结束

switch 语句

  • 语法
 switch (fruit) {
  case "banana":
    // ...
    break;
  case "apple":
    // ...
    break;
  default:
    // ...
}
  • 注意 break 大部分记得要写,少部分业务可以利用 break

三元表达式

  • (条件) ? 表达式1 : 表达式2
  • JavaScript var even = (n % 2 === 0) ? true : false;

逻辑运算符 && ||

A && B && C && D 取第一个假值或D A || B || C || D 取第一个真值或D

循环语句

循环语句用于重复执行某个操作,它有多种形式。

while 循环

While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。

var i = 0;

while (i < 100) {
  console.log('i 当前为:' + i);
  i = i + 1;
}
  • 一些坑
  • 下面代码:是不是死循环?
    var a = 0.1
    while(a !== 1){
     a = a + 0.1
    }
  • 解释:因为是 a 是浮点类型.由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。

for循环

for语句是循环命令的另一种形式,可以指定循环的起点、终点和终止条件。它的格式如下。

for (初始化表达式; 条件; 递增表达式)
  语句

// 或者

for (初始化表达式; 条件; 递增表达式) {
  语句
}

for语句后面的括号里面,有三个表达式。

  • 初始化表达式(initialize):确定循环变量的初始值,只在循环开始时执行一次。
  • 条件表达式(test):每轮循环开始时,都要执行这个条件表达式,只有值为真,才继续进行循环。
  • 递增表达式(increment):每轮循环的最后一个操作,通常用来递增循环变量。
var x = 3;
for (var i = 0; i < x; i++) {
  console.log(i);
}
  • 踩坑

i 的值是多少? i 等于 5

  • 还有接着来, 下面的代码 i 的值是多少?
// i 的值是多少?
for(var 1 = 0;i<5;i++){
   setTimeout(()=>{
     console.log(i)
   },0)
}
  • 解释:for 结束的值是五 那么跟setTimeout 等一会运行打印有什么分别,主要是时间的问题,for循环先执行完, 这时候 i 已经是 "5" 了,所以后面执行的setTimeout "i" 的值肯定是 5

打印了五次,值是5

  • 用let 不会出现上述情况

  • 关于函数调用的题
    • 请问我打印a的值是多少?
var a = 1
function fn(){
 console.log(a)
}
  • 答案: 不确定, 因为我不知道什么时候执行fn()
  • 解释: 就像答案所说, 只要调用fn,才会执行此函数, 如果我在此代码下面 把a的值换了, 再调用a呢,这样值就会改变, 因此我们不确定调用fn之前,a的值是多少。

break 和 continue

  • break 退出所有循环
  • continue 退出当前一次循环

label的题

请问下面俩段代码表示是什么?

{
 foo : 1
}

var a = {
  foo : 1
}

答案: 第一段表示是 label 值为1,第二段是对象。