数据类型
number string null undefined boolean symbol bigint
symbol 独一无二数据类型,解决全局变量冲突
bigint 表示任意精度的整数
内存图、栈、堆
栈: 基本数据类型
堆: 复杂数据类型Object
引用数据类型:先在堆中储存实体对应的指针,实体储存在栈内存中,
栈:由编译器自动分配和释放,用来储存函数的参数和局部变量
堆: 由程序员手动释放,或者自动垃圾回收机制‘
undefined和undecleared
undefined 已申明未赋值
undecleared 未申明就引用的报错
null和undefined
null 空对象,用来赋值 typeof null == 'object'
undefined 未定义
|| 和 && 操作符的返回值
|| 来说,如果条件判断结果为 true 就返回第一个操作数的值,如果为 false 就返回第二个操作数的值。
&& 则相反,如果条件判断结果为 true 就返回第二个操作数的值,如果为 false 就返回第一个操作数的值。
Javascript 的作用域链
保证执行环境有权访问的所有变量和函数的有序访问,通过作用域链,可以访问到外层环境变量和函数
当在执行上下文中没有找到变量时,会顺着作用域链向上寻找,直到到全局对象
作用域链的创建过程跟执行上下文的建立有关
this的理解
- 函数调用模式, this指向全局变量
- 方法调用模式, this指向当前的对象
- 构造器调用模式, this指向对象实例
- apply, call,bind 显示的改变this的指向,
闭包
闭包是有权访问另一个函数作用域中的变量的函数, 使已经运行结束的函数变量引用继续留在内存中,闭包函数保留了这个函数的引用
hasOwnProperty
不会查找原型链上的属性
js 延迟加载
defer 属性
async 属性
动态创建 DOM 方式
使用 setTimeout 延迟方法
让 JS 最后加载
同步和异步
同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是处于阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。
异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。
事件循环
事件队列是一个存储着待执行任务的队列,其中的任务严格按照时间先后顺序执行,排在队头的任务将会率先执行,而排在队尾的任务会最后执行。事件队列每次仅执行一个任务,在该任务执行完毕之后,再执行下一个任务。执行栈则是一个类似于函数调用栈的运行容器,当执行栈为空时,JS 引擎便检查事件队列,如果不为空的话,事件队列便将第一个任务压入执行栈中运行。
loader 和 plugin 的区别
loader 加载器, 处理非javascript模块
plugin 插件, Webpack 运行的生命周期中会广播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果
__proto__
和 prototype
每一个对象都有一个原型对象,并从原型对象上继承属性和方法
prototype
只有函数才有prototype属性,js函数是一等公民,通过函数模拟类(Class)
构造函数实例继承函数prototype属性 通过设置自己的__proto__
指向函数的prototype实现继承
通过__proto__
和prototype
合作实现了原型链和继承
对象字面量的原型就是Object.prototype