我正在参与掘金创作者训练营第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]
注意:
-
不可以使用 delete 方式删除数组中某个元素,此操作会造成稀疏数组,被删除的元素的为位置依然存在为empty,且数组的长度不变
-
不可以使用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 等标识来执行不同的逻辑。