nodebook/Miscellaneous/javascript2.md
2020-03-20 22:38:54 +08:00

5.6 KiB
Raw Blame History

javascript 学习总结

基础

  • 输入prompt(...)
  • 比较
    • 如果两边任意一边出现 true 或者 false 使用 ===
    • 如果两边任意一边可能是特定值0,"", [] 使用 ===
    • 剩下的所有情况,使用 ==
    • 对于引用类型来说,比较仅仅是比较其引用是否是同一个,另外在和字符串比较时,数组会自动转成字符串
    var a = [1,2,3]
    var b = [1,2,3]
    var c = "1,2,3"
    console.log(a == b) // false
    console.log(a == c) // true
    console.log(b == c) // true
    
    • switch语句
    switch(a) {
      case 2:
      case 10:
        // 2 或者 10 执行
        break;
      default:
        // 条件都不满足默认执行
    }
    

ES6

  • let 尽量将变量声明放在代码块开始,避免在(Temproal Dead Zone, TDZ)临时死亡区使用而报错
    • 尽量使用for...let在每次循环中都会声明一个新的变量生成了一个闭包。避免for里边的函数在调用的时候引用不到正确的变量。
  • const声明相对于保护其中的内容更注重其语意所带来的规范性
  • 如果把方法定义在{}内那么在块外执行会报ReferenceError
  • spread/rest...放在数组前用于展开数组,放在变量前就是收集变量到一个数组里,例如 function a(...arg){} a(a,b,c) -> arg = [a,b,c]
  • 解构 var [a, b, c] = foo() 如果foo返回的是一个长度为三的数组其内容将会被依次赋值给abc
    • 对象属性复制模式var {a, b, c} = foo()这里省略的其实是a:, b:, c:,对象的属性名要和函数返回的属性名相同,然后将值一一赋值给属性值var {a: x, b: y, c: z} = foo()最后使用的是xyz而不是abc
      • 对于这个形式,如果省略声明符就需要用小括号括起来({a, b, c} = foo())
    • 对象属性名的计算属性var which = 'w'; o1 = {which: 'w'}; => {which: 'w'} o2 = {[which]: 'w'}; => {w: 'w'}使用中括号即可
    • 简单的交换两个元素[a, b] = [b, a]'
    • 允许出现多次列出同一个源属性{a: {x: X, x: Y}, a} = {a: {x: 1}} => X == X == 1, a = {x :1}
    • 不必都写在一行里,解构的目的不是为了打字更少,而是为了可读性更强
    • 赋值的时候用不到的东西可以抛弃[,a,b] = [1, 2, 3] => a = 2, b = 3
    • 赋值的时候多余的东西会赋值undefined[a, b] = [1] => a = 1, b = undefined
    • 赋值的时候可以使用spread/rest...进行收集操作[...a,b] = [1, 2, 3] => a = [1, 2], b = 3
    • 赋值的时候可以使用默认值{a, b: WW = 20} = {a: 10} => a = 10, WW = 20
    • 赋值的时候可以嵌套结构
    • 在形参中使用这个就接近了命名参数,得到了任意位置的可选参数功能,设置默认参数{x = 10} = {}
  • 对象字面量扩展
    • 简洁属性{x}
    • 简洁方法{x(){}}
      • 这个操作会生成一个匿名的函数,如果需要递归请不要使用
  • 模板字面量...${foo(`${name}s`)}
      function foo(strings, ...args) {
        console.log(strings)
        console.log(args)
      }
      var desc = "awesome"
      foo`Every thing is ${desc}!`
      // ["Every this is ", "!"]
      // ["awesome"]
      // 配合Strng.resuce可以用来处理字符串
    
  • 箭头函数
    • 合理使用,函数越短越适合用,函数长了反而会使函数边界模糊
    • 主要的功能是为了this的规范化而不是减少代码量
    • 尽可能减少非必要情况下的箭头函数使用
  • for...of循环
    • for...in 遍历数组的时候遍历的是index for...of遍历的是值
    • 适用所有带迭代器的变量
    • 自带迭代器的有Arrays,Strings,Generators,Collections/TypedArrays
    • ...可以是赋值表达式也可以是声明
  • 正则匹配
    • 定点标识
      • re = /d/ re.lastIndex
      • 定点定位/f../y会从lastIndex开始搜索不会更新lastIndex
      • g模式使用exec 会更新lastIndex
      • ^ 总是指向输入起始处的锚点不受lastIndex的影响
      • y 加上 ^ 加上lastIndex > 0 是一个不兼容的组合,总是会导致失败
    • flags
      • re = /foo/ig re.flags => gi查看应用的哪些标识
      • 顺序总是gimuy
  • 数字字面量扩展
    • doc = 12
    • oct = 0o52
    • hex = 0x2a
    • bin = 0b101010
    • a = 42 a.toString(10 || 8 || 6 || 2)可以进行转换
  • Unicode
    • var snowman = '\u2603' \u转义
    • var gclef = '\uD834\uDD1E' 替代对
    • var gclef = '\u{1D11E}' 码点转义
    • 精确判断字符串长度
      • [...str].length
      • Array.from(str).length
  • 符号symbol
    • 例子var sym = Symbol('something')
    • 不应该使用new
    • 使用typeof识别
    • 获取全局符号(如果全局不存在则新建一个放在全局)Symbol.for("exec.name")
    • 通过符号获取字符串Symbol.keyFor(sym)
    • 设置为对象的属性之后不可枚举,但是可以通过Object.getOwnPropertySymbols(sym)获取
  • 迭代器
    • 可以用来满足消费者生产者模型
    • 必须拥有一个next()
    • 可选return()用于消费者向生产者发送所有消费过程完成的信号,生产者应进行销毁程序
    • 可选throw()用于向生产者发送错误信号,终止生产
    • for of 可以消费迭代器使用break退出会触发return
    • 通过rest/gather运算符可以消耗迭代器it = arr[Symbol.iterator]() var [x, y] = it; var [z, ...w] = it; it最终会被消耗光
  • 生成器
    • function *foo() {yield 1;} it = foo() it.next() // value 1 next里边的参数会替换掉 yield后边的东西
    • 就是用迭代器来控制生成器
    • 可以用throw()配合try catch实现错误的双向或 内外双向传递
    • 每次被调用的时候都会是一个新的生成器
    • 加*