优点:
2.1、新增的常用标签
2.2、新增的常用属性
2.3、新增的 API
Javascript
单线程执行的基础上,开启一个子线程,进行程序处理,而不影响主线程的执行,当子线程执行完毕之后再回到主线程上,在这个过程中并不影响主线程的执行过程,也相当于在浏览器端实现多线程javascript
的文件资源W3C 标准盒模型:属性width,height只包含内容content,不包含border和padding。
IE 盒模型:属性width,height包含border和padding,指的是content+padding+border。
参考链接:CSS盒模型详解
可以通过构造函数,生成一个新的对象的对象,就是原型,即原型的对象
调用原型上定义的属性,会沿着__proto__
这条链往上查找,直到查找到 null 为止,这条链就叫原型链
有全局作用域和局部作用域,局部作用域分为块级作用域和函数作用域(函数在定义的时候,不是调用的时候,就已经确定了函数体内部自由变量的作用域,所以自由变量的作用域需要到创建这个函数的作用域下去寻找)
在局部作用域中使用的自由变量,就是通过一级一级往上找的,这个查找的过程就是作用域链
在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值了,有的先用undefined占个空。函数每次调用都会生成一个执行上下文环境
参考链接:深入理解javascript原型和闭包
// 1、promise 有几种状态?
// 答:3种,pending、resolved、rejected
// 2、promise 的状态是否可变?
// 不可变
// 3、promise 如何解决地狱回调?
// 通过then链式调用来解决
复制代码
类继承可以使子类的实例使用在父类中定义的属性和方法
参考链接:js类的继承,es5和es6的方法
简单的说,闭包就是定义在函数内部的函数,是将函数内部和函数外部连接起来的桥梁,闭包还包含自由变量,这些自由变量是在闭包的的执行上下文环境中定义的
释放内存的方式:
参考链接:ECMAScript 6 - 阮一峰
function deepClone(obj) {
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj ==="object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
//判断ojb子元素是否为对象,如果是,递归复制
if (obj[key]&&typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
JSON.parse(JSON.stringify(obj))
复制代码
深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于JavaScript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个对象,因此普通的赋值既不是深拷贝也不是浅拷贝。
深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝: 在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去。
而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
function handlerSort(arr) {
for (let i = 0; i < arr.length - 1; i ++) {
for (let j = 0; j < arr.length - i -1; j ++) {
if (arr[j] > arr[j + 1]) {
let tempt = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tempt
}
}
}
return arr;
}
复制代码
参考链接:事件循环机制(event loop)
参考链接:浏览器事件循环机制——浏览器事件环
参考链接:浏览器事件循环机制
参考链接:前端经典面试题之一(浏览器输入url按下回车后发生了什么)
参考链接:「一道面试题」输入URL到渲染全面梳理中-页面渲染篇 - 掘金 (juejin.cn)
参考链接:「自我检验」输入URL发生了啥?希望你顺便懂这15个知识点 - 掘金 (juejin.cn)
参考链接:「硬核JS」你真的了解垃圾回收机制吗 - 掘金 (juejin.cn)
参考链接:浏览器中的垃圾回收与内存泄漏 - 掘金 (juejin.cn)
参考链接:前端面试常考题:JS垃圾回收机制 - 掘金 (juejin.cn)
参考链接:10种跨域解决方案(附终极大招) - 掘金 (juejin.cn)
1xx:是预留给协议的
2xx:是表示请求成功的
3xx:是表示重定向的
4xx:是客户端错误的
5xx:是服务器端错误的
参考链接:浏览器对于常见HTTP状态码的反应
参考链接:浏览器状态码含义
参考链接: BOM主要对象属性方法总结
参考链接:Vue生命周期详解
参考链接: Vue - 路由守卫(路由的生命周期)
参考链接:# Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]
参考链接:VUE指令与修饰符
参考链接:[juejin.cn/post/688439… Vue 总结:组件间的通讯方式(父子传参、兄弟传参、任意两个组件间传参、多个组件嵌套传参))
参考链接:Vue双向绑定原理,教你一步一步实现双向绑定
参考链接:Vue3对比Vue2
参考链接:一文搞懂Vue2和Vue3的Proxy
参考链接:Vue3 的响应式和以前有什么区别,Proxy 无敌?
参考链接:【Vue原理】Diff - 白话版 参考链接:详解vue的diff算法
参考链接:【Vue原理】Watch - 白话版
参考链接:【Vue原理】Computed - 源码版
参考链接:面试官常问的那些webpack插件-超详细总结
参考链接:提升webpack打包速度的方法
参考链接:当面试官问Webpack的时候他想知道什么 | 微信开放社区 (qq.com)
参考链接:面试官问 Vue 性能优化,我该怎么回答_程序员黑叔的博客-CSDN博客
参考链接:我在面试时是如何回答“前端性能优化”的 - 七尚 - 博客园 (cnblogs.com)
参考链接:vue项目首屏加载优化实战 - 面包大虾 - 博客园 (cnblogs.com)
参考链接:小程序(四)小程序生命周期
参考链接:小程序 — 小程序生命周期及页面生命周期
参考链接:分包加载-小程序文档
docker images
docker images -q // 查看所有镜像的id
搜索镜像:从网络中查找需要的镜像 docker search 镜像名称 // 也可通过 hub.docker.com 查找
拉取镜像:从 Docker 仓库下载镜像到本地,镜像名称格式为 名称:版本号
,如果版本号不指定则是最新的版本,如果不知道镜像镜像版本,可以去docker hub搜索对应镜像查看 docker pull 镜像名称
删除镜像:删除本地镜像 docker rmi 镜像id // 删除指定本地镜像
docker rmi 'docker images -q' // 删除所有本地镜像
docker ps // 查看正在运行的容器
docker ps -a // 查看所有容器
docker ps -q // 查看所有容器id
docker run 参数
参数说明:
-i:保持容器运行,通常与 -t 同时使用,加入 it 这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭.
-t:为容器分配一个伪输入终端,通常与 -i 同时使用。
-d:以守护(后台)模式运行容器。创建一个容器后在后台运行,需要使用 docker exec 进入容器。退出后,容器不会关闭。
-it:创建的容器一般被称为交互式容器,-id 创建的容器一般被称为守护式容器。
--name:为创建的容器名。
例如:docker run -it --name=c1 centos:7.9.2009 /bin/bash
复制代码
进入容器 docker exec 参数 // 进入容器,退出容器后,容器不会关闭
停止容器 docker stop 容器名称/容器id
启动容器 docker start 容器名称/容器id
删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除,可通过 -f 参数强行删除 docker rm 容器名称/容器id
查看容器信息 docker inspect 容器名称/容器id
绑定数据卷 docker run -id --name=c1 -v 宿主主机目录:容器目录 镜像名:版本号
数据卷容器 docker run -id -v 宿主目录 --name=c1 镜像名称:版本号
docker run -id --name=c2 --volumes-from c1 镜像名称:版本号
容器转镜像 docker commit 容器id 生成的镜像名:版本号
生成镜像压缩文件 docker sava -o 压缩文件名称 镜像名称:版本号
安装本地镜像压缩文件 docker load -i 压缩文件名称
通过dockerfile生成镜像 docker build -f dockerfile文件地址 -t 生成的镜像名称:版本号
创建私有仓库 docker pull registry
docker run -id --name=registry -p 5000:5000 registry
打开浏览器:输入http://ip:5000/v2/_catalog
修改daemon.json
vim /etc/docker/daemon.json
["insecure-registries": ["私有仓库服务器ip:5000"]] // 信任
systemctl restart docker // 重启docker服务
注意:window系统可以在docker可视化软件上操作
标记镜像为私有仓库的镜像 docker tag centos:7 私有仓库服务器IP:5000/cento:7
上传标记的镜像 docker push 私有仓库服务器IP:5000/centos:7
下载标记的镜像docker pull 私有仓库服务器IP:5000/centos:7
参考链接:docker run 和 docker exec 的差异
参考链接: Jenkins简介