2019-11 上旬

# 2019-11-10: css +(加号)~ (波浪号) 选择器

好好想想先 😌
  • 一句话
    • 加号选择相邻的、紧接的、后面的兄弟元素
    h1 + p {
      /* 选择紧接 h1 后面的 p */
    }
    
    • 波浪号选择同级的、后面所有的兄弟元素
    h1 ~ p {
      /* 选择和 h1 同级的,所有在 h1 后面的 p
    }
    

# 2019-11-09: let s1 = 'Hello world', let s2 = String('Hello world')let s3 = new String('Hello world') 三者有什么区别

好好想想先 😌

# 2019-11-08: Vue 怎样监听数组变化

好好想想先 😌

# 2019-11-07: async/await 和 Generator 的关系,和 Promise 的关系

好好想想先 😌
  • 参考链接

  • 一句话

    • Generator 函数
      • 是一个状态机,返回一个迭代器
      • 暂停恢复的原理 - 协程是比线程更小的运行单元
    • async/await
      • 内置执行器。Generator 函数的执行必须依靠执行器,而 async 函数自带执行器,无需手动执行 next() 方法。
      • 更好的语义。async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。
      • 更广的适用性。co 模块约定,yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。
      • 返回值是 Promise。async 函数返回值是 Promise 对象,比 Generator 函数返回的 Iterator 对象方便,可以直接使用 then() 方法进行调用。

# 2019-11-06: 移动端怎样用 css 绘制 1px 的边框

好好想想先 😌

# 2019-11-05: js 内存管理

好好想想先 😌
  • 参考链接

  • 一句话

    • 内存生命周期
      1. 分配你所需要的内存
      2. 使用分配到的内存(读、写)
      3. 不需要时将其释放\归还
    • 内存回收
      • 引用计数垃圾收集
        • 这是最初级的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。
        • IE 6 7 使用该算法
        • 无法处理循环引用的事例
      • 标记、清除算法
        • 这个算法假定设置一个叫做根(root)的对象(在 Javascript 里,根是全局对象)。
        • 垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。

# 2019-11-04: 怎样去除 inline-block 间距

好好想想先 😌

# 2019-11-03: React Native 原理

好好想想先 😌
  • 参考链接

  • 一句话

    • Java 层:该层主要提供了 Android 的 UI 渲染器 UIManager(将 JavaScript 映射成 Android Widget)以及一些其他的功能组件(例如:Fresco、Okhttp)等。
    • C++层:该层主要完成了 Java 与 JavaScript 的通信以及执行 JavaScript 代码两件工作。
    • JavaScript 层:该层提供了各种供开发者使用的组件以及一些工具库。

# 2019-11-02: async 和 await 的返回值,直接返回一个值和返回一个 Promise 的区别

好好想想先 😌
  • 参考链接

  • 一句话

    • async 函数有返回值会直接 resolove
    async function f() {
      return 'hello world'
    }
    f().then(console.log) // hello world
    
    async function f2() {
      return Promise.resolve('hello world')
    }
    
    f2.then(console.log) // hello world
    
    • async 函数内部抛出错误会直接进入 reject
    async function e() {
      throw new Error('error')
    }
    
    e().catch(console.log) // error
    
    • 正常情况下,await 命令后面跟着的是 Promise ,如果不是的话,也会被转换成一个立即 resolve 的 Promise
    async function f() {
      return await 'hello world'
    }
    
    f().then(console.log) // hello world
    
    • 错误处理
    async function f() {
      if (error) {
        Promise.reject(error)
      }
    }
    
    async function f1() {
      await new Promise((resolve, reject) => {
        reject(new Error('Error'))
      }).catch(console.log) // Error
    }
    

# 2019-11-01: 什么时候会发送 options 请求

好好想想先 😌
  • 参考链接

  • 一句话

    • 客户端 method 使用 PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH 会发送 options 请求
    • 客户端 Content-Type 设置为 application/json 会发送 options 请求
    • 解决办法:服务端设置 Access-Control-Max-Age
      • Access-Control-Max-Age 这个响应首部表示 preflight request (预检请求)的返回结果(即 Access-Control-Allow-Methods 和 Access-Control-Allow-Headers 提供的信息) 可以被缓存的最长时间,单位是秒。(MDN)