全程只有一面,面试官人很好,一直在引导我,由于自己太菜了,感觉浪费了人家面试官的时间。感谢遇到的每一位面试官,谢谢一直很有耐心引导我。
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。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。
引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的