splice和slice
splice()的方法有三种使用方法:删除,插入和替换
该方法会改变原数组
1、删除
splice(参数1,参数2)
参数1:要删除元素的索引(从0开始)
参数2:删除的个数(从参数1开始算)
var arr = [1,2,3,4,5];
arr.splice(1,2)
console.log(arr); //[1,4,5]
splice(参数1,参数2,参数3)
2.插入:如果参数2为0,那么就为插入 插入到参数1的后面
var arr = [1,2,3,4,5];
arr.splice(1,0,8)
console.log(arr); 【1,8,2,3,4,5】
3.替换:如果参数不为0,那么参数3就插入到删除元素的位置
var arr = [1,2,3,4,5];
arr.splice(1,2,8)
console.log(arr);//[1.8.4.5]
**slice(start, end) **
start,截取的位置 - 1 ;
end,所截取最后一个字符的位置。
该方法会返回一个新数组 不会改变原数组
可提取字符串的某个部分,并以新的字符串返回被提取的部分。
var str="Heloo";
var n=str.slice(1,3); //不包括本身,所以只截取的真实长度为2
console.log(n); //el
如果是负数,则该参数规定的是从字符串的尾部开始算起的位置。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类
生命周期钩子
px em rem
px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。是固定死的,因为IE无法调整那些使用px作为单位的字体大小,所以页面布局很容易错乱
Firefox虽然能够调整px,但是96%以上的中国网民使用IE浏览器(或内核)。
em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。会继承父级元素的字体大小
闭包
js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中
访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。
闭包有3个特性:
1.函数嵌套函数
2.函数内部可以引用函数外部的参数和变量
3.参数和变量不会被垃圾回收机制回收
函数作为返回值
例1:写一个for循环,让它按顺序打印出当前循环次数
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(i+'');
},2000)
}
按照预期它应该依次输出1 2 3 4 5,而结果它输出了五次5
由于js是单线程的,所以在执行for循环的时候定时器setTimeout被安排到任务队列中排队等待执行,而在等待过程中for循环就已经在执行,等到setTimeout可以执行的时候,for循环已经结束,i的值也已经编程5,所以打印出来五个5
for(var i=0;i<5;i++){
(function(i){
setTimeout(function(){
console.log(i+'');
},1000)
}(i))
}
引入闭包来保存变量i,将setTimeout放入立即执行函数中,将for循环中的循环值i作为参数传递,100毫秒后同时打印出1 2 3 4 5,并没有延迟输出
for(var i = 0;i<5;i++){
(function(i){
setTimeout(function(){
console.log(i);
},i*1000)
})(i)
}
相当于同时启动3个定时器,i*1000是为4个定时器分别设置了不同的时间,同时启动,但是执行时间不同,每个定时器间隔都是1000毫秒,实现了每隔1000毫秒就执行一次打印的效果。
例2:点击ul下面的li 弹出相对应的索引
<ul id="test">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
方法1:
window.onload = function(){
var lis = document.getElementById("test").children;
for(var i = 0;i<lis.length;i++){
lis.onclick = (function(i){
return function(){
alert(i);
}
})(i)
}
}
方法2
window.onload = function(){
var lis = document.getElementById("test").children;
for(var i = 0;i<lis.length;i++){
(function(i){
lis[i].onclick = function(){
alert(1)
}
}(i))
}
}
闭包的优缺:
优点:
1.保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
2.在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
3.匿名自执行函数可以减少内存消耗
缺点:
1.其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
2.其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响