整理一下昨天二面的题目


前言

我面试回来了.jpg


一、JavaScript部分

我没有被问到HTML, 而CSS也被放在JavaScript部分之后了, 大概就问了这些, 我记了7个让我印象比较深刻的问题.

1.JavaScript中的prototype有什么作用?

讲真我对于prototype的理解就只局限在构造函数那一块, 还是做题积累的一点知识.
我当时说: “常见的情况是使用构造函数来生成对象, 然后…函数prototype里的属性会成为生成的对象的__proto__里的属性, 也就是这个对象里的属性.”
prototype我真的就只知道这个作用了.

2.那你知道如何用prototype实现继承吗?

现在看, 其实以前接触过这个, 就是向构造函数的prototype上加属性, 然后再new这个构造函数, 这样生成的对象里救会存在这些prototype中存在的属性.
问题是我不知道这叫"继承", 我直接说了"不太清楚…"

function fun1() { }
function fun2() { }

fun1.prototype.name = "name";
fun1.prototype.aMethod = function () { console.log("aMethod!") }
        
fun2.prototype = fun1.prototype;
var obj = new fun2();
obj.aMethod();

3.那比如我要把一个方法添加到对象上, 让大家都可以使用它, 该怎么做?

我答的大概是下面这种方法了, 但是这种并非给baiX这个函数添加了方法, 而是单纯的给aMethod添加.

function baiX(name, age) {
  this.name = name;
  this.age = age;
}
var aMethod = new baiX();
aMethod.xxx() = function () {
  console.log("doXxx");
};

应该是这样, 直接把方法加到原型上, 我应该想到的, 刚才一直在问原型相关:

function baiX(name,age){
  this.name = name;
  this.age = age;
}
baiX.prototype.xxx = function(){
  console.log("doXxx");
}

4.ES6中如何实现类的继承?

子类继承父类使用extends:

class SuperClass {
	constructor() {
		this.name = "Super.";
	}
}
// 定义子类,并继承以上父类
class SubClass extends SuperClass {
	constructor() {
		// 在构造器中,直接用super()来调用父类的构造器
		super();
	}
}

5.深拷贝和浅拷贝的区别是什么?

浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存

6.如何实现浅拷贝, 实现深拷贝?

参考大佬的文章: 浅拷贝和深拷贝的区别

var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);

function shallowCopy(src) {
  var newobj = {};
  for (var prop in src) {
    if (src.hasOwnProperty(prop)) {
      newobj[prop] = src[prop];
    }
  }
  return newobj;
}

7.你知道JavaScript是一门单线程语言吧, 那么执行过程中各种方法和函数的执行是如何来避免阻塞的, 他们的执行顺序有什么规律吗?

“您是说宏任务和微任务吗?” “嗯, 是的.”
“js执行前会对任务进行第一轮分拣, 将微任务和可以立即执行的任务出来执行, 然后原则上一轮执行会后取宏任务执行, 宏任务里如果还有微任务或者可立即执行的话会在下一轮的分拣微任务和可立即执行的时期来执行, 如果宏任务内还套着宏任务, 那么也进入下一轮的宏任务队列.”

我感觉大体是这样的, 我没有提前对这个问题做什么准备, 但是面试官似乎不太满意这个答案…

8.JavaScript的代理模式你知道吗?

“额, 没有去了解过.”
这个单独开一篇文章吧…

JS答到第三题的时候我觉得这把铁定是寄了, 啥也不会啊这…

在这里插入图片描述


二、CSS

1.说一下CSS中的Flex布局吧.

“您是说Flex的各项属性吗?” “嗯, 对.”
(依次display:flex–order–justify-content–align-items–flex-wrap)
“好了好了, 知道你比较了解了.”

2.对position布局有理解吗? 说一下absolute和relative的区别?

“relative是相对与元素原本所在的位置进行定位.”
“absolute…在父级存在定位的情况下优先相对于父级定位自身, 如果没有的话会相对于…(这里有点懵, 我知道这样它要根据body来定位, 但是当时我没想好怎么描述这个范围)网页的可见区域吧, 大概是Body.”

3.那absolute和fixed的区别呢?

“absolute定位不会随着页面的滚动改变位置, 如果页面滚出absolute定位元素的可见区域, 那么这个元素不再能看到, 但是fixed相对于浏览器窗口进行定位, 不论如何滚动都始终保持在屏幕的某个位置.”
“fixed经常拿来做’返回顶部’.”


三、Vue、Node

他能问我Node我是没想到的…这可能算给自己挖了一个坑, 不过好在坑不大啦…

1.说一下Vue相对于原生JS写法, 有何优点?

我答的挺没条理的…而且没答全吧…
“Vue是一个基于类MVVM架构的框架, 相比于原生JS直接进行DOM操作, Vue更倾向于通过去改变环境来间接的影响DOM, 从代码方面来说这样可以避免在代码里进行大量的DOM操作, 在代码量很大的时候, 优点尤其可以得到展现, 就是…对后期的代码维护比较好, 之后就是不用再手动一个一个的去操作DOM也提升了开发效率.”
以下是我没答出来的: 实现单页面富应用, 有样式隔离, node模块化, 插件可以用包管理工具即时安装使用比较方便, 然后路由系统可以比较方便的自己定义.

2.Vue是如何实现的数据双向绑定?

提到数据双向绑定, 我感觉没什么好说的但是我看过v-model指令的基本原理, 然后我就说了…现在想想简直是驴唇不对马嘴…
我说v-model指令内部对一些方法进行了封装, 对于不同的元素, v-model内部有不同的方式去获取和改变它们的值, 这也是为什么对某些元素使用v-model指令会报错v-model不能使用在该元素上.
我觉得这个大佬写的很好了, 我就不在这班门弄斧了(捂脸):
如何理解Vue数据双向绑定原理

3.Node, 好像是叫我说一下甚麽优点来着?

“Node的模块基于common.js这个模块化规范, Nodejs让JS成为了一门…图灵完备的语言, 一门理论上甚麽都可以实现的语言.可以让js脱离浏览器这个桎梏运作.”
…勉勉强强, 看起来好像还是不太满意这个答案.

4.Node相对其他后端语言有何优势呢?

性能很高, 完全由JS构建而且可以实现服务器.
の…Node处理高并发的能力比较强吧, 嗯…大概可以达到Java的十倍左右.

5.嗯, 那Node是如何实现的高并发呢?

我以前专门去查过这个 但是被问到的时候我的脑子里只出现了俩词: “异步"和"合并”
啊啊!..反正就是没记住吧, 挺后悔的.

传统单线程处理机制下要等数据库返回结果, 这样会拖慢效率.
Node访问数据库过程中, 后面的代码会继续执行, 而通过回调函数来对数据库返回的结果进行处理, 一种异步思想.

当某个I/O操作执行完毕会, 立即以事件的形式通知执行I/O操作的线程, 并且调用这个事件的回调函数. 线程的事件循环不断的检查有没有未处理的事件并依次处理, 以确保这个机制得以维持。

这种非阻塞模式下, 一个线程永远在执行计算操作, 这个线程的CPU核心利用率永远是100%.


总结

不过好在还是过了…

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值