怎样提升浏览器的加载速度
1、文件的外部引入
2、减少冗余代码,将代码进行封装
3、使用事件委托代替dom获取,减少dom操作
4、图片的懒加载
5、压缩文件
什么是事件冒泡?怎样阻止事件冒泡?
1、两个div两两嵌套,都添加点击事件,我点击里面的div的时候,外面的div事件也会触发
2、js中阻止事件冒泡的方法:e.stopPropagation();jq中阻止事件冒泡的方法return false
事件绑定,解绑的方法
1、addEventListener:事件绑定
2、removeEventListener:事件解绑
什么是 window 对象?什么是 document 对象?
1、window对象也就是BOM,也就是浏览器对象:window对象封装了窗口标题,工具栏按钮,地址栏,状态栏等等。都是window的成员对象。(window就是BOM也就是浏览器)
2、document对象也就是DOM,代表的是html整个的文档,可以用来访问网页中的所有元素,dom属于window对象的一部分。(document就是dom,也就是网页)
for in 和 for of 有什么区别?for of 为什么遍历对象会报错?
1、for in遍历数组得到的是索引,遍历对象得到的是属性,不能遍历map对象;for of遍历数组得到的是值,遍历对象会报错。
2、因为没有引入iterable,需要加上Object.keys(),Object.values()才能使用,遍历map对象得到的是属性和值。
说一下你对 this 的理解:
1、在浏览器中,在全局范围内,this指向的是window
2、在普通函数中,this指向的是调用者
3、在构造函数中,this指向的是new出来的那个新对象
4、call、apply、bind中的this被强绑定在那个对象中
5、在箭头函数中this属于当前所处的最大的对象,而不是执行时的对象。箭头函数没有自己的this,它的this是继承而来;默认指向在定义它时所处的对象(宿主对象),此处指父级作用域,而不是执行时的对象。
用过深拷贝,浅拷贝吗?深拷贝和浅拷贝的区别?如何实现深拷贝?浅拷贝?JSON 深拷贝的弊端及解决方案。
1、深拷贝:就是b复制了a,当修改a的时候,b不会随着a的变化而变化,拥有独立的内存。将数据中的所有数组拷贝下来,对拷贝之后的数据进行修改不会影响到原数据。
2、浅拷贝就是b复制了a,当修改a的时候,b中的子元素不会随着a的变化而变化,但是b中的子对象中的元素会随着a的变化而变化。原数据和复制后的数据的第一层不会改变,第二层或者深层会改变
3、浅拷贝的方法:
①、slice
②、concat
③、es6剩余运算符
4、深拷贝:
①、JSON.parse()、JSON.stringify()
②、jq的extend方法
③、通过递归去拷贝所有的层级
5、JSON弊端
①、如果obj里面存在时间对象,通过JSON方法会导致时间对象变成了字符串。
②、如果obj里面有RegExp、Error对象,转化后的结果是空对象。
③、如果obj里面有函数,undefined,则序列化的结果会把函数,unedfined丢失。
④、如果obj里面有NaN,Infinity和-Infinity,则序列化的结果会变成null。
⑤、JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的,则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor。
⑥、如果对象中存在循环引用的情况也无法正确实现深拷贝。
6、解决:递归实现深拷贝
什么是面向对象?面向对象的特点?
1、面向对象是一种编程思想,是由属性和方法组成的。
2、面向对象的特点:封装、继承、多态。
什么是构造函数?构造函数帮我们干了哪两件事?
1、用new关键字调用的函数称为构造函数
2、
①、帮我们创建了一个空对象
②、将结果返回出去
面向对象的继承方式?
1、call或apply方法
2、原型链prototype
3、利用空对象作为中介