🌞 JavaScript 是一门解释型语言,没有编译阶段,所以它是动态类型
一、常见知识点理解
1、静态作用域&动态作用域
-
JavaScript并不具有动态作用域,它只有词法作用域,但是this机制某种程度上很像动态作用域
-
静态作用域:静态作用域(即词法作用域)中的 函数 遇到既不是形参也不是函数内部定义的局部变量的变量时,会去 函数定义 时的环境中查询。
-
动态作用域:动态作用域中的 函数 遇到既不是形参也不是函数内部定义的局部变量的变量时,到 函数调用 时的环境中查询。
- 结合上面对作用域的理解,setInterval(),setTimeout() 方法是浏览器 window 对象提供,所以this指向window对象。
- 箭头函数
3、函数
- 拓展一:哪些场景不能用箭头函数
- 本质就是上级作用域内变量的生命周期,因为被下级作用域内引用,而没有被释放。就导致上级作用域内的变量,等到下级作用域执行完以后才正常得到释放。
二、数据操作
- 大通用:Object.prototype.toString.call(‘yf’).slice(8, -1) // String
- 基本类型: typeof val === "function"(除了null, 可判断基本数据类型与function)
- 数组:Array.isArray(value)
- 对象、function: instanceof ( 原型链判断: [] instanceof Array 为true, 因为[].proto === Array.prototype )
三、性能相关知识点
指内存没有被释放或者被垃圾回收,造成内存泄露的可能会有以下几种情况:
- 监听在window/body等事件没有解绑
- 模块形成的闭包内部变量使用完后没有置成null
- 使用第三方库创建,没有调用正确的销毁函数
四、其他
1、JS数据存放位置
- 原始类型:值存储于栈中
- 引用类型:指针存储于栈中,值存储于堆中
-
valueOf: 返回对象的字符串,布尔,数值表示
-
toString: 返回对象的字符串表示
-
toString拓展:执行2.toString() 报错是S引擎无法确定 '.' 是浮点数还是 . 操作符, 恰当的做法是用括号包裹,如:(2).toString()
3、模块化规范