一、 谈谈对弹性盒子的理解及使用场景
答:弹性盒子是一种可自由适配屏幕宽度的布局,能够快速实现子元素水平居中、垂直居中等各种常见的布局。其样式的声明分成老弹性盒子display:box;和新弹性盒子display:flex;使用场景一般多用在移动端,因为PC端和响应式的项目经常会考虑兼容性,特别是低版本的ie,而弹性盒子只兼容到ie9。
二、 谈谈对bfc的理解
答:Bfc:block formatting context,块级格式化上下文。在书写盒模型的样式时,经常会遇到一些bug,例如父盒子的上外边距会和子元素的上外边距产生重叠,而这时为了解决这些问题,就需要触发bfc,让每一个元素都独立起来,不会进行相互影响,所以会在其中一个元素上写float:left/right; position:absolute/fixed;等样式来触发bfc。
三、 谈谈对闭包的理解并写一个实例
答:一句话解释就是内部函数访问外部函数的局部变量。一般闭包都会带有return。例如:有三个按钮,点击每一个按钮都能弹出各自的下标
var oBtns = document.getElementsByClassName('btn'); for(var i = 0; i < oBtns.length; i++){ oBtns[i].onclick = (function (index) { return function () { console.log(index) } })(i)}
四、 编写一个函数mul,要求符合以下条件
Console.log(mul(2)(3)(4)); //24 Console.log(mul(4)(3)(4)); //48
答:由传递的实参和输出结果很容易推出mul主要是对实参进行乘法运算的。而这种传参的方式扩展性不是很好,如果实参数量更多或者更少的话,很有可能需要重新编写代码块,所以我的实现方法如下:
function mul() { var arg = arguments; var result = 1; for(var i = 0; i < arg.length; i++){ result *= arg[i]; } return result; } 调用时:Console.log(mul(2,3,4)); // 24
当然如果非要按照原题所做,应当如下:
function mul(a) { return function (b) { return function (c) { return a*b*c } } }
五、 说说以下代码的结果和理由
Console.log(0.1+0.2)
Console.log(0.1+0.2==0.3)
答:0.300000……04,因为数字类型进行计算时都是先把十进制数转换成二进制数后在计算的,转换后存在精度问题
False,因为两个等号只判断值是否相等,而上例的结果很显然不等于0.3
六、 谈谈vue的生命周期
beforeCreate创建前 created创建完成
beforeMounte挂载前 mounted挂载完成
beforUpdate更新前 updated更新完成
beforeDestroy销毁前 destroyed销毁完成
七、 谈谈vue的页面通信和组件通信的方法
页面通信:
方法一:url后面?拼接参数,另一个页面截取字符串
方法二:$router后面拼接参数,另一个页面$route接收
方法三:storage本地存储setItem,另一个页面getItem
方法四:vuex管理数据,watch监听数据的变化
组件通信:
父传子:props,子传父:$emit,子传子:eventBus或者vuex
八、 谈谈对小程序的理解
小程序是一种MVVM框架,其数据驱动是属于异步的双线程模型,其中一个线程专门用于操作dom节点,而另一个线程则放到一个相对安全的沙箱环境下运行,专门处理一些数据操作,这样既保障了数据的安全,也提高了网页的性能。由于小程序的宿主环境并不是浏览器,所以没有window和document对象
九、 小程序是如何进行页面和组件通信的
页面通信:
方法一:url后面?拼接参数,另一个页面截取参数
方法二:wx.setStorage设置参数,另一个页面wx.getStorage获取
方法三:数据存到全局globalData,另一个页面getApp
方法四:页面跳转的几个api后面拼接参数,另一个页面onload函数的形参中直接获取
组件通信:
父传子:组件上绑定子的属性
子传父:子里写triggerEvent绑定父的方法,
或者父里写selectComponent选中子的引用
子传子:eventBus或者子传公共父,再由父传给另一个子