闭包
什么是闭包?
有权访问另一个函数作用域中的变量的函数;一般情况就是在一个函数中包含另一个函数。函数作用域是独立的、封闭的,外部的执行环境是访问不了的,但是闭包具有这个能力和权限。
第一,闭包是一个函数,而且存在于另一个函数当中
第二,闭包可以访问到父级函数的变量,且该变量不会销毁
闭包的原理?
闭包利用了作用域的特效,作用域就是在当前执行环境下访问某个变量时,如果不存在就一直向外层寻找,最终寻找到最外层也就是全局作用域,这样就形成了一个链。
由于全局变量容易被人修改,容易被污染,所以必须解决这个问题,那就是把变量封装到函数内,让它成为局部变量。
闭包的作用?
作用1:隐藏变量,避免全局污染
作用2:可以读取函数内部的变量
同时闭包使用不当,优点就变成了缺点:
缺点1:导致变量不会被垃圾回收机制回收,造成内存消耗
缺点2:不恰当的使用闭包可能会造成内存泄漏的问题
typeof
typeof 返回一个表示数据类型的字符串,检测数据类型的运算符,返回值包括'undefined'、'boolean'、'string'、'number'、'object'、'function'、'function'、‘bigint’;。注意typeof(null)返回的是object。如果是判断一个基本的类型用typeof就是可以的。typeof 可以对JS基础数据类型做出准确的判断,而对于引用类型返回的基本上都是object, 其实返回object也没有错,因为所有对象的原型链最终都指向了Object,Object是所有对象的祖宗。
//typeof null返回的不是‘null’而是‘object’;因为null虽然是单独的一个数据类型,但是它原本的意思是空指针对象,浏览器使用typeof检测会把它按照对象来检测
typeof null === 'object'
console.log(typeof NaN); //'number'
typeof !!(1) === 'boolean'; // 两次调用 ! (逻辑非) 操作符相当于 Boolean()
typeof (typeof 1) === 'string'; // typeof 总是返回一个字符串
typeof String(1) === 'string'; // String 将任意值转换为字符串,比 toString 更安全
typeof !!(1) === 'boolean'; // 两次调用 ! (逻辑非) 操作符相当于 Boolean()
typeof {a: 1} === 'object';
// 使用 Array.isArray 或者 Object.prototype.toString.call
// 区分数组和普通对象
typeof [1, 2, 4] === 'object';
instanceof
instanceof 的作用是用来做检测类型的,检测一个对象A是不是另一个对象B的实例,A instanceof B ,是看B是否是在A的原型链上,代码如下:
var Person = function() {};
var student = new Person();
console.log(student instanceof Person); // true
手写instanceof
function _instanceof(A, B) {
var p_A = A.__proto__ //取A的隐式原型
var p_B = B.prototype //取B的显式原型
while (p_A != null) { //直到到达A的原型链顶端
if (p_A === p_B) return true
else p_A = p_A.__proto__
}
return false
}
console.log(_instanceof(people, Person));
原理:判断构造函数的prototype属性是否出现在某个实例对象的原型链上
===
能用===判断类型的只有undefined和null