前端面试题

Vue 的父组件和子组件生命周期钩子执行顺序是什么?

加载渲染过程
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
子组件更新过程
父beforeUpdate->子beforeUpdate->子updated->父updated
父组件更新过程
父beforeUpdate->父updated
销毁过程
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

问题:在 Vue 中,子组件为何不可以修改父组件传递的 Prop?

原因很简单,一个父组件下不只一个子组件。
同样,使用这份 prop 数据的也不只一个子组件。
如果每个子组件都能修改 prop 的话,将会导致修改数据的源头不止一处。

所以我们需要将修改数据的源头统一为父组件,子组件想要修改 prop 只能统一交给父组件去修改,从而保证数据源唯一

3.vue 如何优化首页的加载速度?vue 首页白屏是什么问题引起的?如何解决呢?

首页白屏的原因:
单页面应用的 html 是靠 js 生成,需要将所有需要的资源都下载到浏览器端并解析

解决办法:

优化 webpack 减少模块打包体积,code-split 按需加载
服务端渲染,在服务端事先拼装好首页所需的 html
首页加 loading 或 骨架屏 (仅仅是优化体验)
使用Quicklink,在网速好的时候 可以帮助你预加载页面资源
合理使用web worker优化一些计算
缓存一定要使用,但是请注意合理使用

4.如何用 css 或 js 实现多行文本溢出省略效果,考虑兼容性?

/**单行:*/
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
/**多行:*/
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3; //行数
overflow: hidden;
/** 兼容:*/
p { 
	position: relative;
	line-height: 20px;
	max-height: 40px;
	overflow: hidden;
}
p::after {
	content: "...";
	position: absolute;
	bottom: 0;
	right: 0;
	padding-left: 40px;
	background: -webkit-linear-gradient(left, transparent, #fff 55%);
	background: -o-linear-gradient(right, transparent, #fff 55%);
	background: -moz-linear-gradient(right, transparent, #fff 55%);
	background: linear-gradient(to right, transparent, #fff 55%);
}

5.ReferenceError和TypeError有什么区别?

// 指的是引用出错,比如尝试访问未定义的变量,或者提前访问无提升的变量,都会引发这个错误
console.log(foo);  // ReferenceError: foo is not defined
let foo = 1;

// TypeError 指的是类型出错。

// 众所周知JavaScript是一个弱类型的语言,这既是它的优点,也经常被人诟病。你永远也不知道 // a + b 是在做数值加减还是字符串拼接,而且似乎 a + b 几乎从来也不会报错。

// 为了规范和强调类型这一概念,避免过于模糊类型这一概念导致JavaScript对于语义的不确定性。

Symbol() + 1; // TypeError: Cannot convert a Symbol value to a number

({ toString: () =>({}) }) + 'a';  // TypeError: Cannot convert object to primitive value
// 这样使得JavaScript更为规范,当一个方法的参数需要一个 number 但却收到了一个 object,与其让它返回 NaN,不如果断地抛出 TypeError 吧

6.js中如何判断一个对象是否为空?

// 1. 可以使用 JSON.stringify() 方法判断
var obj = {}
var isEmptyObj = (JSON.stringify(obj) == "{}")
console.log(isEmptyObj) //true

// 2. for in 循环判断
let obj = {}
let isEmptyObj = function() {
	for(let key in obj) {
		return false
	}
	return true
}
console.log(isEmptyObj()) //true

// 3. 使用ES6的Object.keys()方法
// Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。

// 如果我们的对象为空,他会返回一个空数组,如下:

let obj = {}
var emptyObj = Object.keys(obj)
console.log(emptyObj.length == 0) //true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值