记录一些面试问题或有趣的问题+解答

1.有一个长度为100的数组,用优雅的方式求出改数组的前10个值之和
一般情况,for循环会用的比较多:

let sum = 0
for(let i = 0; i < 10; i++){
   	sum += arr[i]
}

但感觉不够优雅,于是:

let res = arr.slice(0,10).reduce((a,b) => a + b,0)

两者都能实现想要的效果,后面一行代码搞定,够优雅了

2.编写一个函数将[3,5,7,2,3,1,5,8]数组中重复的元素去掉
let arr = [3,5,7,2,3,1,5,8]
Set为ES6新增的一个对象,允许存储任何类型(原始值或引用值)的唯一值

function repeat(arr) {
	return Array.from(new Set(arr))
}

使用双重for循环,再利用数组的splice方法去重

function repeat(arr){
	for(let i = 0; i < arr.length; i++){
       	for(let j = i + 1; j < arr.length; j++){
         	if(arr[i] === arr[j]){
           		arr.splice(j,1);
           		j--;	//每删除一个数j的值就减1
         	}
		}
	}
 	return arr;
 },

利用数组的indexOf方法去重

function repeat(arr){
	let arr1 = []
	for(let i = 0; i < arr.length; i++){
		if(arr1.indexOf(arr[i]) === -1){
			arr1.push(arr[i])
		}
	}
	return arr1;
},

利用reduce方法去重

let newArr = arr.reduce((pre,cur)=>{
    if(!pre.includes(cur)){
      return pre.concat(cur)
    }else{
      return pre
    }
},[])

3.公鸡5元一只,母鸡4元一只,小鸡1元3只,要求:百元百只,问:公鸡、母鸡、小鸡各多少只

//第一层,表示公鸡的范围,100元最多20只
for(let x = 0; x <= 20; x++){
  	//第一层,表示母鸡的范围
    for(let y = 0; y <= 25; y++){
        // 小鸡的变量
       	let z = 100 - x - y
        // 判断三鸡一共100只,小鸡为整数,z%3取余为0 同时成立
        if(z%3 == 0 && (5*x + 4*y + z/3 == 100)){
        	console.log(x,y,z)
       	}
	}
}

4.简要描述margin重复问题,及解决方式
描述:连个相邻盒子垂直方向上的margin会发生重叠,取较大的值,而不是相加。
解决:1.父级设置padding代替margin;2.父级设置overflow:hidden;3.当前元素设置透明边框;4.样式使用绝对定位;5使用浮动或者设置成行内块;6给内边距。

5.vue-router两种模式的区别
hash模式:#后面hash值的变化,并不会导致浏览器像服务器发出请求,浏览器不发出请求,就不会刷新页面。每次hash值的变化,会触发hashchange这个事件,通过这个事件可以知道hash值发生的变化,可以监听hashchange来实现更新页面部分内容的操作:
hash模式的背后原理是onhashchange事件,可以再window对象上监听这个事件:

window.onhashchange = function(event){
    console.log(event.oldURL, event.newURL);
    let hash = location.hash.slice(1);
    document.body.style.color = hash;
 
}

history模式:因为html5标准发布,多了两个api,pushState()replaceState()。通过这连个api(1)可以改变url地址且不会发送请求,(2)不仅可以读取历史记录栈,还可以对浏览器历史栈进行修改。

$router与 $route的区别

1.$route从当前router跳转对象里面可以获取name,path,query,params等(传的参数由this. r o u t e . q u e r y 或 者 t h i s . route.query或者this. route.querythis.route.params接收)
2.$router为VueRouter实例。想要导航到不同URL,使用 $router.push()方法;返回上一个history也是使用 $router.go()方法

6.vue生命周期有哪些?作用是什么?
生命周期:Vue实例从开始创建、初始化数据、编译模板、挂载Dom和渲染、卸载等一系列过程,这是Vue的生命周期。
八个钩子函数
1.beforeCreate() 创建前在new一个vue实例后,只有一些默认的生命周期猴子和默认事件,其他的东西都还没有创建,再次生命周期执行的时候,data和methods中的数据还没有初始化,不能再这个阶段使用data中的数据和methods中的方法;
2.created() 被创建 data和methods都已经被初始化好了,可以调用;
3.beforeMount() 挂载前 在内存中已经编译好了模板,但还没有挂载到页面中,此时,页面还是旧的;
4.mounted() 已挂载 Vue实例已经初始化完成,此时组件脱离了创建阶段,进入到运行阶段。如果想要通过插件操作页面上的DOM节点,最早可以再和这个阶段中进行;
5.beforeupdate() 更新前 页面中的显示的数据还是旧的,data中的数据是更新后的,页面还没有和最新的数据保持同步;
6.updated() 更新 页面显示的数据和data中的数据已经保持同步了;
7.beforeDestroy() 销毁前 Vue实例从运行阶段进入到了销毁阶段,这个时候所有的data和methods,指令,过滤器…都是处于可用状态,还没有真正被销毁;
8.destroy() 被销毁 这个时候所有的data和methods,指令,过滤器…都是处于不可用状态,组件已经被销毁了。
vue生命周期的作用
它的生命周期中有多个事件钩子,在控制整个vue实例的过程时更容易形成好的逻辑。
created和mounted的区别
created:在模板渲染成html前调用,即通常初始化某些属性值,然后在渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。

7.es6方法过滤掉两个数组中对象id值相等的项

let arr1=[{id:1,name:'张三'},{id:2,name:'李四'}] 
let arr2=[{id:1,name:'王五'},{id:3,name:'赵六'},{id:4,name:'钱七'},{id:5,name:'吴八'},] 
let add=arr2.filter(item=>!arr1.some(v=>v.id===v.id)) 
console.log(add)

后续遇到比较有趣题,再补充

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值