1、写出元素垂直居中的方法
方法一:在不知道自己高度和父元素高度的情况下,利用绝对定位
父元素position:relative;
子元素position:absolute;top:50%;transform:translateY(-50%);
方法二:知道子元素高度的情况下,利用绝对定位
父元素position:relative;
子元素position:absolute;top:50%;left:50%;margin-left和margin-top分别为宽高的负一半。
方法三:设置height和line-height为相同的值,但是这只应用于单行文本
2、margin越界的解决方法
方法一:父元素设置border
方法二:父元素设置padding-top
方法三:父元素设置overflow:hidden
方法四:父元素设置伪类:before{
content:'';
display:table;
}
3、简述box-sizing的属性
在说box-sizing之前先说下盒模型,盒模型分两种,IE盒模型和W3C盒模型。
IE盒模型:content内容包括了padding和border
W3C盒模型:content内容不包含其他两部分
box-sizing:content-box|border-box|padding-box
content-box(默认值):宽度不包含padding和border
border-box:宽度包含padding和border
padding-box:宽度包含padding
4、简述对闭包的理解
闭包就是函数中的函数,里面的函数可以访问外面函数的变量。
闭包的作用:1)、使用闭包可以访问函数外的变量
2)、可以使变量长期保存在内存中,生命周期比较长。
闭包要注意的地方:1)、闭包不能滥用,否则会导致内存泄漏,影响网页的性能
2)、闭包使用完之后,要立即释放资源
5、简述几种本地存储,并写出其区别
cookie、sessionStroge、localStroge
共同点:都是保存在浏览器中,且都是同源的
区别:
1)、cookie在浏览器和服务器间来回传递
sessionStroge和localStrige不会自动把数据发送给服务器,仅用于本地保存。
cookie还有路径(path)的概念,可以限制cookie只属于某个路径下。
2)、存储大小限制不同
cookie数据不能超过4k
sessionStroge和localStrige虽然也有限制,但可以达到5M以上
3)、数据有效期不同
cookie只在设置的cookie过期之前有效,即使窗口或浏览器关闭
sessionStroge只在当前浏览器关闭之前有效
localStroge不管浏览器关闭与否,数据永久保存
4)、作用域不同
cookie数据在所有同源窗口中都是共享的
sessionStroge在不同浏览器窗口不共享,即使是同一个页面
6、数组去重
1 function test(arr){2 var temp=[];3 for(var i=0;i
7、一个ul包含10个li,实现点击对应的li,输出其内容。
方法一:利用this
1 var myul = document.getElementsByTagName("ul")[0]; 2 var li = myul.getElementsByTagName("li"); 3 function foo(){ 4 for(var i=0;i
方法二:事件委托
1 var myul = document.querySelector('ul'); 2 var list = document.querySelectorAll('ul li'); 3 4 myul.addEventListener('click', function(ev){ 5 var ev = ev || window.event; 6 var target = ev.target || ev.srcElemnt; 7 8 for(var i = 0, len = list.length; i < len; i++){ 9 if(list[i] == target){ 10 alert(target.innerHTML); 11 } 12 } 13 });
8、JS实现深拷贝
JS中数据类型分为基本数据类型(null、undefined、number、string、boolean)和引用类型(object、array、function)。
基本类型存放在栈内存中,引用类型存放在堆内存中。
栈内存存放基本类型的变量,堆内存存放new出来的变量。
浅拷贝就是将直接复制,复制前后前后的两个对象指向同一个内存地址,对其中一个进行操作,另一个也会发生同样的变化。他们只是不同的指针指向了同一块内存。
深拷贝则是开辟了一个新的内存地址,把其内容完完全全复制到新的内存中,之后对这个新对象的任何操作都不会影响到原先对象(既两边的操作都不会影响彼此),他们两个成了完全独立的对象
对于基本类型的变量可以进行浅拷贝,但对于引用类型的变量就得用深拷贝。
可以通过遍历+递归实现深拷贝
1 function deepClone ( obj ) { 2 if( typeof obj != "object" ){ 3 return obj ; 4 } 5 6 var newObj = obj.constructor === Array ? [] : {}; //开辟一块新的内存空间 7 8 for( var i in obj ) { 9 newObj [ i ] = deepClone ( obj [ i ] ); //通过递归实现深层的复制 10 }11 12 return newObj;13 }
此外,还可以通过使用一些框架或库里的方法来完成深拷贝
比如jquery里的extend()方法:extend(deep,object) //第一个参数为可选参数,默认为false,如果传入true,则实现的就是深拷贝