美文网首页
重学前端——语法

重学前端——语法

作者: zhangyr_8897 | 来源:发表于2020-03-13 14:34 被阅读0次

    分号

    1. 自动插入分号规则
    (1)有换行符,且下一个符号是不符合语法的,自动插入分号;
    (2)有换行符,且语法中规定此处不能有换行符,自动插入分号;
    1)带标签的continue语句,不能在continue后插入换行;
    2)带标签的break语句,不能在break后插入换行;
    3)return后不能插入换行;
    4)后自增、后自减运算符前不能加入换行
    5)throw和Exception之间不能插入换行
    6)凡是async关键字,后面都不能插入换行
    7)箭头函数的箭头前,也不能插入换行
    8)yield之后,不能插入换行
    (3)源代码结束处,不能形成完整的脚本或模块结构,自动插入分号;

    2. 带换行符的注释也被认为是有换行符
    return 和 结果之间有换行的注释,则返回undefined。

    3. 不写分号需要注意的情况
    (1)以括号开头的语句
    (2)以数组开头的语句
    (3)以正则表达式开头的语句
    (4)以Template开头的语句

    export

    1. 模块和脚本
    (1)模块和脚本之间的区别在于是否包含import和export
    (2)脚本具有主动性的JavaScript代码段,是控制宿主完成一定任务的代码;而模块是被动性的JavaScript代码段,是等待被调用的库。
    (3)现代浏览器支持script标签引入模块或脚本。如果引入模块,必须给script标签添加type=“module”。如果引入脚本,则不需要type。
    (4)脚本中可以包含语句。模块中可以包含三种内容:import声明,export声明和语句。

    2. import声明
    (1)直接import一个模块

    import “mod”
    

    只是保证这个模块被执行,无法获得任何信息
    (2)带from

    import v from “mod”
    

    引入模块中的一部分信息,可以把它们变成本地的变量

    import x from “./a.js”  //引入模块中导出的默认值
    import {a as x, modify} from “./a.js” // 引入模块中的变量
    import * as x from “./a.js” //把模块中所有的变量以类似对象属性的方式引入
    import d, {a as x, modify} from “./a.js”
    Import d, * as x from “./a.js
    

    3. 函数体
    (1)普通函数体

    function foo() {}
    

    (2)异步函数体

    async function foo() {}
    

    (3)生成器函数体

    function *foo() {}
    

    (4)异步生成器函数体

    async function *foo() {}
    
    image

    4. 预处理
    代码都是先编译在执行,实际上变量和函数声明在代码里的位置是不会变的,而且是在编译阶段被JavaScript引擎放入内存中。

    var声明

    1) 函数体级var定义的不会访问外层
    2) var作用能够穿透一切语句结构,除了脚本、模块和函数体
    面试题:文档添加20个div元素,绑定了点击事件,打印序号

    for(var i = 0; i < 20; i++) {
         void function(i) {
              var div = document.createElement('div')
              div.innerHTML = i
              div.onclick = function() {console.log(i)}
              doument.body.appendChild(div)
         }(i)
    }
    
    function声明
    console.log(foo)
    function foo() {}
    // foo() {}
    
    console.log(foo)
    if(true) {
        function foo() {}
    }
    // undefined
    
    class声明
    console.log(c)
    class c {}
    // c is not defined
    
    var c = 1
    function foo() {
       console.log(c)
       class c {}
    }
    foo()
    //报错:c不可以在初始化之前使用
    
    指令序言机制

    'use strict'

    用 babel,分析一段 JavaScript 的模块代码,并且找出它中间的所有 export 的变量。

    语句

    image image

    break用于跳出循环或switch语句,continue用于结束本次循环并继续循环

    var的规则:

    声明同时必定初始化;尽可能在离使用的位置近处声明;不要在意重复声明;

    class默认内部函数定义都是strict模式的

    生成器函数可以理解为返回一个序列的函数,底层是iterator机制。

    表达式语句

    原子项

    基本类型的直接量

    "abc"
    123
    null
    true
    false
    

    直接量的形式定义对象

    ({})
    (function(){})
    (class{ })
    []
    /abc/g
    

    this或变量(标识符引用)

    this
    myVar
    

    任何表达式加上()

    (a + b)
    
    成员表达式

    用于访问对象成员

    a.b
    a["b"]
    new.target
    super.b
    
    f`a${b}c`
    new Cls()
    
    new 表达式
    new new Cls(1)
    // 等价于
    new (new Cls(1))
    
    函数调用表达式
    a.b(c)
    super()
    a.b(c)(d)(e)
    a.b(c).d
    a.b(c)`xyz`
    

    函数调用表达式比new表达式优先级低

    左值表达式
    a() = b
    a().c = b
    
    赋值表达式
    a = b
    a = b = c = d
    // 等价于
    a = (b = (c = d))
    a += b
    
    运算符表达式 0397a1bd093f91618c30f5afc93a8b0.png

    表达式

    更新表达式

    ++、--

    一元运算表达式
    delete a.b
    void a
    typeof a
    -a
    ~a
    !a
    await a
    
    乘方表达式
    ++i ** 30
    2 ** 30 // 正确
    -2 ** 30 // 报错
    4 ** 3 ** 2 // 等价于 4 ** (3 ** 2)
    
    乘法表达式(除法、取余)
    加法表达式
    移位表达式
    <<向左移位
    >>向右移位
    >>>无符号向右移位
    
    关系表达式
    <=
    >=
    <
    >
    instanceof
    in
    
    相等表达式
    ==
    !=
    ===
    !==
    

    相关文章

      网友评论

          本文标题:重学前端——语法

          本文链接:https://www.haomeiwen.com/subject/dhfdqhtx.html