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. 如果缓存中不存在匹配的资源,则浏览器会发送完整的请求给服务器,并将获取到的资源保存到缓存中。
点赞 评论 收藏
分享
27 65 评论
分享
牛客网
牛客企业服务