前端必背面试题15道
1.什么是闭包?应用场景闭包就是函数嵌套函数的特殊形式:1.函数作为参数被传入2.函数作为返回值被返回闭包其实也是自由变量的特殊表现形式:1.自由变量:没有在当前作用域声明的变量2.自由变量的值和作用域是在函数定义的时候去欸的那个,不是在函数执行的时候确定优点:1.可以变量私有化,避免变量的全局污染2.自由变量值,存储在内存中不会...
1.什么是闭包?应用场景
闭包就是函数嵌套函数的特殊形式:1.函数作为参数被传入
2.函数作为返回值被返回
闭包其实也是自由变量的特殊表现形式:1.自由变量:没有在当前作用域声明的变量
2.自由变量的值和作用域是在函数定义的时候去欸的那个,不是在函数执行的时候确定
优点:1.可以变量私有化,避免变量的全局污染
2.自由变量值,存储在内存中不会被销毁
应用场景:1.封装组件,插件库的时候避免变量全局污染
2.创造局部作用域变量,类似于let效果
2.如何实现继承
1.构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上
functionA(name){this.name=name}
functionB(name,age){
A.call(this.age)
this.age = age;
}
B.prototype = Object.create(A.prototype)
B.prototype.constructor = B
2.实例继承:将子对象的 prototype 指向父对象的一个实例
3.拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
4.原型继承:将子对象的 prototype 指向父对象的 prototype
5.ES6 语法糖 extends:class ColorPoint extends Point {}
3.原型与原型链应用场景
每一个对象都有一个隐式原型__proto__
每一个构造函数都有一个显示原型__prototype__
对象实例的隐式原型等同于,创建该对象的构造函数的显示原型prototype
当查找一个对象的方法和属性,先在自身对象属性上查找,找不到,则沿着隐式原型__proto__向上查找,(__proto__.__proto__)
Object.prototype.__proto__ 结果为null
应用场景:
1.实现继承
2.创建实例的公共方法:Vue.__prototype__.$http = axios
4. 实现深拷贝
1.什么是闭包?应用场景
闭包就是函数嵌套函数的特殊形式:1.函数作为参数被传入
2.函数作为返回值被返回
闭包其实也是自由变量的特殊表现形式:1.自由变量:没有在当前作用域声明的变量
2.自由变量的值和作用域是在函数定义的时候去欸的那个,不是在函数执行的时候确定
优点:1.可以变量私有化,避免变量的全局污染
2.自由变量值,存储在内存中不会被销毁
应用场景:1.封装组件,插件库的时候避免变量全局污染
2.创造局部作用域变量,类似于let效果
2.如何实现继承
1.构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上
functionA(name){this.name=name}
functionB(name,age){
A.call(this.age)
this.age = age;
}
B.prototype = Object.create(A.prototype)
B.prototype.constructor = B
2.实例继承:将子对象的 prototype 指向父对象的一个实例
3.拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
4.原型继承:将子对象的 prototype 指向父对象的 prototype
5.ES6 语法糖 extends:class ColorPoint extends Point {}
3.原型与原型链应用场景
每一个对象都有一个隐式原型__proto__
每一个构造函数都有一个显示原型__prototype__
对象实例的隐式原型等同于,创建该对象的构造函数的显示原型prototype
当查找一个对象的方法和属性,先在自身对象属性上查找,找不到,则沿着隐式原型__proto__向上查找,(__proto__.__proto__)
Object.prototype.__proto__ 结果为null
应用场景:
1.实现继承
2.创建实例的公共方法:Vue.__prototype__.$http = axios
4. 实现深拷贝
1.什么是闭包?应用场景
闭包就是函数嵌套函数的特殊形式:1.函数作为参数被传入
2.函数作为返回值被返回
闭包其实也是自由变量的特殊表现形式:1.自由变量:没有在当前作用域声明的变量
2.自由变量的值和作用域是在函数定义的时候去欸的那个,不是在函数执行的时候确定
优点:1.可以变量私有化,避免变量的全局污染
2.自由变量值,存储在内存中不会被销毁
应用场景:1.封装组件,插件库的时候避免变量全局污染
2.创造局部作用域变量,类似于let效果
2.如何实现继承
1.构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上
functionA(name){this.name=name}
functionB(name,age){
A.call(this.age)
this.age = age;
}
B.prototype = Object.create(A.prototype)
B.prototype.constructor = B
2.实例继承:将子对象的 prototype 指向父对象的一个实例
3.拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
4.原型继承:将子对象的 prototype 指向父对象的 prototype
5.ES6 语法糖 extends:class ColorPoint extends Point {}
3.原型与原型链应用场景
每一个对象都有一个隐式原型__proto__
每一个构造函数都有一个显示原型__prototype__
对象实例的隐式原型等同于,创建该对象的构造函数的显示原型prototype
当查找一个对象的方法和属性,先在自身对象属性上查找,找不到,则沿着隐式原型__proto__向上查找,(__proto__.__proto__)
Object.prototype.__proto__ 结果为null
应用场景:
1.实现继承
2.创建实例的公共方法:Vue.__prototype__.$http = axios
4. 实现深拷贝
通过jQuery的extend方法
通过 JSON 对象
函数库lodash的_.cloneDeep方法
递归的方式
5. js事件流
冒泡流(默认) :1.最具体的元素先触发事件,一次向上冒泡式的传递
2.e.stopPropogation() 阻止时间冒泡流
3.e.preventDefault() 阻止默认事件
捕获流 :最大元素捕获到时间,然后传递个最具体的元素
element.addEventListener(callbacak,false)
6. 数组去重
1.es6 中的set
2.遍历去重
fliter : 当前的index与indexOf(elem)的值不一致去重
对象key唯一 :用一个临时对象吧数组的值,当key存储在对象中,如果对象上已经有key值,说明数组的值是重的
7.异步同步
异步:向服务器发送请求,必须等请求到内容,才能刷新页面,用户才能看到新内容
同步:向服务器发送请求,这时可以做其他事情,内容请求到时,用户不用刷新页面,也可以看到新内容
8. ajax
异步的javaScript和xml
核心对象:XMLHTTPRequest(xhr)
通过xhr 与后端扶额u交换数据,通过 js 实现无刷新更新页面
优点 :无刷新更新页面,实现各种懒加载,异步加载,提供首屏渲染速度
缺点 :由于内容是动态加载的,SEO搜索引擎 不友好
常见库 :JQuery.$ajax
axios : 不依赖任何DOM,
服务端(nodejs)
能够创建实例二次封装
能对请求创建实例二次封装
9. 跨域和jsonp
跨域考虑到安全问题,有同源策略
所谓同源策略,就是“端口,域名,协议”三者一致,就算有两个相同的域名访问统一IP地址,也非同源
如果“端口,域名,协议”三者内有一者不相同,就称为跨域
jsonp是解决跨域问题的一种方法,jsonp是利用<script>标签没有同源限制,直接发送给服务器,可以返回带有callback参数的回调函数
10. promise
1. ES6 新增方法:解决异步操作,回调函数层级过深的问题(回调地狱)
2. Promise.race() : 多个promise请求返回最快的一个
3. Promise.all() : 等多个promise都执行并返回时,才执行then
4. Promise.reject() : 抛出错误
5. Promise状态一旦确定就不会更改 :
var p = new Promise( (resolve,reject)=>{
// reject(xxx)
// resolve(xxx)
} )
p.then( (res)=>{ })
.catch(err=>{ })
11. this指向问题
1. 全局 window :script
setInterval.setTimeout
2. 对象 指对象本身
3. 构造函数的实例
4. class类的实例
5. 箭头函数 指向上一层作用域this
6. 函数 函数的直接调者
7. call.apply.bind 指向第一个参数
12. 对象类型判断
typeof
值类型 :string number boolean undefined null symbol
引用类型 :function array object
instance of
constructor
Object.prototype.toString.call() 最准
13. 堆与栈
14.浏览器的渲染过程
1. 解析 HTML 构建 DOM(DOM 树)
2. CSS 文件下载完成,开始构建 CSSOM(CSS 树)
3. 合并dom和css树,生成 渲染树
4. 渲染页面
在地址输入一个地址 按回车 :
1. 查找IP
a. 浏览器缓存
b. host文件
c. 本地缓存
d. dns服务器向上查询 找到域名对应的 IP 为止
2. 得到响应数据 : 三次握手 四次挥手 建立连接,下载html,根据 html 下载其他资源
15.前端性能优化
1. 减少 http 请求和大小 (压缩与合并)+ base64 图片
2. 优化首屏的渲染速度 (css放前面,js放后面,避免错误,只加载首屏的必要资源)
3. 按需加载,懒加载,预加载 (js,css,图片,页面,按需 懒 预加载)
4. 让加载更快 启用 CDN ,开启gzip,缓存
更多推荐
所有评论(0)