js 面试 2021-01-10
创建数组和对象有两种方式,一种是new 一种是直接声明
new操作具体做了什么
1.创建了一个空对象
2.this指向创建的空对象
3.执行构造函数里边的代码,给这个空对象添加属性和方法
4.返回给这个对象
变量提升问题 把已有的局部变量提升到全局变量,只需要把局部变量的值赋值给全局变量
闭包
var add = (function () {
var counter = 0;
console.log(counter);
return function () {return counter += 1;}
})();
console.log(counter )
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰,
直观的说就是形成一个不被销毁的栈环境
优点:
可以读取函数内部的变量(函数内部的变量不会被销毁)
避免全局污染,调用函数时会使用函数中定义的变量,不会使用全局变量(变量声明发生冲突)
缺点:
闭包会导致变量不会被垃圾回收机制清除,会大量消耗内存
总结:
作用域链查找变量的方式是一层一层的往上找,直到找到为止,如果找到window全局作用域还未找到,就报undefined
嵌套函数中,因为不在同一作用域,正常情况下内外部函数是访问不到内部函数的,但是通过闭包可以实现
尽可能少的使用闭包,因为会造成内存消耗大以及有可能造成内存泄漏
委托事件
把一个或者一组事件委托到它的父级或者更外层元素上,真正绑定事件的是外层元素,
当我们有一个列表,列表之中有大量的列表项,我们需要在点击列表的时候响应一个事件,
如果给每个列表都绑定一个函数,对内存消耗是非常大的,在效率上需要消耗很多性能,
因此比较好的方式是把这个事件绑定到他的父级元素,然后执行的时候再去匹配判断目标元素
高阶函数
将变量作为参数传递给函数,函数也是如此。我们调用接受或返回另一个函数称为高阶函数
把函数最为参数传入另一个函数,当传入参数被调用时,就称为回调函数
ajax的get、post的区别
get方式传送数据量小,处理效率高,安全性低,会被浏览器缓存
post方式传送数据量大,效率低,安全性高,不会被浏览器缓存
ajax请求和接受数据
传输数据需要把对象转换json格式
接受需要把json格式的数据转换成对象
如何阻止默认事件
return false
unll 和undefined等等区别
null是一个表示无的对象,转换数值为0
undefined 表示未定义
undefined是一个表示无的初始值,转为数值为NaN
undefined表示缺少值,就是此处应该有一个值,但是还没有定义
变量被声明了,但是没有赋值,就等于undefined
调用函数时,应该提供的参数没有提供,改参数等于undefined
对象没有赋值属性,该属性的值为undefined
函数没有返回值,默认返回undefined
js 的作用链域
作用域链的原理和原型很类似,如果这个变量在自己的作用域中没有,那么它会寻找父级,直到最顶层
dom 事件流的三个阶段
事件捕获——目标阶段——事件冒泡
目标阶段是最终目标的节点上触发这个事件,就是目标阶段
事件冒泡
由内到外 事件冒泡
子元素被父元素所包括,所以在点击子元素时也会触发父元素
当使用事件冒泡时,子元素先触发,父元素后触发
由外到内 事件捕获
当使用事件捕获时父级元素先触发,子级元素后触发
事件冒泡和捕获的传播可以用stopPropagation()方法阻止
== 和===的不同
==是会自动转换类型,再判断是否相等
===不会自动转换类型,直接去比较也可以说===是完全对比先判断数据类型
document load 和document ready的区别
load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数
$(document).ready()是当DOM文档树加载完成后执行一个函数 (不包含图片,css等)所以会比load较快执行
函数声明和函数表达式的区别
function arr 函数定义
var arr =function 函数表达式
函数声明整体会被提升到当前作用域的顶端,函数表达式也提升到顶部但是只有其变量名提升
以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用
this 的指向问题
在方法中,this表示该方法所属的对象
单独使用,this表示全局对象
在函数中,this表示全局对象
在事件中,this 指向了接收事件的 HTML 元素
null 是只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以unll是object类型

浙公网安备 33010602011771号