前端面试题 ---- Part 2

1. 深拷贝和浅拷贝

  • 浅拷贝:对于数组来说,如果元素都是基本数据类型的话,可以直接使用slice或concat进行拷贝,修改复制品不会影响原有数组,但如果元素包含数组或对象的话,直接进行拷贝的话,只会拷贝对数组和对象的引用,这样的话,修改复制品会影响到原有数组,这就是浅拷贝

  • 深拷贝:是指完全的拷贝,复制品不会影响的原有数组

  • 如何实现浅拷贝:

    对对象进行遍历,直接将属性和属性值赋给新对象即可

  • 如何实现深拷贝:

  1. 可以使用JSON数据作为过渡,利用JSON的stringify和parse方法
var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]
var new_arr = JSON.parse( JSON.stringify(arr) );
console.log(new_arr);

该方法是先将js对象转化为序列化的JSON字符串,在将字符串反序列化为js对象,注意:该方法无法拷贝函数

  1. 可以写一个拷贝函数,在函数内判断属性值类型,如果类型为对象就递归的调用拷贝函数
var deepCopy = function(obj) {
	if (typeof obj !== 'object') return;
	var newObj = obj instanceof Array ? [] : {};
	for (var key in obj) {
		if (obj.hasOwnProperty(key)) {
			newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
		}
	}
	return newObj;
}

2. call apply bind 区别

  • call和apply功能完全相同,只是传递参数的形式不同,call是将传递给方法的参数一一陈列,apply则是将参数包装为一个数组
  • bind功能类似,传递参数形同call,只是它的返回值为一个改变this指向后的函数
  • call和apply的作用
  1. 改变this的指向
  2. 借用其他对象的方法
  3. 调用函数,因为call和apply会立即执行函数

3. js原型链相关

  • 每个构造函数都默认带有一个prototype属性,这个属性的值是一个对象,同时这个prototype对象自带有一个constructior属性,这个属性指向这个构造函数,同时这个构造函数的每个实例对象都有一个_proto_指向这个prototype对象,可以把这个称为隐式原型。
  • 在使用一个实例的方法的时候,会先检查这个实例中是否有这个方法,没有的话就会向上查找prototype对象中是否有这个方法
  • 例如:如果让原型对象指向另一个类型的实例
constructor1.protoytpe=instance2
  • 这个时候如果在constructor1的实例instance1中查找某属性p1,他的搜寻轨迹是instance1 —> instance2 —>constructor2.prototype —> … —> Object.prototype;这就是原型链
  • Object的原型是Function.prototype;Object原型的原型是Object.prototype,原型链的顶端是Object.prototype
    图片摘自牛客
  • 上图中蓝色的线就是所谓的原型链,Object.prototype.proto === null,所以Object.prototype没有原型

4. event loop (事件执行次序)

  • macro-task(宏任务)队列真实包含任务:

    script(主程序代码),setTimeout, setInterval, setImmediate, I/O, UI rendering

  • micro-task(微任务)队列真实包含任务:
    process.nextTick, Promises, Object.observe, MutationObserver

  • 由此我们得到的执行顺序应该为:
    script(主程序代码)—>process.nextTick—>Promises…——>setTimeout——>setInterval——>setImmediate——> I/O——>UI rendering

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值