从这篇文章开始,将对js的知识点进行总结,主要是在日常开发与学习中遇到的知识,会对其进行解释说明,每篇包含几个知识点,如果知识点复杂会单独列出一篇。此类文章将不断更新。(因js过于强大,且每个人在开发时都会遇到各种各样的问题,这里写的更多是自己遇到过的,所以此类文章主要作为自己学习后的知识总结。)
一、以变量作为对象的key,其内部实现原理
以前在开发时,如果对象的key为变量,一般的写法为obj[variable]
,es6之后可以直接在对象中用[]
将变量包起来,即{ [variable]: 'hello' }
,这两种写法,其实是调用了variable
的toString
方法,将其转换为字符串后放入。所以,不管是基本类型还是引用类型,都是一样的。看几个例子:
1 | const arr = [1, 2, 3] |
这里分别调用了数组和对象的toString
方法来进行转换。
二、原生JS实现数组的map方法
数组的map
方法包含接收两个参数,第一个为函数,其参数分别为当前项、当前项索引、当前项所属的数组,第二个为this
的指向,一般不用传递。
1 | Array.prototype.map1 = function(callback, context){ |
例子:
1 | const arr = [4, 5, 6, 7] |
三、reduce实现数组map方法
1 | Array.prototype.map2 = function(callback, context){ |
例子跟上面一样的,这里都没做参数类型判断,基本原理都写出来了
四、js的new操作符都做了什么
1 | function Func(){} |
new
操作符会做以下几件事情:
1、创建一个空对象,即:let obj = new Object()
2、将obj
的__proto__
指向Func
的prototype
,即:obj.__proto__ = Func.prototype
3、让Func
的this
指向obj
,并执行Func
的函数体,即:const result = Func.call(obj)
4、判断result
的类型,如果是基本类型,就返回obj
,如果是引用类型,就返回result
,即:
1 | if(typeof result === 'object'){ |
这里有个注意点,如果result
的类型是基本类型,那func
的构造函数指向Func
,但如果是引用类型,func
的构造函数指向对应的引用类型函数,举例说明一下:
1 | function Func1(a, b){ |
一般构造函数不写返回值,则默认的返回值为undefined
,为基本类型。
五、js事件流
事件流描述的是从页面中接收事件的顺序,事件流包括下面几个阶段:
- 事件捕获阶段
- 处于目标阶段
- 事件冒泡阶段
addEventListener
是指定事件处理程序的操作,这个方法接收3个参数:
1、要处理的事件名
2、作为事件处理程序的函数
3、一个布尔值。如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。默认值为false
如果不想要事件冒泡,可以对冒泡阻止,IE与非IE阻止冒泡的写法不一样,所以需要判断:
1 | const btn = document.getElementById('btn') |