好吧,我承认标题太党了,本文是一个前端面试题主导的纯技术讨论。我想以一种极其虚伪的方式从中外诗歌入手。在传统佛经中,有一句为世人所熟知的谚语??:“一花一世界,一叶一菩提,一树一浮生,一草一天,一沙一极乐,一面一净土,一笑一命,一思清静。”当年佛手捧花时,迦叶笑着走向极乐。从一朵花,可以了解整个世界,可以升入天堂。佛就是佛。谁能有这样的境界。同时,早在18世纪,英国伟大的浪漫主义诗人布莱克在一首名为《天真的暗示》的诗中也有类似的写道:“一沙一世界,一花一天堂”。》,一个沙中世界,野花中天堂。转念一想,虽然我们是不起眼的coder,但是写出的代码却体现了我们的功力:菜鸟和高手的差距,往往就是工程线上几行不起眼的代码,天壤之别。一系列的面试题,虽然在JS知识体系中是沧海一粟,但是考察点充分判断了面试者的能力。希望读者有不同的想法可以和我一起讨论。题目背景题目摘自我的书《effective javascript》。这一周,陆续面试了不下10人,其中不乏优秀的工作经历。但遗憾的是,我们并没有在短时间内得到高质量的答案。问题上一个问题可以分为两部分。第一部分非常简单。一般有一定JSOOP基础的考生应该能答得很好:一个社交网络有一组成员(member),每个成员都有自己的名字,还有一个列表,用来存放自己的好友信息。请实现这样的成员构造函数。正确答案并不难理解:functionMember(name){this.name=name;this.friends=[];}不是很简单。其典型错误包括但不限于:functionMember(name){this.name=name;}Member.prototype.friends=[];关于方法和属性到底应该放在原型上还是放在构造函数中,如果不了解的话,是时候补一下prototype原型链的知识了。推荐大家看看我的同事晏海镜早在3年前写的一篇文章。同样,对于这道题,我会考查面试官在JS中存储变量的方式,包括栈存储的不同情况和引用赋值的掌握情况。题目转换以上是对JS基础的考察,但是在这个题目的基础上,我做了进一步的提问。希望对考生的临场思考、JS基础甚至一些设计能力有更深入的了解。我想实现一个带有圆环(社交圈)的社交网络:vara=newMember('Alice');varb=newMember('Bob');varc=newMember('Carol');vard=newMember('Dieter');vare=newMember('Eli');varf=newMember('Fatima');a.friends.push(b);b.friends.push(c);c。朋友.push(e);d.friends.push(b);e.friends.push(d,f);在这种情况下,你需要实现一个inNetwork方法来判断一个目标成员是否在另一个对象成员中间的社交圈中。规则:如果你能在社交链上找到目标成员,就认为你在社交圈中。否则,不在他们的社交圈子里。解题思路如果你对这样的话题很陌生,尤其是在面试现场,身为面试官的你可能会慌张。这时候需要做的就是先准确分析题目。根据题目,画出一个与上面题目代码匹配的实例化网络:接下来想一想,搜索就是遍历整个社交网络。我们应该:1)从单个根节点开始,2)然后添加发现的节点,3)移除访问过的节点,以防止死循环最终实现:Member.prototype.inNetwork=function(target){varvisited={};var工作列表=[this];//用于存储社交链上的个人信息,最初以“self”为根节点while(worklist.length>0){//删除worklist中的最后一个成员并取出varmember=worklist.pop();//如果有循环,需要避免重复访问if(member.nameinvisited){continue;}visited[member.name]=member;如果(成员===目标){返回真;}//将当前成员的好友列表添加到工作列表中,他们都在根节点的社交链上member.friends.forEach(function(friend){worklist.push(friend);})}returnfalse;}I已经在代码中添加了注释,如果你还不明白,不要着急。建议运行程序,执行debugger和console,尝试理解。测试:a.inNetwork(f)//truef.inNetwork(a)//false哈哈,果然,爱丽丝通过朋友圈可以找到法蒂玛,法蒂玛反过来找不到爱丽丝!当然,我认为这是违背人类社会常识的。但是谁让他出问题了呢?一道简单的题涵盖了很多知识点,比如:while循环中的流程控制(continue)、数组的基本方法(pop、forEach、push)、for...in等。它的典型错误包括但不是限于:使用一个对象来承载worklist,然后使用for...in循环遍历worklist。这样做的问题是for...in循环并不要求枚举对象的修改与当前循环保持一致。事实上,标准规范规定:“如果枚举对象在枚举过程中增加了新的属性,那么新增加的属性在枚举过程中不能保证是可访问的”。综上所述,本题考查面试官包括JSOOP在内的多项基础,特别是后半部分考查应聘者的思考能力和反应能力。有不懂的读者可以留言问我。或查看:《effective javascript》书。回到原句,谈谈我的感悟。在天体的轮转和时间的轮回中,我们清晰地感受到每个个体生命周期的脆弱,这在宏大的宇宙观中或许并不如沧海一粟。把下半句的诗句拿出来鼓励一下:“把无限握在手心,永恒在一小时。把无限握在手心,永恒在一小时。”在前端快速迭代开发的学习中,作为初学者的我常常面对知识的汪洋大海而感叹。这时候的根基就是可以储存“永恒和无限”的潘多拉魔盒。
