【精选】前端JS面试题35个

时间:2022-12-10 16:07:57
1.问:什么是匿名函数?作用是什么?
          答:没有名字的函数就是匿名函数,作用有三,把函数当作变量赋值,把函数当作参数(回调函数),把函数当作另一个函数的返回值(闭包)
        2.什么是回调函数?为什么需要回调函数?
          答:一个被当作函数参数的函数,在不打开第三方函数的情况下实现完整功能,就需要回调函数
        3.什么是立即执行函数?为什么需要立即执行函数?
          答:此概念只针对匿名函数,即函数在定义阶段就可以直接运行,当我们希望一个函数只执行一次,执行完之后立马销毁,就需要立即执行函数了
        4.立即执行函数的写法
          (function (){}())
          (function (){})()
        5.什么是作用域链?
          答:父子函数嵌套时,不同变量在不同作用域的使用权限就是作用域链,子函数可以访问父函数的所有变量,父函数无法访问子函数的变量
        6.什么是闭包?为什么需要闭包?
          答:函数嵌套函数就是闭包,被嵌套的函数叫闭包函数,全局变量会破坏函数的独立性,既要实现功能又不能破坏函数独立性,就需要闭包
        7.简述闭包的写法
          父函数嵌套子函数,在父函数内部声明局部变量,子函数操作该局部变量并return,将子函数作为父函数的返回值,在全局声明变量接收该返回值,就形成了闭包
        8.闭包的作用是什么?
          函数外部可以返回函数内部的变量,实现属性私有化和模块化开发
        9.闭包的缺陷是什么?
          闭包会延长局部变量的生命周期,打破垃圾回收机制,大量使用闭包会导致内存泄漏
        10.什么是柯里化函数?柯里化的核心思想是什么?
          答:一个函数,只有一个参数,并且返回值是一个函数的函数。对函数参数的*处理,让函数更加灵活,降低了通用性,提升了特定性
        11.什么是this?作用是什么?分几种情况?
          答:this是函数对象的内置对象,其作用域在函数内部。
            this出现在事件体内,指向触发该事件的元素本身
            this出现在普通函数内(除了事件体和构造函数),代表调用该方法的元素本身
            this出现在构造函数内,指向new出来的空间
            this出现在箭头函数内,指向其父级的前缀
        12.什么是类?什么是对象?
          答:类是将具有相同属性和行为的对象归纳为一个类型,是一个模板,抽象不存在的;对象是类的实例化,携带了类的属性和方法,真实存在且唯一
        13.什么是原型对象?作用是啥?
          答:原型对象prototype是对象的一个属性,可以理解成一个存储空间,类的对象将具有相同内容的属性和方法存储到这个空间里,供其实例化对象访问和使用,大大减少代码量,降低内存消耗
        14.什么是arguments?作用是什么?
          答:实参列表,是函数对象的内置对象,作用域在函数内部,arguments的返回值是一个伪数组,只能访问元素和长度,其他API无法使用。作用有二,可以设置不定参函数,arguments.callee代表函数本身,常用于递归函数
        15.为什么子类的实例对象可以访问到子类的所有属性和方法,以及父类的所有属性和方法?
          答:所有实例对象在创建的过程中自带__proto__属性,指向类的原型对象prototype,所以可以访问类的原型上的属性和方法,类在构造对象的时候new出了空间,类的实例对象可以直接访问自己new出空间的属性和方法。
             子类的原型对象指向父类的实例对象,子类的实例对象可以访问父类构造对象时new出的属性和方法,子类的实例对象通过父类实例对象的__proto__可以访问父类原型上的的属性和方法
        16.apply/call/bind的区别是什么?
          答:三者都是函数对象的内置方法,用来修改this指向。apply和call用来修饰有名函数,bind用来修饰匿名函数。apply的第二个参数必须是数组,call和bind的参数用逗号隔开。apply和call都是直接调用方法,bind会产生新的函数对象
        17.面向对象的编程思想包括哪些?
          答:封装、继承、多态
        18.什么是封装的思想?
          答:将若干个属性和方法封装成一个整体变成一个对象,通过对象调用这些属性和方法
        19.什么是继承?
          答:子类吸收父类已有的属性和方法,提升了代码的复用性(ES6类的方法直接绑定在原型对象上)
        18.什么是多态?
          答:在面向对象的过程中,有一种极致的复用性叫多态,降低了类和函数的耦合性,实现了类和函数的解耦
        20.ES5继承都有哪些模式?
          答:三种模式,原型继承、借用构造方法继承(apply和call)、混合继承
        21.混合继承是怎么实现的?
          答:混合继承是原型继承和借用构造方法继承合二为一的继承模式,在混合继承中,原型继承是子类继承父类prototype上的属性和方法,借用构造方法继承是子类继承父类new出空间的属性和方法
        22.什么是原型继承?
          答:通过原型对象实现继承
        23.原型继承的缺陷有哪些?
          答:子类对象构造时,无法初始化父类派生给子类的属性,一旦实现继承关系,继承指向就不能修改,必须先实现继承关系才能为子类添加原型属性和方法
        24.借用构造方法继承的作用和缺陷是什么?
          答:可以实现子类对象构造时,初始化父类派生给子类的属性,缺陷是无法继承父类原型对象上的属性和方法
        25.instanceof是什么?和typeof的异同点是什么?
          答:instanceof是判断引用类型的关键字,返回值是布尔值,如果A对象是B类型的,返回true,反之返回false。二者都是判断数据类型的关键字,typeof只能判断基本类型,无法判断引用类型,若判断引用类型返回Object,instanceof能够判断引用类型,且满足兼容性规则(高版本兼容低版本,低版本不兼容高版本)
        26.内置基本类型和内置引用类型在存储上的区别是什么?
          答:内置基本类型只有一块栈空间,里面存储的是数值,内置引用类型有栈和堆,栈里面存的是堆空间的地址,堆空间里存的是真实的内容
        27.什么是值传递?什么是引用传递?
         答:值传递是将栈里面的数值当作实参传递,单向传递,形参无法改变实参,需要返回值。引用传递是将栈空间里面的地址当作实参传递,形参和实参指向同一地址,形参能够改变实参堆空间的内容,双向传递,无需返回值
        28.简述深浅拷贝
         答:深浅拷贝是针对引用类型的概念,深浅拷贝本质区别是有没有开辟空间,浅拷贝只拷贝地址,不开辟空间,一改全改,深拷贝是既拷贝地址也开辟空间,各改各的
        29.什么是单例类?怎么实现?有什么作用?
          答:一个类只能创建一个对象,就是单例类。当这个类没有对象的时候,就创建一个对象,如果这个类已经有了一个对象,则无法继续创建对象,保持该类的对象永远有且只有一个。可以方便在整个项目之间传递共享数据
        30.简述观察者模式
          答:当发布者发布消息时,所有观察者都可以接收到该消息。代码角度:观察者定义函数,发布者调用函数,传递参数
        31.什么是cookie?
          答:cookie是会话跟踪技术,也是页面之间传递数据的变量。cookie分为会话级cookie和长生命周期的cookie,长生命周期的cookie由服务器生成,由服务器发送到本地磁盘,保存在本地磁盘中,会话级cookie由浏览器生成,保存在浏览器当中,浏览器关闭cookie自动清除。二者的读取是一样的,会话级cookie没有删除的概念,当所有页面关闭后会自动清除,长生命周期的cookie没有直接删除的方法,可以把存储的时间更改为-1或者等存储时间到了自动删除,长生命周期的cookie写的时候需要加expires=标准日期对象
        32.cookie和本地存储的区别有什么?
          答:cookie存储数据的大小是4K,本地存储的数据大小是4-5MB;cookie每次都会把数据发送在HTTP请求当中,浪费性能,本地存储不参与服务器通信;cookie的原生API极少,需要程序员自己封装,本地存储的API等同于cookie封装好的API;会话级cookie等同于sessionStorage,localStorage除非手动删除,否则将一直存储在本地。
        33.什么是Object.defineProperty?
          答:Object.defineProperty是ES5的一个与数据驱动息息相关的函数,能改变Vue修改变量的方式,以前是DOM驱动,现在是数据驱动,可以精准控制每个属性的特点
        34.Object.defineProperty的方法有哪些?
          答:get和set,value,writable(是否可以设置),enumerable(是否可以被枚举),configurable(是否可以被删除)
        35.什么是双向绑定原理?
          答:改数据,DOM元素发生改变;改DOM元素,数据发生改变,用的就是Object.defineProperty()中的get和set方法