1 引用类型
1.1 常见 object、array、function (Date、 RegExp 、Map、 Set...
- 基本数据类型存储在栈中
- 引用数据类型存储在堆中
function是Function的实例
引用类型的赋值操作其实是把栈内存中存储的对象引用地址复制了一份,引用指向的还是同一个堆内存
2 数据结构
- 数组
- 栈
- 队列
- 链表(解决大数据数组效率慢的问题
- 字典(object
- 散列表(哈希表-插入、删除、取出速度快,不适用查找
- 树
- 图
- 堆
3 dom操作
**querySelector
不同与getElementBy 它返回的是静态“快照”而不是“实时”查询**
4 bom
浏览器对象模型-后退、前进、刷新
核心对象是window
5 this
永远指向最后调用它的对象
new的过程中如果return一个对象,则this指向这个对象否则指向实例对象
function fn()
{
this.user = 'xxx';
return {};
}
var a = new fn();
console.log(a.user); //undefined
function fn()
{
this.user = 'xxx';
return 1;
}
var a = new fn;
console.log(a.user); //xxx
5.1 this调用和setTimeout
能帮我分析下为什么没有改变obj.say的调用对象,而放在setTimeout中确改变了调用对象变成了window呢
var name = "lucy";
var obj = {
name: "martin",
say: function () {
console.log(this.name);
}
};
obj.say(); // martin this obj
setTimeout(obj.say,0); // lucy this window
当你将 obj.say 作为参数传递给 setTimeout 时,它实际上是传递了一个引用,而不是绑定到 obj 的函数调用。由于 JavaScript 中的函数是一等公民,函数可以作为参数传递,并失去了与其对象的关联。
在这种情况下,obj.say 被调用时,this 的默认绑定是全局对象。在浏览器环境中,全局对象是 window(在严格模式下会是 undefined)。
因此,this 被指向了 window,而 window 中有一个全局变量 name = "lucy",所以它输出了 lucy。
这是因为 setTimeout 函数中的调用方式实际上是普通函数调用,而不是通过对象调用。普通函数调用会使用默认绑定,即 this 指向全局对象(在严格模式下为 undefined)。上面setTimeout传递的是函数的引用,并没有调用,其实类似为
const fun = obj.say
setTimeout(fun,0);
实际执行的时候是window环境
setTimeout(function() {
obj.say(); // 如果这样写,调用对象仍然是 obj
}, 0);
在这种情况下,this 会保持为 obj,因为是通过对象调用。
解决方案:改成函数调用/改变this指向
setTimeout(() => obj.say(), 0); // martin
setTimeout(obj.say.bind(obj), 0); // martin
6 实现new
function mynew(Func, ...args) {
// 1.
const obj = {}
// 2.
obj.__proto__ = Func.prototype
// 3. this
let result = Func.apply(obj, args)
// 4.
return result instanceof Object ? result : obj
}
7 闭包
闭包的运用-私有化、柯里化、模拟私有方法(类new
多运用于 纯函数、计算昂贵的函数等
8 深浅拷贝
8.1 浅拷贝
- Object.assign
- concat
- slice
8.2 深拷贝
- ...
- JSON.stringify() --- 会忽略 undefined和symbol
9 await和async
其中await不论后面跟什么,都会阻塞下面的代码(将下面的代码加入微队列
async function fn1() {
console.log(1)
await fn2()
console.log(2) //阻塞加入微队列
}
async function fn2() {
console.log('fn2')
}
fn1()
console.log(3)
打印:1 -> fn2 -> 3 -> 2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。