70场面试,复盘我遇到的有趣问题(四)

        今天分享一下美团和蔚来面试中遇到的一些问题。
1.(蔚来二面)在forEach和map里面对遍历的值进行改变会影响原数组吗
        认真背八股的同学肯定都记得,forEach不会返回新的数组,只是遍历每一项并做计算,map会返回新的数组,所以理所当然的想map不会改变原数组,forEach...会怎么样??想到这里就错了,这也是我当时的思路。
        事实上这个问题跟上面那个八股完全没关系。试想一个函数,传递了参数进来并改变这个参数,会不会对原来数据进行改变呢?这个题是在靠这个,需要分类回答。
        数组中数据为基本数据类型时,forEach和map都不会改变原数组;数据为引用数据类型时,map和forEach都会改变原数组。在使用 forEach 和 map 方法时,对引用类型元素的修改会直接反映在原始数组中。这是因为引用类型的元素实际上存储的是引用(内存地址),而非值本身。因此,通过引用可以访问和修改原始数组中的元素。而number,string,Boolean,null,undefined这些基本类型在栈内存中直接存储变量与值。
2.(美团到家一面)为啥会出现箭头函数
        这一个问题可以去b站渡一老师的小视频里看看。
        肯定很多人跟我一样第一时间想到的是箭头函数和普通函数的区别,那为啥有这些区别,为啥要单独搞个箭头函数出来?难道只是为了简单吗。其实原因只有一个:消除函数的二义性。
在出现箭头函数之前,函数可以直接被调用,也可以被new当作构造函数使用,这就是函数的二义性。而这种二义性的存在是会给开发带来负担的,因为创建者并不知道未来函数的调用者是如何使用这个函数的,所以后来先在命名上做了规范:小写开头的函数是直接使用的,大写开头的是构造函数。但这种规范也不是强约束,毕竟既可以Number(),又可以new Number(),所以为了消除这种二义性,创造了箭头函数和class,箭头函数只能() => {},当作普通函数调用,而class只能被new,这就刚好对应二义性的两种用法,解决这种复杂情况了。

————————10.10补充————————
        感谢牛u的提示,这边还有一个点补充。
        箭头函数的出现解决了this的复杂指向问题。
        举例如图3所示,当调用show方法打印this.x的时候打印的是undefined。这是因为当代码执行到了setTimexout( )的时候,此时的this已经变成了window对象(setTimeout( )是window对象的方法),因此会在window上查找x,找不到,就输出undefined。
        而如果是箭头函数,箭头函数的this是定义时就确定的,因此箭头函数的this指向的是obj,输出的就是obj.x。这样就解决了普通函数在当作回调函数传递的时候this变化带来的麻烦,否则就要用全局变量或者闭包之类的方法。

3.(美团到家一面)obj对象中有一个方法,用obj.a()和(obj.a)()去调用分别输出什么(a方法中输出this.name,obj和全局都有一个name属性)?
        这个题其实是当时考的一个输出题(图1)。下来尝试了一下,答案是没区别,都输出obj对象中的name。
        这个题我一开始以为(obj.a)()这种调用就跟let b = obj.a,然后调用b()这种形式一样,但不是这样的,这个点可以记一下。
        然后还要注意的一个点是,如果这个方法是箭头函数的形式(图2),那么this指向就不一样了,指向的是window。所以会在window上面去找name。那么这个时候输出什么?
        是不是很多人脱口而出,“输出hong!”
        恭喜各位掉到新坑了,这个时候输出是空(什么都没有:“”)
        因为let和const定义的变量是不会挂到window对象身上的,如果改成var就能输出hong了,大家可以自行尝试一下、
        (上面这个点个人认为还是很细的,一定要小心)
        
        这几个是自己踩过的坑,第三点应该很多同学都会想错。
        欢迎各位评论区交流~
#24届软开秋招面试经验大赏##软件开发2024笔面经##美团##蔚来##前端#
全部评论
佬说的太棒了,箭头函数这块我也看的渡一的视频,当时被问到还是挺爽的,直接从二义性回答。
2 回复 分享
发布于 10-09 18:12 陕西
如果不知道window.name是预设属性,可能会回答是undefined
1 回复 分享
发布于 10-09 19:01 浙江
输出题好难我靠
点赞 回复 分享
发布于 10-09 18:35 浙江
箭头函数的特殊this绑定也很关键
点赞 回复 分享
发布于 10-09 22:22 江苏
佬说的好棒
点赞 回复 分享
发布于 10-12 11:28 安徽

