You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
可能会有朋友会问,咦,我们不是没有修改对象 b 的属性吗,怎么属性 name 变了。其实这里面涉及到引用类型的问题。对象是属于引用类型,把对象赋值给另外一个变量,实际上是把对象的指针指向的内存地址共享给了变量。对象和变量共享同一份内存地址。那么 a 的属性改变了,那么 b 的也会跟着变化的。这时候为了避免这种情况发生,我们可以使用 浅拷贝 来进行操作
在面试中,面试官多多少少都会要求面试者手写几道手写代码方法,这时候,不仅要求面试者能够熟练使用这些方法,更是要求面试者掌握这些方法的原理。
实现一个 new 操作符
实现一个 instanceof
实现一个浅拷贝或者深拷贝
实现 call 和 apply
实现 防抖 和 节流
实现一个 promise
实现 ajax 原理
实现 jsonp
实现 JSON.stringify
实现 JSON.parse
实现 flat 扁平化
实现类的继承
实现双向绑定
实现函数柯里化
实现一个 new 操作符
要创建一个实例,那么必须要使用
new
操作符。使用new
操作符内部会经历4个过程创建一个新的对象
将构造函数的作用域赋给了新对象
执行构造函数中的代码
返回新的对象***(注意:如果构造函数中有返回对象类型的值,那么我们就直接返回这个对象。否则返回新的对象)***
实现一个 instanceof
instanceof
可以正确的判断对象的类型。因为内部机制是通过判断对象的原型链中是不是能找到类型的prototype
实现一个浅拷贝或者深拷贝
在使用对象的时候,我们经常会碰到这样的一个问题
可能会有朋友会问,咦,我们不是没有修改对象
b
的属性吗,怎么属性name
变了。其实这里面涉及到引用类型的问题。对象是属于引用类型,把对象赋值给另外一个变量,实际上是把对象的指针指向的内存地址共享给了变量。对象和变量共享同一份内存地址。那么a
的属性改变了,那么b
的也会跟着变化的。这时候为了避免这种情况发生,我们可以使用浅拷贝
来进行操作注意,
浅拷贝
避免对象内部的属性不是引用类型的情况,那么如果对象的内部属性仍然是引用类型的情况时,浅拷贝
这时候只会对对象最外层生效了浅拷贝只解决了第一层的问题,如果接下去的值中还有对象的话,那么就又回到刚开始的话题了,两者享有相同的引用。要解决这个问题,我们需要引入
深拷贝
的概念了。一般来说,使用
JSON.parse(JSON.stringify())
已经满足了但是这种方法存在局限性
所以,我们可以利用递归来解决这种情况
实现 call 和 apply
call
方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。与apply
方法类似,只有一个区别,就是call
方法接受的是一个参数列表,而apply
方法接受的是一个包含多个参数的数组。同理,
apply
的实现只是传入的参数是一个数组而已实现 防抖 和 节流
防抖
指的是防止用户用户过多操作,而带来不必要的性能耗费,把操作改成最后一次执行,只要用户有操作,事件行为也会一直被推迟。例如输入框防抖
和节流
本质是不一样的。防抖
是将多次执行变为最后一次执行,节流
是将多次执行变成每隔一段时间执行。实现一个promise
(1)"promise"是一个对象或者函数,该对象或者函数有一个then方法
(2)"then"是一个对象或者函数,用来定义then方法
(3)"value"是promise状态成功时的值
(4)"reason"是promise状态失败时的值
普通版
但是这里
myPromise
无法处理异步的resolve
. 比如:而且
myPromise
也没有实现链式调用,也就是说then
方法返回的应该是一个promise
。实现ajax原理
实现 jsonp
The text was updated successfully, but these errors were encountered: