一、ES6
ES6目录
- let与const
- 解构赋值
- 新的原始数据类型(Symbol)
- Map对象和Set对象
- Reflect 与 Proxy
- 字符串
- 数值
- 对象
- 数组
- 函数
- 迭代器
- Class类
- 模块
- Promise对象
- Generator函数
- async函数
1. let const var 的区别
- let/const定义的变量不会变量提升,而var定义的变量可以变量提升
- 相同作用域内,let/const不能重复声明,var可以
- const声明变量必须要有初始值
- const声明一个只读常量,且常量不可以改变
2. 解构赋值
定义:解构赋值是对赋值运算符的扩展,可以将属性/值从对象/数组中取出来,赋值给其他变量
数组的解构赋值
let [a, [[b], c]] = [1,[[2], 3]]
let [a,,c] = [1,2,3]
let [a,...c] = [1,2,3,4]
let [a,b,...c] = [1]
对象的解构赋值
var {a,b} = {a:'aaa',b:'bbb'}
字符串的解构赋值
const[a,b,c,d,e] = 'hello'
数值和布尔值的解构赋值
let {toString:s} = 123
s === Number.prototype.toString
函数参数的解构赋值
function add([x,y]){
return x + y
}
add([1,2])
解构赋值的应用
- 交换变量的值
[x,y]=[y,x]
- 从函数返回多个值
function arr(){
return [1,2,3]
}
var[a,b,c] = arr()
function obj(){
return{
a:1,
b:2
}
}
var {a,b}= obj()
3. Symbol
- Symbol的特点是什么
1. 表示独一无二的值 2. 声明时不能使用new Symbol(),而是Symbol() 3. 声明时可以加参数,用于描述 4. 作为key时不能被遍历 - 如何声明两个相等的Symbol变量
使用Symbol.for let a = Symbol.for('a'); let b = Symbol.for('a'); a === b
4. Set和Map的区别
Set:
- 允许储存任何类型的唯一值,成员不能重复
- 应用场景:数据重组
- 只有键值没有键名
- 可以遍历
Map:
- 保存键值对,任何值都可以作为一个键或一个值
- 应用场景是:数据储存
- 本质上是键值对的集合
- 可以遍历,可以跟各种数据格式转换
5. Reflect和Proxy
Reflect对象创建目的
- 将Object对象一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上
- 修改某些Object方法返回的结果,让其更合理
- 让Object操作都变成函数行为
- Reflect对象的方法与Proxy对象的方法一一对应。不管proxy怎么修改默认行为,总可以在Reflect上获取到默认行为
什么是Proxy
用于修改某些操作的默认行为。在目标对象之前架设一层拦截,外界对该对象访问都必须先通过这层拦截。对外界的访问进行过滤和改写。
6. 字符串
模板字符串
`My Name is ${name},I am ${age+1} years old next year.`
7. 数值
比如新增的Number.parseInt(),用于将给定的字符串转换为指定进制的整数
8. 对象
- 拓展运算符
拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象,可用于合并两个对象 - 新方法Object.assign
将源对象所有可枚举属性复制到目标对象中
9. 数组
-
Array.of()
将参数中所有值转换为一个数组 -
Array.from()
将类数组对象或可迭代对象转化为数组
10. 函数
箭头函数没有自己的this,它的this继承而来,默认指向在定义它时所处的对象。
11. 迭代器
迭代器是ES6引入的一种新的遍历机制
-
forEach、for in、for of区别?
* forEach更多用来遍历数组 * for in 一般用来遍历对象或json * for of 数组对象都可以遍历,但遍历对象要通过Object.keys() * for in循环出的是key,for of循环出的是value
12. Class类
ES6的Class可以看作一个语法糖,它的绝大部分功能ES5也可以做得到,但Class写法让对象原型的写法更加清晰、更像是面向对象的编程语言
Class Point{
constructor(x,y){
this.x = x;
this.y = y;
}
toString(){
return this.x + this.y
}
}
13. 模块
export和import
1. 导出的函数声明与类声明必须要有名称
2. 不仅能导出声明,还能导出引用
3. export命令可以出现在模块的任何位置,但必须处于模块顶层
4. import命令会提升到整个模块头部,首先执行
14. Promise? 手写一个Promise
Promise是异步编程的一个解决方案。所谓Promise,简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作的结果)。Promise是一个对象,从它可以获取异步操作的消息
- 一般什么时候使用
处理异步请求时使用,比如Ajax请求
- 状态有pending、resolved、rejected怎么捕获它的错误
最后写catch,then里面的第二个参数可以捕获
- 如果内部抛错,但是没有被捕获,这个没被捕获的错误接下来会发生什么
冒泡
- 能不能被try catch捕获?为什么
不能,因为是异步编程
- 能不能被window.onerror捕获?
不能
let p = new Promise((resolve, reject) => {
axios.get(url).then((res) => {
if(res){
resolve(res)
}
}).catch(err => {
reject(err)
})
})
p.then((data) => {
}).catch(err => {
})
15. Generator函数
可以通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能,从而为异步编程提供解决方案
16. async、await
async是异步的简写,用于申明一个function是异步的,而await是等待一个异步方法执行完成。async函数其实返回的是一个Promise对象。
- 为什么await只能出现在async函数中?
await其实是在等待一个表达式,这个表达式的计算结果是Promise对象或者其他值。
也可以说是在等待async函数,如果他等到的是一个Promise对象,
await就会阻塞后面的代码,等待Promise对象resolve,得到resolve的值,
作为await表达式的运算结果。
但async函数调用不会造成阻塞,它内部的所有阻塞都封装在Promise对象
中异步执行。所以await必须用在async函数中
- async await的使用场景是什么
连续的异步请求,下一步异步请求依赖于前一步的异步请求结果
服务端与网络
同源策略
同源是指域名、协议、端口都相等。为了保护用户数据安全而采取的策略
- 无法用js读取非同源的cookie/localstorage等。防止恶意网站通过js获取用户信息
- 无法用js获取非同源DOM
- 无法用js发送非同源ajax请求
XXS攻击
XSS为跨站脚本攻击,其原理是攻击者向有XSS漏洞的网站中输入恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击目的
解决办法:通过正则表达式过滤掺入参数的HTML标签来防范XSS攻击
服务端渲染
服务端渲染简写SSR,是将组件或页面通过服务器生成html字符串,再发送到浏览器。最后将静态标记混合为客户端上完全交互的应用程序
使用SSR的利弊
- 优势、
- 由于服务端渲染返回的客户端已经获取了异步数据并执行js脚本的最终html,网络爬虫就可以抓取到完整的页面信息,利于SEO
- 更利于首屏渲染,普通客户端渲染加载所需文件时间较长,首页就会有一个很长的空白等待时间
- 劣势
- 服务端压力较大
- 开发条件受限
- 学习成本高
图片懒加载和预加载
- 懒加载也叫延迟加载。符合某些条件时,再加载图片
- 预加载:提前加载图片,当用户需要查看时可以从本地缓存中读取
前端性能优化方法
内容优化
- 减少http请求
- 减少DNS查询
- 避免重定向
- 让Ajax可以缓存
- 延迟架子啊组件
- 预加载组件
- 减少DOM操作
- 避免使用iframe
- 避免404
CSS优化
- 压缩css
- 避免使用css表达式
- 选择link放弃使用import
- 把样式表放在顶部
js优化
- 压缩js
- 去除重复脚本
- 脚本放在底部
图片优化
-
图片大小设置合适
-
使用雪碧图或base64字符
- 相关问题
1、这两个哪个好,为什么 雪碧图可以缓存 base64可以减少请求 2、怎么使用它们 webpack配url-loader(base64) webpack的雪碧图插件webpack-spritesmith -
使用字体图片或者svg
-
避免图片src属性为空
服务器
- 对AJAX使用get请求
- 使用cdn
- 添上Expires或者Cache-Control HTTP头
- 尽早清空缓存区
- 配置Etags
- Gzip组件
移动端
移动端开发怎么实现自适应
-
rem
-
vw和vh
-
媒体查询 它们的特点分别是什么?或者说实现的原理
-
rem根据html的font-size为基准点
-
vw是根据浏览器窗口高低、vh是高度
-
媒体查询是根据浏览器窗口高度或宽度进行响应式选择显示哪个css
GIT
git的一些基本命令
git init
git add
git commit -m
git status
git checkout
git branch
git merge
git push
git fetch
git pull
git remote
WEBPACK
webpack打包原理
-
原理
把所有依赖打包成一个bundle.js文件,通过代码分隔成单元片段并按需加载。
-
核心概念
-
入口
entry,告诉webpack从哪个入口文件开始构建
-
出口
output,告诉webpack在哪里输出构建后的包,包的名称等
-
loader
让webpack处理非javascript文件
-
plugin
处理各种任务,从打包优化,一直到重新定义环境中的变量
-
mode
告诉webpack使用相应模式的内置优化
-
target
webpack能够为多种环境和target构建编译
-
source map
定位代码中的错误
-
浏览器
一个页面从输入url到页面加载显示都发生了什么
浏览器根据请求的url交给DNS域名解析,找到真实ip,向服务器发起请求 服务器交给后台处理完成后返回数据,浏览器接收文件 浏览器对加载到的资源进行语法解析,建立相应的内部数据结构。载入解析到资源文件,渲染页面,完成
重绘与回流
-
重绘 当元素样式的改变不影响布局式,浏览器使用重绘对元素进行更新
-
回流 当元素的尺寸、结构或某些属性改变时,浏览器会重新渲染页面
-
触发回流的操作 页面初次渲染 浏览器窗口大小改变 元素尺寸内容位置发生改变等
-
重绘不一定触发回流,但回流一定触发重绘
防抖与节流
- 防抖:触发事件后,在n秒内函数只能执行一次
- 节流:连续触发事件,但是在事件中只执行一次
描述下cookies sessionstorage localstorage 的区别
-
cookie数据始终在同源的http请求中携带,而另外两个不会自动把数据发给服务器,仅在本地保存
-
cookie的储存大小不能超过4M 而另外两个虽然也有储存限制,但比cookie大得多
-
localstorage 浏览器关闭,数据不会被删除。除非自己手动删除 sessionstorage 浏览器关闭,数据被删除 cookie 数据在设置的有效期内一直有效
浏览器内核
IE:Trident
谷歌:webkit
火狐:Gecko
Safari:webkit
Opera:Presto