1.es6的性特性有哪些?
ES6的性特性有:
1).模板字符串``:可以将字符串中存在的变量动态替换,比如
var uname=document.getElementById("uname"); btn.onclick=()=>{ var str=`uname=${uname.value}`;//这里将uname的属性值动态填入${}中 console.log(str) }
``中可以执行js语句,但不能执行结构性程序(for,switch等);模板字符串中的语句可以支持换行。
2).let声明元素:用于形成块级作用域,净化作用域:在一个块级作用域内,let 声明 的变量只会在该区域内存续,否则会报错;let声明的变量不存放在Window中,极好地避免的污染;变量名只有声明后才可以使用,避免了声明提前的问题,提高代码的可读性。
可以使用for+let形成闭包
1 //0,1,2,3,4 setTimeout执行一次调用一次for存储的i 2 for(let i=0;i<5;i++){ 3 setTimeout(()=>{ 4 console.log(i) 5 },100) 6 } 7 8 //5,5,5,5,5,主程序执行完,跳出循环,再执行setTimeout函数体,此时j已经累加到5 9 for(var j=0;j<5;j++){ 10 setTimeout(()=>{ 11 console.log(j) 12 },100) 13 }
3).数组新增的API(forEach/map/reduce/filter)、
4).箭头函数:箭头函数的内外this指向相同;箭头函数解决了函数的声明提前问题
var fun=()=>{ ...函数体 } //在程序执行过程中,js将fun当作变量提前,而函数的赋值还在原本的位置。解决了函数的声明提前问题; function fun(){ ...函数体 } //函数的声明提前是将函数整个提前
5).Promise:Promise是一种解决回调地狱的问题的构造函数,可以通过Promise传递Promise对象函数将异步操作队列化,有resolve(成功执行前者才能执行后者)和reject(前者执行发生错误用,执行reject中的函数体)两个参数。比如在发送ajax请求(异步操作)时,页面同时在渲染,页面数据需要从后台获取通过ajax返回,这时候就要等待ajax请求拿到数据才能去渲染页面。
前者Promise执行完毕,执行.then紧邻的Promise函数,形成链式调用。
在ES6中的错误捕捉是:在执行完Promise链的最后,加.catch()捕捉其中出错的环节抛出的错误;
在ES7中彻底摆脱了嵌套的问题:try{Promise函数调用链}catch(err){...}
6).解构:ES6允许按照某种模式,提取出数组或对象中的值,为变量赋值
var user={uname:"tom",age:16,gender:"男"}; let {uname,age,gender}=user; //这样就同时声明了uname,age,gender3个变量,在不使用let/var/const声明时,要写成({uname,age,gender}=user)
7).for...of:for..of是ES6新增的位遍历对象的API,当遍历的对象不要求顺序/步长,只与属性有关时使用for...of、
8).剩余参数问题...:
①在函数中参数个数不确定的时候,为使函数仍然顺利执行,可以用...数组将其中的参数收集起来存起来。
类似于arguments,但是arguments是类数组对象,无法使用数组的API,而使用...arr(arr是函数作用于中可以使用的存放参数的数组)之后,可以使用数组API操作其中的参数;
在只有部分参数起作用,与其匹配形参后,多余的参数会被收集
function fn(...arr){ console.log(arr) } fn(1,2,4,9)//[1, 2, 4, 9]
②...可以用来拼接数组或者对象
var user={uname:"tom",age:16,gender:"男"}; var user1={city:"北京",tall:180}; var tom={...user,...user1}; //{uname: "tom", age: 16, gender: "男", city: "北京", tall: 180}
9).用class创建并管理管理类
class Father{ constructor(name,age) { this.name=name; this.age=age; //constructor存放构造函数的属性 } //构造函数的方法直接写 如↓ fn(){ console.log(this.name,this.age) } } var hmm=new Father("hanmeimei",12); hmm.fn()
class Child extends Father{ constructor(name,age,grade){ super(name,age); //super表示其中的属性继承方法与父类型方法一致;需要注意的是,子类型继承自父类型的属性还是要写在constructor里面 this.grade=grade; } intro(){ console.log(`I'm ${this.name} and ${this.grade} years old`) } } var ll=new Child("lilei",23,10); ll.intro(); //这里的ll可以用自己class中的方法,也可以使用来自父类型中fn方法
2.this的用法
1).构造函数中的this指向新创建实例中的对象;
2).函数执行时,指向函数的作用域对象(存在),若不存在该对象,this会从函数内部向外扩展
3).用apply,bind,call时,可以改变this所指
4).调用函数时,this指向window
3.vue的生命周期
create(beforeCreate/created):Vue实例初始化前、后(data创建出来了),此阶段不能获得DOM元素
mount(beforeMount/mounted):DOM树加载前、后,可以在mounted中发送异步请求
update(beforeUpdate/updated):更新前、后,页面数据发生变化
destroy(beforeDestroy/destroyed):组件销毁前、后,定时器没在组件销毁后销毁会造成内存泄漏
4.MVVM简述
M:数据模型 V:视图 VM:视图模型
简单来说,就是用vm将前后台数据变化进行同步。
MVVM的绑定原理有:(1).响应系统:将vue实例中有变化的数据存放在data属性中,并未其创建get/set访问器属性
(2).虚拟DOM树:将vue实例上的数据添加到一个虚拟DOM树上,当前台或后台数据有发生变化的时候,利用封装的DOM操作,将其中变化的部分同步到后台/前台。虚拟DOM树极好地提高了页面的执行效率,因为这里只存储变化的部分,静态的数据不在此列,因而查找速度较快
5.前端的优化
1).能用css实现的,优先用css,否则用js
2).查找的优化:getElementByXXX和querySelector的差别:getElementByXXX查找的是动态的集合,首次查找效率高,但不实际存储对象和属性值,再次用到会反复查找DOM树;querySelector是在第一次查找的时候就将查找的结果存起来了,这就导致了首次查找效率较低;当查找条件比较复杂时,优先使用querySelector.
3).对页面的修改,能用一句话解决的就尽量一句话解决,避免重排重绘,减少操作DOM树的次数
4).尽量减少事件监听的个数,利用冒泡的原理(事件模型包括:捕获、触发、冒泡;从最外层开始向内逐级记录每级父元素绑定的事件,但不触发,当某级元素事件被触发时,会从当前向外层逐级触发父元素上的事件,这就是冒泡原理)。
5).将页面需要显示的图片进行处理,使其在不改变分辨率的情况下占用更少的内存。
6.ES6中Promise的用法
Promise是一个构造函数用来解决回调地狱的问题,将函数执行的顺序规范化,构造函数接收一个函数形式的参数。当前面的Promise函数执行成功后,才执行.then后面紧跟的Promise函数。函数在执行到某一步失败后会直接执行.catch中错误捕捉的函数。
优点:进行一些互相有依赖的异步操作,将嵌套执行的函数体变的扁平可读.
在es7中,解决了函数嵌套执行的问题,使用async和await的格式来进行执行
7.小程序的生命周期
小程序的生命周期有:①onLoad(options)页面加载,options中存放前一组件传过来的数据项 ② onReady()页面初次渲染完成 ③onShow()页面显示 ④onHide()页面隐藏 ⑤onUnload()页面卸载
8.vue常见指令
v-show,v-if:控制一个元素的显示和隐藏,v-show利用css控制,v-if通过操作DOM树来控制显示和隐藏;
v-once:只在首次加载该组件的时候渲染一次,比如获取用户当天登录的时间,这个时间只有一次(以后登入的时候才会有一次)
v-model:通常用于对input等表单元素进行数据绑定,做到前后数据同步
v-bind:绑定元素的属性或方法,属性可以写成:属性,方法:@操作=""
v-cloak:斗篷-配合display:none,使用,解决在数据渲染过程中出现的用{{}}包裹的数据短暂出现{{}}的尴尬情况
v-text:与v-cloak应用场景相同,不适用display:none;来控制,与其不同的是,cloak是变量所在的整个元素会在数据加载后同时显示,v-text只有变化的不会在加载完成时显示,与其在一起的其他文字正常显示
v-html:操控显示一段html语句的内容
9.HTML5新增标签
1)、结构标签
h5新增了很多语义化标签,在原本布局只有div的情况下,出现了section/aside/header/footer/nav等具有可读性的布局标签:
(1)section:独立内容区块,可以用h1~h6组成大纲,表示文档结构,也可以有章节、页眉、页脚或页眉的其他部分;
(2)article:特殊独立区块,表示这篇页眉中的核心内容;
(3)aside:标签内容之外与标签内容相关的辅助信息;
(4)header:某个区块的头部信息/标题;
(5)hgroup:头部信息/标题的补充内容;
(6)footer:底部信息;
(7)nav:导航条部分信息
(8)figure:独立的单元,例如某个有图片与内容的新闻块。
2)、表单标签
表单元素中type添加了不同的属性值,对于需要的数据属性有了简单的验证功能,但是具体的数据合法性还是要进行判断
(1)email:必须输入邮件;
(2)url:必须输入url地址;
(3)number:必须输入数值;
(4)range:必须输入一定范围内的数值;
(5)Date Pickers:日期选择器;
a.date:选取日、月、年
b.month:选取月、年
c.week:选取周和年
d.time:选取时间(小时和分钟)
e.datetime:选取时间、日、月、年(UTC时间)
f.datetime-local:选取时间、日、月、年(本地时间)
(6)search:搜索常规的文本域;
(7)color:颜色
3)、媒体标签
(1)video:视频
(2)audio:音频
(3)embed:嵌入内容(包括各种媒体),Midi、Wav、AU、MP3、Flash、AIFF等。
4)、其他功能标签
(1)mark:标注(像荧光笔做笔记)
(2)progress:进度条;<progress max="最大进度条的值" value="当前进度条的值">
(3)time:数据标签,给搜索引擎使用;发布日期<time datetime="2014-12-25T09:00">9:00</time>更新日期<time datetime="2020- 01-23T04:00" pubdate>4:00</time>
(4)ruby和rt:对某一个字进行注释;<ruby><rt>注释内容</rt><rp>浏览器不支持时如何显示</rp></ruby>
(5)wbr:软换行,页面宽度到需要换行时换行;
(6)canvas:使用JS代码做内容进行图像绘制;
(7)command:按钮;
(8)deteils :展开菜单;
(9)dateilst:文本域下拉提示;
(10)keygen:加密;
10.v-for中的:key的作用是什么
v-for是快速生成一系列结构相同的vue指令,为其中元素添加:key是为了能在数据发生变化时,快速找到该元素并执行DOM操作,如果不加:key,则在数据发生变化时,重新在vue实例中查找该对象,效率较低。
11.跨域问题
实现跨域有3中方案:Cors跨域、jsonP跨域和后台代理
cors跨域是在后台引入cors模块将前端支持的域名地址更换添加进去,即可对支持的地址域名访问实现跨域
JSONP实现跨域请求的原理简单的说,就是动态创建<script>
标签,然后利用<script>
的src 不受同源策略约束来跨域获取数据。
12.cookie中的内容是否会存储在磁盘中?cookie和storage的适用场景
当cookie设置了过期时间失效后,会存在磁盘中;当当前会话结束时,会将其存放在内存中
浏览器通过http协议与服务器端进行cookie交互(cookie记录客户与服务器端的交互信息)
存储大小:cookie<storage
数据有效期:session在当前窗口关闭前有效;local存放在本地,始终有效,可以手动删除;在设置cookie的有效期前都是有效的,即使关闭窗口。
作用域:session不在不同浏览器功效内容,即使是一个页面;而local和cookie在所有同源窗口都是共享的;
web storage支持事件通知机制,可以将发生变化的数据更新给监听者;cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。
cookie存放在浏览器(客户端)session存放在服务器磁盘
cookie一般是用来存储身份验证信息或者id;
通常把一些通用的、频繁存取的、小数据量的跟用户相关的数据放入SEESION,如登录状态,用户身份信息,个性配置与权限列表还有通用数据(购物车信息之类的)
13.前后联调的问题
参数(前端作为主导,因为前端需要渲染页面,必须得先约定数据格式,避免重复让后端改格式影响后端开发效率,也同时避免影响整个项目的开发效率。),约定参数格式,比如:为某个帖子点赞的用户收集其id集合需要存放在数组中返回给前台,这样可以让后台形成自己管理格式的习惯,也方便数据取用
模版语言用的不熟的问题,velocity、handlebars、underscore等
14.js中异步操作有哪些
1).定时器都是异步操作 2).ajax请求 3).vuex中actions是异步操作方法