说明:刚经历过面试不久,之前总是不总结的我,这回总结一下我常常遇到的面试题,留个回忆~
这里只是作个简单的介绍,给本身提个醒,根据面试题延伸出本身须要补哪一块的知识。
下面,开始个人表演html
本地对象和单体内置对象统称为“内置对象”前端
undefined/number/string/boolean/object/functionvue
typeof undefined // undefined typeof 'abc' // string typeof 123 // number typeof true // Boolean typeof {} // object typeof [] // object typeof null // object typeof console.log // function
if (obj.a == null) { // 这里至关于obj.a === null || obj.a === undefined的简写形式 // jquery源码推荐写法 }
除了这个,其余一概使用全等.java
值类型
把数值分块存储在内存中,存储在栈内存中node
引用类型
存储在堆内存,变量只存了变量名和指针(用于找到堆内存的位置)jquery
JSON只不过是一个JS对象,也是一种数据格式webpack
JSON.stringify({a: 10, b: 20}) JSON.parse("{"a": 10, "b": 20}")
数据格式:简单值,对象,数组ios
JSON跟对象字面量的写法很像,JSON属性必须加双引号。git
简单判断:es6
var arr = []; arr instanceof Array // true typeof arr // object。 typeof 是没法判断是不是数组
更准确的判断:
function isArray(value) { return Object.prototype.toString.call(value) === '[object Array]'; } isArray([1, 2, 3]);
function Elem(id) { this.elem = document.getElementById(id) } Elem.prototype.html = function(val) { var elem = this.elem; if (val) { elem.innerHtml = val; return this; // 链式调用 } else { return elem.innerHtml; } } Elem.prototype.on = function(type, fn){ var elem = this.elem; elem.addEventListener(type, fn); return this; } var div1 = new Elem('div1'); div1.html('<p>显示出来了</p>').on('click', function() { console.log('ok'); }).html('<p>kaopu</p>')
变量定义和函数声明(函数表达式)都会被提到前面,即变量提高。
单线程:只有一个线程,同一时间只能作一件事,两段JS不能同时执行
缘由:避免DOM渲染的冲突
解决方案:异步算是一种“无奈”的解决方案,虽然有不少问题
异步是单线程的解决方案
避免DOM渲染的冲突:
异步存在的两个问题:
实现方式:event loop
使用异步的场景
总结当前异步的解决方案
同步和异步的区别
同步会阻塞代码执行,而异步不会
alert是同步,setTimeout是异步
property只是一个js对象的属性修改,它们会在初始化的时候再DOM对象上建立。
Attribute是对html标签属性的修改,attributes是属于property的一个子集。
cookie: 自己用于客户端和服务器端通讯,可是它有本地存储的功能,因而就被“借用”,使用document.cookie = … 获取和修改便可。
缺点:存储量过小,只有4kb,全部http请求都带着,会影响获取资源的效率,API简单,须要封装才能用。
sessionStorage, localStorage:HTML5专门为存储而设计,最大容量5M,API简单易用: localStorage.setItem(key, value) localStorage.getItem(key)
localStorage在IOS safari隐藏模式下,localStorage.getItem会报错
sessionStorage关闭浏览器后数据也会跟着清掉,而localStorage不会。
区别:容量,是否会携带到ajax中,API易用性
${}
首先从名字来看,MVVM即Model, View ViewModel,Model对应的是data数据部分,View对应的是html视图部分,ViewModel对应的是new Vue实例部分,View经过事件绑定的方式影响到Model,Model经过数据绑定影响到View。
对ViewModel的理解:链接器,用于链接View和Model
MVVM不是一个从零开始的创新,是由以前的MVC发展过来的,由于MVC是应用到后端的,并非前端的,为了适用前端的场景,把C换成了VM
MVVM实现的三要素也是vue的三要素:
方法一: let arr = [6, 8, 9, 9, 12, 13, 14, 1, 3]; function removeArr(arr) { let arrayResult = []; for (let i = 0, len = arr.length; i < len; i++) { if (arrayResult.indexOf(arr[i]) === -1) { arrayResult.push(arr[i]); } } return arrayResult; } removeArr(arr);
方法二: var arr = [6, 8, 9, 9, 12, 13, 14, 1, 3]; function removeArr(arr) { var i = 0, len = arr.length, j; for (i; i < len; i++) { for (j= i+1; j < len; j++) { if(arr[i] == arr[j]) { arr.splice(j, 1); j--; } } } return arr; } removeArr(arr);
方法三: let arr = [6, 8, 9, 9, 12, 13, 14, 1, 3]; function removeArr(arr) { return Array.from(new Set(arr)) } removeArr(arr);
方法四: let arr = [6, 8, 9, 9, 12, 13, 14, 1, 3]; function removeArr(arr) { let arrayResult = []; arr.reduce((s1, s2) => { if(s1 !== s2) { arrayResult.push(s1); } return s2 }); arrayResult.push(arr[arr.length-1]) return arrayResult; } removeArr(arr);
fetch:
号称是AJAX的替代品.。
优点:
缺点:
beforeCreate和created在vue实例化的时候就执行了,此处可请求数据,可是不能进行dom操做,由于拿不到组件对应的dom节点,以下图。
给实例赋值最先要在created里面操做。
beforeMount和mounted这里是把组件生成的html内容挂在到dom上面的一个过程,若是不指定el或者是$mount()的话,数据是不会挂在到页面上的,由于它不知道该挂载到哪里去。因此dom应该在mounted这里才去操做。
beforeMount()是渲染前的,mounted()是经过render函数渲染后拿到的,mounted以后实例就建立完成了.
说明:上述4个钩子都是只会被调用一次。beforeMount和mounted在服务端渲染的时候不会被调用。服务端渲染的时候会调用的只有beforeCreate和created。
在.vue文件里开发的过程当中,是都没有template的,在.vue里面写的template都通过vue-loader处理直接变成了render函数放在vue-loader解析过的文件里面。
beforeUpdate和updated是有数据更新的时候才会去执行的。
beforeDestroy和destroyed组件被销毁的时候才会去执行。
$destroy() // 组件销毁的一个方法,解除全部的事件监听和全部的watch。
activated和deactivated和keep-alive有关系,该钩子在服务器端渲染期间不被调用。activated是在keep-alive 组件激活时调用。
deactivated在keep-alive 组件停用时调用。
render(h)和renderError(),有render的时候就不须要template了,由于template处理后最终也是变成render函数的返回vnode的,renderError是在render报错以后才会触发,报错以后渲染出来的就是报错的信息,只有在本组件的render函数出现错误的时候才会被调用,只关心本身有没有渲染成功,无论子组件。
errorCaptured() 正式环境可使用,收集线上环境的一些错误。全部子组件的错误均可以捕捉到,除非子组件把冒泡事件中止掉。