1.标准盒模型、IE盒模型区别
标准盒子模型:元素的width或height=content的width或height;
IE盒子模型:元素的width或height=content的width或height+padding*2+border*2;
即元素的content包不包含内边距与边框的差别
2.清除浮动的四种常用方法:
注:clear:both:本质就是闭合浮动, 就是让父盒子闭合出口和入口,不让子盒子出来
(1)添加标签法:在最后一个浮动标签后,新加一个标签,给其设置clear:both
优点:通俗易懂,方便
缺点:添加无意义标签,语义化差
(2)父级添加overflow属性(父元素添加overflow:hidden)
优点:代码简洁
缺点:内容增多的时候容易造成不会自动换行导致内容被隐藏掉,无法显示要溢出的元素
(3)使用after伪元素清除浮动
优点:符合闭合浮动思想,结构语义化正确
缺点:ie6-7不支持伪元素:after,使用zoom:1触发hasLayout.
(4)使用before和after双伪元素清除浮动
优点:代码更简洁
缺点:用zoom:1触发hasLayout.
3.例举3种强制类型转换和2种隐式类型转换
强制(parseInt,parseFloat,number)
隐式(== ===)
4.怎样理解闭包?常见的闭包有哪些?优缺点
闭包就是能够读取其他函数内部变量的函数,使得函数不被GC回收;
作为函数返回值的闭包、作为for循环闭包、作为参数的闭包;
好处
①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
③匿名自执行函数可以减少内存消耗
坏处
①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
5.js的数据类型
基本类型:
1、undefined 类型表示不存在定义,声明变量但没有初始化,这个变量的值就是undefined; 注意:在任何一个引用变量值设置为undefined都是错误的
2、null 类型,表示一个值被定义了,定义为空值; 使用场景为 定义变量准备在将来用于保存对象;所以引用值可以是null而不会是undefined;
undefined和null的区别:js诞生的时候只设置了null作为“无”的值。最初的设计是null是表示一个“无”的对象,转为数值时为0; | undefined表示“无”的原始值,转为数值时为NaN;红宝书上说引入undefined就是为了正式的区分空对象指针与未经初始化的变量,变量设置为null就是空对象指针,没有设置就是未经初始化!
3、Boolean类型,字面值为true和false
4、number类型,字面量格式可以是十进制、八进制(八进制第一位必须是0)、十六进制(前两位必须是0x)
5、String类型 由零个或多个16位Unicode字符组成的字符序列
6、symbol类型,ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6 引入Symbol的原因
引用类型:
引用类型统称为object类型,细分的话有:Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型 等。
两种类型在添加属性时候的区别
1、引用类型可以动态的给添加属性,
2、但是基本类型的值是不可变也不可以复制的
6.冒泡事件怎么理解?关闭冒泡的方法
点击内层元素,外层元素也会触发点击事件。
阻止冒泡ev.cancelBubble = true;非IE ev.stopPropagation();
7.数据类型的判断
这里只举一个例子,两种方法的使用
var arr = [];
arr instanceof Array; //true
typeof arr;//Object,typeof无法判断数组类型
8.js原型链的理解:
这个我就不写了,不懂的看这篇文:https://www.jianshu.com/p/be7c95714586
9.关于数据的一些常用函数方法
sort(sortby):排序函数,sortby,可选,必须为函数,用来规定排序顺序。ps:sort返回的是原数组,并不会生成新数组
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
map(function(currentValue, index, arr),thisValue):遍历数组函数,返回一个新的数组,数组中的元素为原始数组调用函数处理后的值
ps:map()不会对空数组进行检测;map()不会改变原始数组;
参数说明:
function(currentValue, index, arr):必须。为一个函数,数组中的每个元素都会执行这个函数。其中函数参数:
currentValue:必须。当前元素的的值。
index:可选。当前元素的索引。
arr:可选。当前元素属于的数组对象。
thisValue:可选。对象作为该执行回调时使用,传递给函数,用作"this"的值
forEach(function(currentValue, index, arr),thisValue):区别于map,它没有返回值
push()尾部添加 pop()尾部删除 unshift()头部添加 shift()头部删除concat数组合并,不会改变原数组
待更新...
网友评论