1、谈谈对闭包的理解,闭包的用途,闭包的缺点
闭包是指有权访问另一个函数作用域中的变量的函数
它主要用于设置私有的方法和变量。
还可以构建命名空间,以减少全局变量的使用。
使用闭包模块化代码,可以减少全局变量的污染
它的缺点:
它会使函数中的变量被保存在内存中,滥用闭包可能会导致内存泄露。解决方法是在函数退出之前,将不使用的局部变量全删除。
闭包会在父函数外边,改变父函数内部的值
2、javascript做类型判断的方法有哪些?
typeof,可以判断原始数据类型:undefined、boolean、string、number、symbol,但是typeof null的类型判断为object。对于引用类型,会判断为function、object两种类型。
instanceof ,instanceof 检测的是原型,判断一个实例是否属于某种类型。
Object.prototype.toString。toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的类型。
3、如何阻止事件冒泡和默认事件
阻止事件冒泡
DOM中提供stopPropagation()方法,但IE不支持,使用event对象在事件函数中调用就行.
IE中提供的是,cancelBubble属性,默认为false,当它设置为true时,就是阻止事件冒泡,也是用event对象在事件函数中调用.
jQuery中提供了stopPropagation()方法来停止事件冒泡,当需要时,只需用用event对象来调用就行,即event.stopPropagation();
阻止默认行为
DOM中提供preventDefault()方法来取消事件默认行为,但是只有当cancelable属性设置为true的事件,才可以使用preventDefault()来取消事件默认行为,使用event对象在事件函数中调用就行。
IE中提供的是returnValue属性,默认为true,当它设置为false时,就是取消事件默认行为,也是用event对象在事件函数中调用。
jQuery中提供了preventDefault()方法来阻止元素的默认行为,只需要用event对象来调用就好,即event.preventDefault()
对于a链接,可以使用javascript伪协议来阻止默认行为
4、什么是深拷贝,什么是浅拷贝?
关于深拷贝还是浅拷贝,浅拷贝是指拷贝一层,深层次对象级别就只拷贝引用;深拷贝是每一层的数据都会拷贝出来。简单来说就是浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那样,会拷贝其本身;通过object.assign(目标对象,任意多个源对象),返回值: 目标对象会被返回
如果除了基本数据之外还有一层的对象,那么对于浅拷贝来说,就只能拷贝其引用。如果原对象的值发生了变化,那么这个结果不光会反映到原对象上,但是深拷贝就不一样,即使有嵌套关系依然会全部的拷贝出来。通过JSON数据解析实现
浅拷贝就是两个对象引用的是同一个的内存空间,一个改变全部改变。
深拷贝就是两个对象,旧对象还是用原来的储存空间。但是新对象就不同了,新对象自己开辟了一个新的空间,自己对自己控制,不再受原来空间的限制。
5、Js中forEach和map方法的区别
forEach()针对每一个元素执行提供的函数,对数据的操作会改变原数组。
map()不会改变原数组的值,它返回一个新数组,且原数组不会改变。
6、讲一下let、var、const的区别,谈谈如何冻结变量
var 没有块级作用域,支持变量提升。(变量提升:即可先使用变量,再声明变量)
let 有块级作用域,不支持变量提升。不允许重复声明,暂存性死区。(块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。)
const 有块级作用域,不支持变量提升,不允许重复声明,暂存性死区。声明一个变量一旦声明就不能改变,改变报错。const保证的变量的内存地址不得改动。如果想要将对象冻结的话,使用Object.freeze()方法
7、箭头函数和普通函数的区别是什么?
普通函数this:
this总是代表它的直接调用者
在默认情况下,没找到直接调用者,this指的是window。
在严格模式下,没有直接调用者的函数中的this是undefined。
使用call,apply,bind绑定,this指的是绑定的对象
箭头函数this:
在使用=>定义函数的时候,this的指向是 定义时所在的对象,而不是使用时所在的对象;
不能够用作构造函数,这就是说,不能够使用new命令,否则就会抛出一个错误;
不能够使用 arguments 对象;
不能使用 yield 命令;
8、.函数柯里化理解
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
用途:1.延迟计算;2.参数复用;3.动态生成函数
9、JS中substr与substring的区别?
js中substr和substring都是截取字符串中子串,非常相近,可以有一个或两个参数。
substr(start [,length]) 第一个字符的索引是0,start必选 length可选
substring(start [, end]) 第一个字符的索引是0,start必选 end可选
10、js创建对象的几种方式
Object构造函数创建
var Person = new Object();
使用对象字面量表示法
var Person = {}
使用工厂模式创建对象
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson(‘Nike’,29,‘teacher’);
使用构造函数创建对象
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person(‘Nike’,29,‘teacher’);
11、引起内存泄露的原因?怎样避免内存泄露?
原因
意外的全局变量引起的内存泄露
闭包引起的内存泄露
没有清理的DOM元素引用
被遗忘的定时器或者回调
避免
减少不必要的全局变量,或者生命周期较长的对象,及时对无用的数据进行垃圾回收;
注意程序逻辑,避免“死循环”之类的 ;
避免创建过多的对象 原则:不用了的东西要及时归还。
12、js中set的用法
它类似数组,但它最大的特性就是所有的元素都是唯一的,没有重复。我们可以利用这一点进行数组的去重工作。
var set6 = new Set([1,23,4,5,3,4,5,6])
13、js的垃圾回收机制
找出那些不在继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔,周期性的执行这一操作
防止了出现内存泄露和溢出的情况
14、jQuery选择器的种类
14.1.基本选择器
$("#id") //ID选择器
$(“div”) //元素选择器
$(".classname") //类选择器
$(".classname,.classname1,#id1") //组合选择器
14.2.层次选择器
$("#id>.classname “) //子元素选择器
$(”#id .classname “) //后代元素选择器
$(”#id + .classname “) //紧邻下一个元素选择器
$(”#id ~ .classname ") //兄弟元素选择器
14.3.过滤选择器
$(“li:first”) //第一个li
$(“li:last”) //最后一个li
$(“li:even”) //挑选下标为偶数的li
14.4.表单选择器
$(":input") //匹配所有 input, textarea, select 和 button 元素
( " : t e x t " ) / / 所 有 的 单 行 文 本 框 , (":text") //所有的单行文本框,(":text")//所有的单行文本框,(":text") 等价于( " [ t y p e = t e x t ] " ) , 推 荐 使 用 ("[type=text]"),推荐使用("[type=text]"),推荐使用(“input:text”)效率更
15、bootstrap的优势
移动设备优先
浏览器支持良好
容易上手
响应式设计等优点
16、函数防抖和函数节流
函数防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
应用场景:搜索功能
函数节流:限制一个函数在一定时间内只能执行一次。(定时器实现节流函数)
17、回调函数
回调函数就是将这个函数作为参数传到另一个函数中,当那个函数执行完之后,再执行传进去的这个函数。这个过程就是回调
18、原型继承和class继承
原型可以通过描述两个事物之间的相似关系来复用代码,我们可以把这种复用代码的模式称为原型继承。
class继承可通过extends关键字实现
19、js中为什么要使用模块化代码
解决命名冲突
提高代码的复用性
提高代码的可维护性
20、V8
v8是javascript的一种引擎,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码,可以提高浏览器的性能。
21、$(document).ready()和window.onload()有什么区别
window.onload()方法实在网页中所有的元素完全加载到浏览器后才执行
$(document).ready()方法在dom载入就绪时就对其进行操作,并且调用执行绑定的函数
22、get和post请求的区别
Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。
Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制。
Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
Get执行效率却比Post方法好。Get是form提交的默认方法。
23、Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
hasOwnProperty
javaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。
24、事件委托(事件代理)
事件委托原理:事件冒泡机制
“事件代理”即是把原本需要绑定在子元素的响应事件(click、keydown…)委托给父元素,让父元素担当事件监听的职务。
优点
大量减少内存占用,减少事件注册。
.新增元素实现动态绑定事件
实现方式:
、可用addEventListener(); 语法:element.addEventListener(event, function, useCapture);
25、事件冒泡和事件捕获
事件冒泡 :当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window
捕获型事件(event capturing):事件从最不精确的对象(document 对象)开始触发,然后到最精确