JS的延迟加载

浏览器的加载时,遇到js会暂停dom的加载,先加载js async 和 defer 引入外部链接时加入这个属性

  1. <script async type=""></script>
  2. <script defer type=""></script>

相同:

  • js和html是一起加载 的

区别:

  • async
    • 执行是异步的,谁先加载完谁执行
  • defer
    • 等html全部解析完成才会执行js代码,顺次执行的(按照代码的顺序)

JS的数据类型

基础类型: String Number Boolean null udefined Symbol 引用类型:Object NaN是一个数值类型的,单不是一个具体的数字

隐式转换考题下面的输出结果是什么

  1. ture+1
  2. 'name'+ture
  3. undefinde+1
  4. typeof null
  5. typeof NaN
  6. typeof undefined 答案及解析
  7. 2 ture会隐式转换为1 1+1=2
  8. 'nameture' 字符串与任何类型相加都会变成字符串
  9. NaN 数字与除字符串以外的相加都会变成数字类型,undefined不确定就变成nan
  10. object null是一个特殊的object
  11. number NaN是一个不确定的数字
  12. undefined 就是一个数据类型所以输出的是undefined

    null和undefined的区别

    具体的区别? null是一个表示空的对象,转换为数值为0 undefined是一个表示无的基本类型值,转换为数值为NaN

拓展回答查过相关资料大致就是,作者设计js的参考的java里面的null
与java一样会被当成一个对象,认为表示无的值被当成一个对象有点不合理
null会被隐式转换为0,这样数据类型不匹配的时候他会自动转换,不容易发现错误

==和=== 的区别

都是比较运算符 == 比较的是值 === 比较的是值和数据类型

总结==比较

  • null == undefined 结果一定是true
  • string == number string会隐式转换为number
  • boolean == number boolean会隐式转换成number
  • object == string || number object会转换成基本类型
  • 转换是js的原型方法valueOf() 该方法返回Math对象的原始值,由js后台自动调用的并不会显示地出现再代码中

===比较

  • 推荐使用
    • 避免一些小坑
    • 性能上来讲会比==好,不需要走valueOf

JS微任务和宏任务

js是单线程的语言

同一时间只能做一件事,与用途有关主要是与用户互动和操作dom,就决定了只能是单线程

js异步执行代码

同步执行完 => 事件循环【微任务=> 宏任务】 同步任务执行完毕后,才会进入事件循环中,微任务全部只执行完毕才会进入宏任务

  • 进入事件循环的有(定时器、请求、事件…)
  • 事件循环包含(宏任务、微任务)
    • 微任务:promise.then
    • 宏任务:setTimeout
      • 执行宏任务的前提是清空了所有的微任务