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
// 实现bind
Function.prototype.myBind = function (context,...args) {
let self = this;
let params = args;
return function (...newArgs) {
self.call(context, ...params.concat(...newArgs))
}
}
var a = {
name: 'this is a'
}
function sayName() {
console.log(this.name, arguments)
}
let newfn = sayName.myBind(a, '1234', '5678')
newfn('1000', '2000')
js实现call
// 实现call
Function.prototype.myCall = function (context,...args) {
context.fn = this;
context.fn(...args)
delete context.fn;
}
var a = {
name: 'this is a'
}
function sayName() {
console.log(this.name, arguments)
}
sayName.myCall(a, '1234', '5678')
js实现setInterval
// setTimeout 实现setInterval
function mySetInterval(fn, time) {
let timer = {};
function timeout() {
timer.t = setTimeout(() => {
fn();
timeout()
}, time)
}
timeout();
return timer;
}
function clearMyInterval(timer) {
clearTimeout(timer.t)
}
前端基础
浏览器
JavaScript
基础数据类型和引用数据类型
原型链
理解原型链是做什么的,也就是:实例.proto === 构造函数.prototype
有个比较好的问题,可以思考下:
上面代码,为什么F.a是undefined?
上面代码,为什么f.a是undefined?
继承
继承的几种方式:
优点:
闭包:
函数防抖和节流,都是控制事件触发频率的方法。
var/let/const
这部分主要考查对let和var的理解,变量提升等。
看下面这个代码的执行结果是什么?
上面的执行结果是:
bar = {n:1,x:{n:2}}; foo={n:2}
;上面的执行结果是:
10 3 error
;最后的error是因为a不是个function;== 与 ===
隐式转换的步骤: 主要搞明白在强等和双等的时候做了什么事情,也就好理解了。
强等(===)会首先比较两边的类型是否相同,如果不同则直接返回false;如果类型相同的话,则是按照==来判断的,我们来看下==所引起的隐式转换。
双等号引起的隐式转换
一、首先看双等号前后有没有NaN,如果存在NaN,一律返回false。
二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false是0,true是1)
三、接着看双等号前后有没有字符串, 有三种情况:
四、如果是数字,对方是对象,对象取valueOf()或者toString()进行比较, 其他一律返回false
五、null, undefined不会进行类型转换, 但它们俩相等
.toString()方法和.valueOf()方法数值转换
通常情况下我们认为,将一个对象转换为字符串要调用toString()方法,转换为数字要调用valueOf()方法,但是真正应用的时候并没有这么简单,看如下代码实例:
同理,我们再看valueOf()方法:
从上面的代码可以看出,valueOf()方法并没有将对象转换为能够反映此对象的一个数字。相反,我们用toString()
注:很多朋友认为,转换为字符串首先要调用toString()方法, 其实这是错误的认识,我们应该这么理解,调用toString()方法可以转换为字符串,但不一定转换字符串就是首先调用toString()方法。
我们看下下面代码:
上面代码我们可以看出,转换首先调用的是valueOf(),假如valueOf()不是数值,那就会调用toString进行转换!
假如"1"是字符串,那么它首先调用的还是valueOf()。
上面的例子,调用的是toString();因为arr.toString()之后是2。
转换过程是这样的,首先arr会首先调用valueOf()方法,但是数字的此方法是简单继承而来,并没有重写(当然这个重写不是我们实现),返回值是数组对象本身,并不是一个值类型,所以就转而调用toString()方法,于是就实现了转换为字符串的目的。
说明
大多数对象隐式转换为值类型都是首先尝试调用valueOf()方法。但是Date对象是个例外,此对象的valueOf()和toString()方法都经过精心重写,默认是调用toString()方法,比如使用+运算符,如果在其他算数运算环境中,则会转而调用valueOf()方法。
举例巩固提高
下面我们一起来做做下面的题目吧!
上面的都可以理解了吗?最后一行代码结果是true的原因是什么?
es6
这部分考查对es6的掌握熟练度,新增的一些类型,语法,等等。推荐大家看一看阮一峰老师的es6的文章
手写实现
js实现bind
js实现call
js实现setInterval
promise
promise考察点比较多,包括实现自己的promise和一些调用的知识点
推荐两篇文章:实现Promise和Promise题
css
html
The text was updated successfully, but these errors were encountered: