实习面试2:字节跳动前端开发实习生

全程只有一面,面试官人很好,一直在引导我,由于自己太菜了,感觉浪费了人家面试官的时间。感谢遇到的每一位面试官,谢谢一直很有耐心引导我。

1.函数执行作用域的问题。

window.name="bytedance"
function A () {
    this.name='123'
}
A.prototype.getA=function () {
    console.log(this)
    return this.name+1
}

var a = new A();
var b=a.getA;
b()

答案:window bytedance1

若直接执行a.getA(),答案是什么?
我感觉是 A 1231

2.第二道题

console.log('1')

setTimeOut (() => {
    console.log('2')
},100)

一个promise函数

然后执行该函数

记不太清了

3.扑克牌问题

我手中有一堆扑克牌, 但是观众不知道它的顺序。

1、第一步, 我从牌顶拿出一张牌, 放到桌子上。

2、第二步, 我从牌顶再拿一张牌, 放在手上牌的底部。

3、第三步, 重复第一步、第二步的操作, 直到我手中所有的牌都放到了桌子上。

最后, 观众可以看到桌子上牌的顺序是:(牌底部)1,2,3,4,5,6,7,8,9,10,11,12,13(牌顶部)

请问, 我刚开始拿在手里的牌的顺序是什么?

(相当于一个完全反过程)之后搞懂再补

4.一段字符串"www.bytedance.com"反转成"com.bytedance.www"(时间复杂度O(n),空间复杂度O(n))

function restr(s) {
    var tmp =" ";
    var result =" "
    for(var i=length-1;i<0;i--){
        if (s[i]=="."){
            result = result + tmp +"."
            tmp = " "
        }
        else
        {
            tmp=s[i]+tmp
        }
    }
    return result+tmp
}

引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的5.实现浅拷贝的方法?简单赋值 assign 扩展符...

  实现深拷贝的方法? 先用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象 其中slice和concat不是深拷贝

浅拷贝只是拷贝一层,对于基本数据类型来说,拷贝的是值,而深层次对象级别的则是拷贝引用,也就是平常说的地址

参考的博客地址:https://www.cnblogs.com/echolun/p/7889848.html(讲解的很好的)

深拷贝和浅拷贝:假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

基本数据类型:number,string,boolean,null,undefined五类。

引用数据类型(Object类)有常规名值对的无序对象{a:1},数组[1,2,3],以及函数等。

而这两类数据存储分别是这样的:

a.基本类型--名值存储在栈内存中,例如let a=1;

当你b=a复制时,栈内存会新开辟一个内存,例如这样:

 

所以当你此时修改a=2,对b并不会造成影响,因为此时的b已自食其力,翅膀硬了,不受a的影响了。当然,let a=1,b=a;虽然b不受a影响,但这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据。

b.引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,我们以上面浅拷贝的例子画个图:

当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值。

而当我们a[0]=1时进行数组修改时,由于a与b指向的是同一个地址,所以自然b也受了影响,这就是所谓的浅拷贝了。

 

那,要是在堆内存中也开辟一个新的内存专门为b存放值,就像基本类型那样,岂不就达到深拷贝的效果了

深拷贝,是拷贝对象各个层级的属性

6. let 和 const 说一下?const 可以定义一个对象吗? 可以的(引用地址不变,属性可以改变)

7.栈和堆的区别

栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存,大小不定也不会自动释放。

基本类型有Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。

引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的

你可能感兴趣的:(前端面经)