备注: + 代表被问到的次数,没有 + 代表自己整理了,但没被问到
作用:动态改变某个类的某个方法的运行环境(执行上下文)
JavaScript this 关键词指的是它所属的对象。
它拥有不同的值,具体取决于它的使用位置:
像 call() 和 apply() 这样的方法可以将 this 引用到任何对象。
debounce (防抖)函数防抖在执行目标方法时,会等待一段时间。当又执行相同方法时,若前一个定时任务未执行完,则 clear 掉定时任务,重新定时。
const _.debounce = (func, wait) => {
let timer;
return () => {
clearTimeout(timer);
timer = setTimeout(func, wait);
};
};
throttle (节流)是为了限制函数一段时间内只能执行一次,在延时的时间内,方法若被触发,则直接退出方法
const _.throttle = (func, wait) => {
let timer;
return () => {
if (timer) {
return;
}
timer = setTimeout(() => {
func();
timer = null;
}, wait);
};
};
冒泡和捕获,事件流,捕获 => 目标阶段 => 冒泡
addEventListener(‘click’,function(){},false) 冒泡阶段触发
addEventListener(‘click’,function(){},true) 捕获阶段触发
长列表场景:事件代理,将事件绑定到父元素,通过冒泡将其冒到父元素上进行处理,target属性用来区分那个子元素.优点,节省内存,不用为新增元素绑定事件。
阻止冒泡:stopPropagation()
==, 两边值类型不同的时候,要先进行类型转换,再比较。
===,不做类型转换,类型不同的一定不等。
数组去重:
function unique (arr) {
return Array.from(new Set(arr))
}
数组排序:function cmp(a,b){return a-b}; array.sort(cmp);
浅拷贝: =号符/Array.prototype.slice() — 数组/Object.assign() — 对象
深拷贝:JSON.parse(JSON.stringify());
//递归实现
function isObj(obj) {
return (typeof obj === 'object' || typeof obj === 'function') && obj !== null
}
function deepCopy(obj) {
let tempObj = Array.isArray(obj) ? [] : {}
for(let key in obj) {
tempObj[key] = isObj(obj[key]) ? deepCopy(obj[key]) : obj[key]
}
return tempObj
}
function isPromise(e){
return !!e&&typeof e.then=="function"
}
script
作为第一个宏任务进入主线程。setTimeout
,其回调函数被分发到宏任务Event Queue中。Promise
,new Promise直接执行,输出Promise。then被分发到微任务Event Queue中。script
作为第一个宏任务执行结束,看看有哪些微任务?我们发现了then
在微任务Event Queue里面,执行。setTimeout
对应的回调函数,立即执行。 当访问对象中的属性或方法时,如果对象中没有该属性或方法,则会向此对象的 proto 寻找该属性或方法,如果找了,就返回该属性,若没有找到,则继续向此对象的 proto .proto 查找该属性,一直访问的windows对象,都没有返回undefind
fetch 调用时不会带cookie
mode: ‘cors’,
Commonjs、amd、cmd
特点:
箭头函数会捕获其所在父执行上下文的this
值,作为自己的this
值;
箭头函数不能作为构造函数,和 new 一起用就会抛出错误;
箭头函数没有原型属性
使用场景:在任何需要绑定 this
到父执行上下文,而不是函数本身时,箭头函数十分适用。
是语法层级的
方便静态分析和优化
现在: Array.isArray()
以前: Object.toString.call(val) == ‘[object Array]’
Array.from(arrayLike)
Array.prototype.slice.call(arrayLike)
for…in 会遍历所有可枚举属性
Object.keys 返回自有可枚举属性组成的数组
特点:相同输入,永远得到相同输出
好处:没有副作用,可测试性
let不会提升
const设置的原始值是不可以改变,但设置的对象内的属性值是可以改变的
是生成器函数的语法糖 es7出现的 返回promise
有3个状态,进行中,已完成,已失败 / 特点:一旦状态改变就不会在变
必须new
原型上的方法自动不可枚举
继承时必须调用super
for of 循环的是数组/字符串的值,不能循环普通对象/遍历 可迭代对象(iterable object) 定义的可迭代的数据 ,比如遍历 Array,Map,Set,String,TypedArray,arguments 等对象的数据。
for in 循环的是数组/字符串/对象的下标或key 循环对象及其原型上的可枚举属性/以任意顺序遍历对象的可枚举属性 (enumerable properties),包括对象从其构造函数原型中继承的属性。
如何使对象可以使用for of
newObj[Symbol.iterator] = function* (){
let keys = Object.keys( this )
for(let i = 0, l = keys.length; i < l; i++){
yield this[keys[i]]
}
}
pop/push/shift/unshift会改变原数组
@符号