JS知识点记录

82 阅读3分钟

我正在参与掘金创作者训练营第6期,点击了解活动详情

最近在重读你不知道的JS,所以就有了以下的一些记录!

1.怎样删掉数组中的一个元素

1>删除最后一个元素:pop(),slice(),splice();

2>删除第一个元素:shift(),slice(),splice();

3>删除数组中某个指定下标的元素:splice(),

var delete_index = 2
var arr = [1,2,3,4,5]
// arr => [1,2,3,4,5]
var new_arr = arr.splice(delete_index, 1)
// new_arr => [3]
// arr => [1,2,4,5]

for删除

var delete_index = 2,
    arr = [1,2,3,4,5],
    new_arr = []
for (let i = 0, len = arr.length; i < len; i++) {
    if (i != delete_index) {
        new_arr.push(arr[i])
    }
}
// arr => [1,2,3,4,5]
// new_arr => [1,2,4,5]

4>删除数组中某个指定元素的元素:splice(),filter(),forEach(),map();

var arr = [1,2,3,4,5],
    element = 2
arr = arr.filter(item => item != element)
// arr => [1,3,4,5]
var arr = [1,2,3,4,5],
element = 2,
new_arr = []
arr.forEach(item => (item != element && new_arr.push(item)))
// new_arr => [1,3,4,5]

注意:

  1. 不可以使用 delete 方式删除数组中某个元素,此操作会造成稀疏数组,被删除的元素的为位置依然存在为empty,且数组的长度不变

  2. 不可以使用forEach() 方法比对数组下标值,因为 forEach 在循环的时候是无序的.

2.数组去重

1>利用ES6 Set去重(ES6中最常用) 不考虑兼容性,这种去重的方法代码最少。这种方法还无法去掉“{}”空对象,后面会有去掉重复“{}”的方法。

function unique (arr) {
  return Array.from(new Set(arr))
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
 //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]

2>利用for嵌套for,然后splice去重(ES5中最常用

双层循环,外层循环元素,内层循环时比较值。值相同时,则删去这个值。

3>利用indexOf去重

新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。

4>[...new Set(arr)] 对第一种写法的简化

3.事件冒泡

事件冒泡:目标元素事件先触发,然后父元素事件触发

事件捕获:父元素事件先触发,然后目标元素事件触发

事件执行顺序是: 先事件捕获(从 Windows -> document 依次往下)

再是目标事件处理

后是事件冒泡

addEventListener() 第三个参数为 false 事件触发顺序是冒泡顺序,true 为捕获顺序,默认为 false(这个冒泡和捕获是说当子元素被点击时)

事件委托

事件委托(即事件代理),是利用事件冒泡原理,把事件监听绑定在元素的父级上。当元素被点击时,父级上绑定的点击事件就会被触发,事件触发函数里通过判断 e.target 上的 data-name 或 class 等标识来执行不同的逻辑。

优点

1.减少事件注册,节省内存。比如,在table上代理所有td的click事件。在ul上代理所有li的click事件。

2.简化了dom节点更新时,相应事件的更新。比如不用在新添加的li上绑定click事件。当删除某个li时,不用移解绑上面的click事件。

缺点

1.事件委托基于冒泡,对于不冒泡的事件不支持。

2.层级过多,冒泡过程中,可能会被某层阻止掉(event.stopPropagation)。

3.理论上委托会导致浏览器频繁调用处理函数,虽然很可能不需要处理。所以建议就近委托,比如在table上代理td,而不是在document上代理td。

4.把所有事件都用代理就可能会出现事件误判。比如,在document中代理了所有button的click事件,另外的人在引用改js时,可能不知道,造成单击button触发了两个click事件。