数组的交并集 日期正则 闭包 垂直居中几种方法 性能优化 安全攻击 简单实现一个promise vue指令 es6 原型链 状态管理
1.数组的交并集:现有两数组a = [1, 2, 3]
,b = [2, 4, 5]
,求a,b数组的并集,交集和差集。
// 并集 let union = a.concat(b.filter(v => !a.includes(v))) // [1,2,3,4,5] // 交集 let intersection = a.filter(v => b.includes(v)) // [2] // 差集 let difference = a.concat(b).filter(v => a.includes(v) && !b.includes(v)) // [1,3]
2.日期正则:
var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/; varregExp =newRegExp(reg); if(!regExp.test(value)){ alert("日期格式不正确,正确格式为:2014-01-01"); return; }
3.闭包
// 始用ES6实现 for (let i = 1; i <= 5; i++) { setTimeout( function timer() { console.log(i); }, 1000 ); } // 始用ES5实现 for (var i = 1; i <= 5; i++) { (function(i){ setTimeout( function timer() { console.log(i); }, 1000 ); })(i); }
4.垂直居中的几种方法:
/*考虑兼容性*/ parentElement{ position:relative; } childElement{ position: absolute; top: 50%; transform: translateY(-50%); } parentElement{ position:relative; } childElement{ position: absolute; top:0;left:0;right:0;bottom:0; margin:auto; } /*不考虑兼容性*/ parentElement{ display:flex;/*Flex布局*/ display: -webkit-flex; /* Safari */ align-items:center;/*指定垂直居中*/ }
5.前端性能优化
参考博客:http://fex.baidu.com/blog/2014/03/fis-optimize/
6.如何防止安全攻击
从以上的反射型和DOM XSS攻击可以看出,我们不能原样的将用户输入的数据直接存到服务器,需要对数据进行一些处理。以上的代码出现的一些问题如下
解决办法:
对cookie的保护
document.cookie
读取cookie。服务端可以设置此字段。对用户输入数据的处理
7.实现一个简单的Promise:
function Promise(fn){ var state = 'pending'; var doneList = []; var failList= []; this.then = function(done ,fail){ switch(state){ case "pending": doneList.push(done); failList.push(fail || null); return this; break; case 'fulfilled': done(); return this; break; case 'rejected': fail(); return this; break; } } function resolve(newValue){ state = "fulfilled"; setTimeout(function(){ var value = newValue; for (var i = 0;i<doneList.length;i++){ var temp = doneList[i](value); if(temp instanceof Promise){ var newP = temp; for(i++;i<doneList.length;i++){ newP.then(doneList[i],failList[i]); } }else{ value = temp; } } },0); } function reject(newValue){ state = "rejected"; setTimeout(function(){ var value = newValue; var tempRe = failList[0](value); //如果reject里面传入了一个promise,那么执行完此次的fail之后,将剩余的done和fail传入新的promise中 if(tempRe instanceof Promise){ var newP = tempRe; for(i=1;i<doneList.length;i++){ newP.then(doneList[i],failList[i]); } }else{ //如果不是promise,执行完当前的fail之后,继续执行doneList value = tempRe; doneList.shift(); failList.shift(); resolve(value); } },0); } fn(resolve,reject); }
8.vue指令
v-once:v-once关联的实例,只会渲染一次。之后的重新渲染,实例极其所有的子节点将被视为静态内容跳过,这可以用于优化更新性能。
v-text:v-text主要用来更新textContent,可以等同于JS的text属性。
v-html:双大括号的方式会将数据解释为纯文本,而非HTML。为了输出真正的HTML,可以用v-html指令。它等同于JS的innerHtml属性。
v-pre:v-pre主要用来跳过这个元素和它的子元素编译过程。可以用来显示原始的Mustache标签。跳过大量没有指令的节点加快编译
v-cloak:这个指令是用来保持在元素上直到关联实例结束时进行编译。
v-once:v-once关联的实例,只会渲染一次。之后的重新渲染,实例极其所有的子节点将被视为静态内容跳过,这可以用于优化更新性能。
v-if:v-if可以实现条件渲染,Vue会根据表达式的值的真假条件来渲染元素。
v-else:v-else是搭配v-if使用的,它必须紧跟在v-if或者v-else-if后面,否则不起作用。
v-else-if:v-else-if充当v-if的else-if块,可以链式的使用多次。可以更加方便的实现switch语句。
v-show:也是用于根据条件展示元素。和v-if不同的是,如果v-if的值是false,则这个元素被销毁,不在dom中。但是v-show的元素会始终被渲染并保存在dom中,它只是简单的切换css的dispaly属性。
注意:v-if有更高的切换开销
v-show有更高的初始渲染开销。
因此,如果要非常频繁的切换,则使用v-show较好;如果在运行时条件不太可能改变,则v-if较好
v-for:用v-for指令根据遍历数组来进行渲染
注意:当v-for和v-if同处于一个节点时,v-for的优先级比v-if更高。这意味着v-if将运行在每个v-for循环中
v-bind:v-bind用来动态的绑定一个或者多个特性。没有参数时,可以绑定到一个包含键值对的对象。常用于动态绑定class和style。以及href等。
简写为一个冒号【 :】
v-model:这个指令用于在表单上创建双向数据绑定。
v-model会忽略所有表单元素的value、checked、selected特性的初始值。因为它选择Vue实例数据做为具体的值。
v-on:v-on主要用来监听dom事件,以便执行一些代码块。表达式可以是一个方法名。
简写为:【 @ 】
事件修饰符
.stop
阻止事件继续传播.prevent
事件不再重载页面.capture
使用事件捕获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理.self
只当在 event.target 是当前元素自身时触发处理函数.once
事件将只会触发一次.passive
告诉浏览器你不想阻止事件的默认行为9.es6新特性
箭头操作符 类的支持 字符串模板 解构赋值 参数默认值 let和const for of值遍历 symbols基本类型(键) promises
10.原型链
所有引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除‘null’以外)
所有引用类型(数组、对象、函数),都具一个_proto_ (隐式原型)属性,属性值是一个普通对象
所有函数,都有一个prototype(显式原型)属性,属性值也是一个普通对象
所有引用类型(数组、对象、函数),_proto_ (隐式原型)属性值指向它的构造函数的prototype(显式原型)属性值
当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的_proto_ (即它的构造函数的prototype)中寻找
11.状态管理:
1、state
state为单一状态树,在state中需要定义我们所需要管理的数组、对象、字符串等等,只有在这里定义了,在vue.js的组件中才能获取你定义的这个对象的状态。
2、getter
getter有点类似vue.js的计算属性,当我们需要从store的state中派生出一些状态,那么我们就需要使用getter,getter会接收state作为第一个参数,而且getter的返回值会根据它的依赖被缓存起来,只有getter中的依赖值(state中的某个需要派生状态的值)发生改变的时候才会被重新计算。
3、mutation
更改store中state状态的唯一方法就是提交mutation,就很类似事件。每个mutation都有一个字符串类型的事件类型和一个回调函数,我们需要改变state的值就要在回调函数中改变。我们要执行这个回调函数,那么我们需要执行一个相应的调用方法:store.commit。
4、action
action可以提交mutation,在action中可以执行store.commit,而且action中可以有任何的异步操作。在页面中如果我们要嗲用这个action,则需要执行store.dispatch
5、module
module其实只是解决了当state中很复杂臃肿的时候,module可以将store分割成模块,每个模块中拥有自己的state、mutation、action和getter。