请简述var,let,const的区别
var
- var存在变量提升、暂时性死区
- 可以重复赋值
let
- let不存在变量提升、暂时性死区
- 块级作用域
- 可以重复赋值
const
- const不存在变量提升、暂时性死区
- 声明时必须定义值
- 块级作用域
解释垃圾回收机制,垃圾回收的方式
垃圾回收机制
如果一个对象不再被程序中的任何部分所引用,那么这个对象就可以被回收。垃圾回收器会定期检查并回收这些不再被使用的内存空间
垃圾回收的方式
- 标记清除
- 标记整理
- 分代收集
- 引用计数
以下代码的输出是什么
var tmp=new Date()
function fn(){
console.log(tmp);
if(false){
var tmp='hello world'
}
}
fn()
undefined
由于tmp只被定义了没被赋值,而if操作不会被执行
this的指向
var name = "window";
var person = {
name: "person",
sayName: function () {
console.log(this.name);//person
},
hello: () => console.log(this.name)//window
};
function sayName() {
var sss = person.sayName;
sss();//window
person.sayName();//person
(person.sayName)();//window,person.sayName 被引用并立即调用,但同样作为普通函数调用,而不是作为对象的方法
(b = person.sayName)();//window,同上种情况类似
person.hello()//window,箭头函数的this指向上下文的this值
}
sayName();
实现数组扁平化