基本面试题

103 阅读3分钟

面试题

var、let、const区别

1. var变量挂载到window上

var a=123
console.log(window.a);  //123

let b=11
console.log(window.b); //undefined

const c=2
console.log(window.c); //undefined

2. var存在变量提升,let const没有

console.log(a);  //undefined
var a=123

console.log(b);
let b=1
//未捕获的ReferenceError:无法在初始化之前访问词法声明'b'

console.log(c);
const c=2
//未捕获的ReferenceError:无法在初始化之前访问词法声明'c'

3. var可以重复声明,let const如声明会报错

var a=123
var a=100
console.log(100)

let b=22
let b=111
//未捕获的SyntaxError:标识符'b'已经被声明

let b=22
let b=111
//未捕获的SyntaxError:标识符'c'已经被声明

4. let const生成块级作用域

if(true){
    var a=10
    let b=20
}
console.log(a) //10
console.log(b) //Uncaught ReferenceError: b is not defined

5. let const存在暂时性死区

var a=10
function fn(){
    console.log(a)
    let a=20
}
fn() //暂时性死区

6. const

  • const声明必须赋值,否则会报错
  • const声明赋值后不能修改
  • 如果是复合数据类型,可以修改其属性
const arr=[]
arr=[1,2,3] //报错,改变了内存指针的指向
arr.push(2) //[2]

const obj={}
obj={aa:123} //报错
obj.name='小亮' //{name:'小亮'}指针未改变,只修改其属性不报错

说一下js事件代理是什么

js事件代理就是给父级元素绑定事件,不用给子级元素绑定事件,子集元素通过事件冒泡机制触发,绑定的事件,不用给每一个子元素添加事件,通过event的target属性实现。

     <ul id="uls">
        <li>你好</li>
        <li>hello</li>
        <li>代码</li>
        <li>爱迪生</li>
    </ul>
    let uls=document.querySelector('#uls')
    uls.addEventListener('click',function(e){
        console.log(e.target.innerHTML);
    })

jq 方式实现相对而言简单 $(“ul”).on(“click”,“li”,function(){//事件逻辑}) 其中第二个参数指的是触发事件的具体目标,特别是给动态添加的元素绑定事件,这个特别起作用

闭包

优点:可以隔离作用域,不造成全局污染。
缺点:由于闭包长期驻留内存,则会导致内存无法被释放。
如何释放内存:将暴露外部的闭包变量置为 null。

    let obj={
        name:'哈维',
        fun:function(){
            return this.name
        }
    }
    obj.fun()
    obj=null

js垃圾回收机制

Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数。

标记清除

标记清除是通过变量进入环境(即在执行预编译的时候将变量放入到作用域中)时对变量进行标记(标记为进入进入),当变量离开环境时又会被标记为离开环境。当垃圾回收时会将内存中的所有变量标记为可回收,然后再将环境中的变量和被环境中变量引用的变量的标记清除,然后对被标记的变量进行销毁和回收。

引用计数

引用计数回收机制是通过对一个值的引用次数进行统计,当这个值被付给一个变量时会给这个值标记为引用一次,如果这个值在被付给另外一个变量,则会给这个变量标记为引用两次。当这个值的引用次数为0时,下次垃圾回收时会把这个值进行回收。但是引用计数垃圾回收机制有个问题,就是循环引用,导致垃圾不能被回收。

 function problem () {
    var objectA = new Object();
    var objectB = new Object();
 
    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;       
 }
 
 problem();