相同点:都是执行异步请求操作
不同点:
大小 axios体积小 只需在要使用的目录下 npm install axios --saveajax 需要导入jQuery【体积较大 只是为了ajax去引入是不值得的】针对方向 axios 符合前端MVVM的浪潮ajax 本身是针对MVC的编程实现方法与返回值 axios 用promise技术实现对ajax技术的封装 返回值是 promiseajax 基于原生的XHR开发,XHR本身的架构不清晰,已经有了fetch的替代方案对并发请求的封装api简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。
深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。
let a=[0,1,2,3,4], b=a; console.log(a===b); a[0]=1; console.log(a,b);
语义化标签(好处:(1).使代码结构清晰,便于阅读(2)便于SEO (3)无障碍阅读(4)便于后期的维护与开发)
智能表单
html5中提供了多个新的类型的input类型(1.color2.datatime3.data4.tel5.e-mail6.number7.range8.search)
音频(audio)和视频(video)
canvas
svg
地理地位
拖放的API(drag、drop)
web worker
web storage
web socket
let 和 const 命令
类 Class
函数参数默认值
箭头函数
模板字符串
变量的解构赋值
扩展运算符(spread)
模块化 Module
对象属性简写
Promise
for...of
新增各种CSS选择器(:not(.input) 所有class不是“input”的节点)
圆角(border-radius)
多列布局(multi-columnlayout)
阴影和反射(Shadow/Reflect)
文字特效(text-shadow)
文字渲染(Text-decoration)
线性渐变(gradient)
旋转(transform)
缩放,定位,倾斜,动画,多背景
(1)vuex的属性有 5 种,分别是 state、getter、mutation、action、module
state => 基本数据
getters => 从基本数据派生的数据
mutations => 提交更改数据的方法,同步.
actions => 像一个装饰器,包裹mutations,使之可以异步。
modules => 模块化Vuex
(2)vuex 的 store 特性是什么
vuex 就是一个仓库,仓库里放了很多对象。其中 state 就是数据源存放地,对应于一般 vue 对象里面的 data
state 里面存放的数据是响应式的,vue 组件从 store 读取数据,若是 store 中的数据发生改变,依赖这相数据的组件也会发生更新
它通过 mapState 把全局的 state 和 getters 映射到当前组件的 computed 计算属性
(3) vuex 的 getter 特性是什么
getter 可以对 state 进行计算操作,它就是 store 的计算属性
虽然在组件内也可以做计算属性,但是 getters 可以在多给件之间复用
如果一个状态只在一个组件内使用,是可以不用 getters
(4)vuex 的 mutation 特性是什么
action 类似于 muation, 不同在于:action 提交的是 mutation,而不是直接变更状态
action 可以包含任意异步操作
(5)vue 中 ajax 请求代码应该写在组件的methods中还是vuex 的action中
如果请求来的数据不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入 vuex 的 state 里
如果被其他地方复用,请将请求放入 action 里,方便复用,并包装成 promise 返回
(6)不用 vuex 会带来什么问题
可维护性会下降,你要修改数据,你得维护3个地方
可读性下降,因为一个组件里的数据,你根本就看不出来是从哪里来的
增加耦合,大量的上传派发,会让耦合性大大的增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背
vue路由钩子大致可以分为三类:
1.全局钩子(主要包括beforeEach和afte1rEach)
beforeEach函数有三个参数:
to:router即将进入的路由对象from:当前导航即将离开的路由next:Function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的);否则为false,终止导航。afterEach函数不用传next()函数
2.单个路由里面的钩子(主要用于写某个指定路由跳转时需要执行的逻辑)
3.组件路由(主要包括 beforeRouteEnter和beforeRouteUpdate ,beforeRouteLeave,这几个钩子都是写在组件里面也可以传三个参数(to,from,next),作用与前面类似.)
localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存,不参与和服务器的通信。
sessionStorage仅在当前会话下有效,关闭页面或浏览器后被清除。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存,不参与和服务器的通信。源生接口可以接受,亦可再次封装来对Object和Array有更好的支持。
前后端分离:Model用纯JavaScript对象表示,View负责显示。
model:服务器的业务逻辑操作
view:用户界面
ViewModel:核心枢纽
过程:把view和model关联起来的就是View Model。
ViewModel负责把Model的数据同步到view显出来,还负责把view修改同步到Model。
1. 各部分之间的通信,都是双向的。
2. View 与 Model 不发生联系,都通过ViewModel传递。
总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。
创建前/后: 在beforeCreated阶段,vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。在created阶段,vue实例的数据对象data有了,$el还没有。
载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。
更新前/后:当data变化时,会触发beforeUpdate和updated方法。
销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。
对keep-alive的了解
keep-alive是一个抽象组件,它是Vue的内置组件。
keep-alive可以实现组件的缓存,当组件切换时不会对当前组件进行卸载。
常用的属性有:
include:设置会被缓存的组件。exclude:设置不会被缓存的组件。keep-alive相关的生命周期钩子函数:
activated: 进入页面时触发。(常用来实现每次进入页面的时候重新获取最新的数据)deactivated:退出页面时触发。
1、相同点:
三个函数都会改变this的指向(调用这三个函数的函数内部的this)
2、不同点:
1)、bind会产生新的函数,(把对象和函数绑定死后,产生新的函数)
2)、call和apply不会产生新的函数,只是在调用时,绑定一下而已。
3)、call和apply的区别,第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数),call把apply的第二个参数单列出来。
GET产生一个TCP数据包;POST产生两个TCP数据包。
1、url可见性:
get,参数url可见;
post,url参数不可见
2、数据传输上:
get,通过拼接url进行传递参数;
post,通过body体传输参数
3、缓存性:
get请求是可以缓存的
post请求不可以缓存
4、后退页面的反应
get请求页面后退时,不产生影响
post请求页面后退时,会重新提交请求
5、传输数据的大小
get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)
post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
6、安全性
这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的,防君子不防小人就是这个道理。对传递的参数进行加密,其实都一样。
什么是跨域?
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域
如何解决跨域问题?
1、jsonp跨域 JSONP(JSON with Padding:填充式JSON),应用JSON的一种新方法, JSON、JSONP的区别: 1、JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用) 2、JSONP 只支持get请求、不支持post请求 (类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)
2、nginx反向代理: www.baidu.com/index.html需要调用www.sina.com/server.php,可以写一个接口www.baidu.com/server.php,由这个接口在后端去调用www.sina.com/server.php并拿到返回值,然后再返回给index.html 3、PHP端修改header header(‘Access-Control-Allow-Origin:*’);//允许所有来源访问 header(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
4、document.domain
5、window.name
6、postMessage
原型:所有的函数都有一个特殊的属性prototype(原型),prototype属性是一个指针,指向的是一个对象(原型对象),原型对象中的方法和属性都可以被函数的实例所共享。所谓的函数实例是指以函数作为构造函数创建的对象,这些对象实例都可以共享构造函数的原型的方法。
原型链:原型链是用于查找引用类型(对象)的属性,查找属性会沿着原型链依次进行,如果找到该属性会停止搜索并做相应的操作,否则将会沿着原型链依次查找直到结尾。常见的应用是用在创建对象和继承中。
虚拟的DOM的核心思想是:对复杂的文档DOM结构,提供一种方便的工具,进行最小化地DOM操作。
一、相同点
1、 都支持服务器端渲染 2、 都有Virtual DOM(虚拟dom),组件化开发,都有‘props’的概念,这是properties的简写。props在组件中是一个特殊的属性,允许父组件往子组件传送数据,都实现webComponent规范 3 、数据驱动视图 4 、都有支持native的方案,React的React native、Vue的weex 5 、构建工具 React和Vue都有自己的构建工具,你可以使用它快速搭建开发环境。React可以使用Create React App (CRA),而Vue对应的则是vue-cli。两个工具都能让你得到一个根据最佳实践设置的项目模板。都有管理状态,React有redux,Vue有自己的Vuex(自适应vue,量身定做)
二、区别设计思想 react 1 、函数式思想,all in js ,jsx语法,js操控css 2、 单项数据流 3、 setState重新渲染 4 、每当应用的状态被改变时,全部子组件都会重新渲染。当然,这可以通过shouldComponentUpdate这个生命周期方法来进行控制,如果为true继续渲染、false不渲染,但Vue将此视为默认的优化。
vue 1 、响应式思想,也就是基于数据可变的。把html、js、css、组合到一起,也可以通过标签引擎组合到一个页面中 2、 双向绑定,每一个属性都需要建立watch监听(页面不用,涉及到组件更新的话需要) 3、 Vue宣称可以更快地计算出Virtual DOM的差异,这是由于它在渲染过程中,会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树
性能 react ----大型项目 优化需要手动去做,状态可控 vue ------中小型项目 状态改变需要watch监听,数据量太大的话会卡顿
扩展性 react 1、 类式写法api少,更容易结合ts 2、 可以通过高阶组件来扩展 vue 1 、声明式写法,结合ts比较复杂 2 、需要通过mixin方式来扩展
防抖和节流的作用都是防止函数多次调用。区别在于,假设一个用户一直触发这个函数,且每次触发函数的间隔小于wait,防抖的情况下只会调用一次,而节流的 情况会每隔一定时间(参数wait)调用函数。
防抖 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。
节流 高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。
shift:删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined
unshift:将参数添加到原数组开头,并返回数组的长度
pop:删除原数组最后一项,并返回删除元素的值;如果数组为空则返回undefined
push:将参数添加到原数组末尾,并返回数组的长度
concat:返回一个新数组,是将参数添加到原数组中构成的
splice(start,deleteCount,val1,val2,...):从start位置开始删除deleteCount项,并从该位置起插入val1,val2,...
sort(orderfunction):按指定的参数对数组进行排序
join(separator):将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符
1.回流:
当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候,这时候是 一定会发生回流的,因为要构建render tree。
2.重绘:
在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘。
区别: 回流必将引起重绘,而重绘不一定会引起回流。比如:只有颜色改变的时候就只会发生重绘而不会引起回流 当页面布局和几何属性改变时就需要回流 。比如:添加或者删除可见的DOM元素,元素位置改变,元素尺寸改变——边距、填充、边框、宽度和高度,内容改变。
闭包就是能够读取其他函数内部变量的函数。只有函数内部的子函数才能读取局部变量,在本质上,闭包是函数内部和函数外部连接起来的桥梁。
(1)、使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。 (2)、闭包有三个特性: 1、函数嵌套函数 2、函数内部可以引用外部的参数和变量 3、参数和变量不会被垃圾回收机制回收
使用new关键字调用函数(var p=new ClassA( ))的具体步骤:
1. 创建空对象; var p= {};
2. 设置新对象的__proto__属性指向构造函数的prototype对象; p.__proto__ = ClassA.prototype;
3. 使用新对象调用函数,函数中的this被指向新实例对象: ClassA.call(p); //{}.构造函数();
4. 将初始化完毕的新对象地址,保存到等号左边的变量中。使用new关键字调用函数(var p=new ClassA( ))的具体步骤:
1. 创建空对象; var p= {};
2. 设置新对象的__proto__属性指向构造函数的prototype对象; p.__proto__ = ClassA.prototype;
3. 使用新对象调用函数,函数中的this被指向新实例对象: ClassA.call(p); //{}.构造函数();
4. 将初始化完毕的新对象地址,保存到等号左边的变量中。
Sass 和 LESS 都是是 CSS 预处理器,是 CSS 上的一种抽象层,是一种特殊的 语法/语言 最终会编译成 CSS
less 是一种动态样式语言,将 CSS 赋予了动态语言的特性,如变量,继承,运算, 函数.。less 既可以在客户端上运行 (支持 IE 6+, Webkit, Firefox),也可一在服务端运行(需要借助 Node.js)。
不同之处
1、Less环境较Sass简单 Cass的安装需要安装Ruby环境,Less基于JavaScript,是需要引入Less.js来处理代码输出css到浏览器,也可以在开发环节使用Less,然后编译成css文件,直接放在项目中,有less.app、SimpleLess、CodeKit.app这样的工具,也有在线编辑地址。
2、Less使用较Sass简单 LESS 并没有裁剪 CSS 原有的特性,而是在现有 CSS 语法的基础上,为 CSS 加入程序式语言的特性。只要你了解 CSS 基础就可以很容易上手。
3、从功能出发,Sass较Less略强大一些①sass有变量和作用域。
$variable,like php;#{$variable}like ruby;变量有全局和局部之分,并且有优先级。
②sass有函数的概念
@function和@return以及函数参数(还有不定参)可以让你像js开发那样封装你想要的逻辑。@mixin类似function但缺少像function的编程逻辑,更多的是提高css代码段的复用性和模块化,这个用的人也是最多的。ruby提供了非常丰富的内置原生api。③进程控制:
条件:@if @else;循环遍历:@for @each @while继承:@extend引用:@import④数据结构:
$list类型=数组;$map类型=object; 其余的也有string、number、function等类型
4、Less与Sass处理机制不一样 前者是通过客户端处理的,后者是通过服务端处理,相比较之下前者解析会比后者慢一点
5、关于变量在Less和Sass中的唯一区别就是Less用@,Sass用$。
相同之处
Less和Sass在语法上有些共性,比如下面这些:
1、混入(Mixins)——class中的class; 2、参数混入——可以传递参数的class,就像函数一样; 3、嵌套规则——Class中嵌套class,从而减少重复的代码; 4、运算——CSS中用上数学; 5、颜色功能——可以编辑颜色; 6、名字空间(namespace)——分组样式,从而可以被调用; 7、作用域——局部修改样式; 8、JavaScript 赋值——在CSS中使用JavaScript表达式赋值。
尽量减少HTTP请求次数 压缩合并js css精灵 内联图片。src用data:url scheme减少DNS查询使用CDN 网站上静态资源即css、js全都使用cdn分发,图片亦然,因为cdn拥有众多服务器,用户请求可以请求距离他近的服务器,加快速度避免空的src和href为文件头指定Expires(过期时间)或者Cache-Control头部。使用gzip压缩内容(服务端)把CSS放到顶部把JS放到底部避免使用CSS表达式将CSS和JS放到外部文件中可缓存的AJAX异步请求同样的造成用户等待,所以使用ajax请求时,要主动告诉浏览器如果该请求有缓存就去请求缓存内容。如下代码片段, $.ajax({ url: 'url', dataType: "json", cache: true, //如果有缓存请求缓存 success: function(son, status) {} })使用GET来完成AJAX请求 POST方法:首先发送文件头,然后才发送数据减少DOM元素数量不要404。 所以发出http请求但获得没用的响应(如404)是完全不必要的,并且会降低用户体验,这样首先会降低(占用)并行下载数 如果有404状态码 在此页面展示404样式,不是直接跳转到404页面不要在html中缩放图片
选择器的优先级由每一种选择器类型的权重决定。
优先级排序:important > 行内样式 > ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性
1.pc端响应式布局:是指屏幕大小缩放时样式发生相应改变。运用媒体查询@media来设置。 2.移动端响应式布局:是指根据移动端不同设备实现页面正常显示的方案。运用以下三种方案布局:a. 百分比布局。b. flex布局。c. rem布局
.