相关推荐

Web缓存是一种用于临时存储网页资源的机制,它可以提高网页加载速度和减少网络流量。浏览器会在本地存储已访问过的资源(例如HTML、CSS、JavaScript、图像等),当再次访问相同资源时,浏览器会尝试从缓存中获取资源,而不是重新下载。浏览器缓存的工作原理如下:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&uuid=b48bebe08e474db8b80b853b12bafd48当浏览器首次请求某个资源时,服务器会在响应中附带缓存相关的HTTP头信息,例如"Cache-Control"和"Expires"。浏览器会将这些资源以键值对的形式保存在本地缓存中,键是资源的URL,值是具体的资源内容。下次请求相同资源时,浏览器会检查缓存中是否有匹配的资源。 a. 如果缓存中存在匹配的资源,并且缓存未过期(根据"Cache-Control"和"Expires"头信息判断),则浏览器直接从缓存中获取资源。 b. 如果缓存中存在匹配的资源,但缓存已过期,则浏览器发送带有"Cache-Control"和"Expires"头信息的条件请求,即发送一个"If-None-Match"和/或一个"If-Modified-Since"头信息给服务器,用于验证资源是否有更新。如果服务器返回304状态码表示资源未更新,则浏览器从缓存中获取资源;否则,服务器会返回新的资源。 c. 如果缓存中不存在匹配的资源,则浏览器会发送完整的请求给服务器,并将获取到的资源保存到缓存中。
点赞 评论 收藏
分享
秋招进入尾声了,还没拿到offer,大家是不是还在暗自哭泣,今年秋招难!!!但是!不要气馁,咱们还有补录机会!!!那要怎样才能抓住机会,成功上车呢?相信大家在前期的面试中应该积累了一定的面试经验了,对于面试官常问的问题心中应该也有数了吧,但是面试前的准备工作是很多同学容易忽视的,而这个准备工作有时候也能直接决定面试的成功率。所以今天小编就来给大家盘一盘面试前要做哪些准备工作,供大家查漏补缺!!!首先,要保证自己对过往的经历非常熟悉。ps:这里也提示我们在工作中,不能一味执行。不去思考背后的动机,会让自己的工作变得毫无意义不说,还会让我们的成长非常缓慢。其次,将自己的能力与岗位做好一一匹配。以上内容可以拿张纸列出来,然后和自己的情况做一一对应,并保证自己和岗位匹配之处,也能找到对应的事例证明,这样在面试中基本不会出现被问倒的情况。最后,想清楚自己的求职动机。大家都知道,为什么来应聘这个岗位之类的问题,几乎是面试的必问题,面试官要清楚候选人的动机,才能判断候选人的稳定性以及入职后在这个岗位上的主观能动性。围绕面试岗位,我们需要充分了解该岗位服务的对象是什么?是对外还是对内?对外的话是to b还是to c?产品特性是什么?行业内有什么经典案例?企业在行业的地位?该岗位一天下来的工作状态\体验如何?了解以上内容,一方面能保证我们能更好的回答面试官针对业务方向的问题,另一方面也能让面试官看到我们明确且坚定的求职动机。同时,自己也可以想清楚该岗位的工作内容是否和自己的职业规划一致。了解渠道:可以通过企业的招聘简章、企业官网、企业官方公众号、行业网站、行业公众号去了解,也可以上网看看同类型的工作状态是什么样的。同类型的部门,一般在企业里面会对接哪些部门?该部门在公司处于什么样的角色/定位?发展如何?尤其是大厂,同一个岗位,在不同的业务线上,工作体验可能是完全不一样的,有的是神仙工作,有的可能是深坑。提前了解,可以帮助我们进一步判断这个工作的内容、晋升和自己的职业规划是否一致,也可以帮我们避坑。了解渠道:可以通过网络平台,也可以通过询问该方向工作的师兄师姐或者老师。有的面试者会在面试中去问企业薪资,有的面试者会在面试官问到期望薪资时回答不上来,这两种情况显然在面试中都会减分。前者会让面试官觉得候选人眼高手低、好高骛远,尤其是应届生在初面中问薪酬,是非常减分的。后者会让面试官觉得候选人对自己不够自信,对岗位缺乏了解。而这两种情况其实是完全可以避免的,我们在面试前去了解目标岗位在同类型企业的薪酬范围,并不是一件难事。了解渠道:******* 官网 官网 官网!!!!嵌入式面经可以看这个大佬总结的就很详细  c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
分享
27 65 评论
分享
牛客网
牛客企业服务