JS基础及常见面试内容

134 阅读3分钟

JS数据类型

  • 基本类型
    1. 常见类型: String Boolean Number BigInt(ES2020) symBol(ES6新增)
    2. 特殊类型:undefined null
  • 引入类型
    1. Object 对象子类型(Data Array Function)

判断数据类型有哪些方法

  • typeof 判断基本数据类型
    NumberStringBooleanFunctionundefined,想判断这几种类型,那就可以使用typeof
    ArrayObjectnullDateRegExpError这几个类型都被typeof判断为object
    
  • instanceof 原理 判断这个构造函数的原型是否在给定对象的原型链上
    nullundefined都返回了false,这是因为它们的类型就是自己本身,并不是Object创建出来它们
    
  • constructor 原理 constructor是prototype对象上的属性,指向构造函数
  • Object.prototype.toString.call
   原理是 `toString()` 返回 `[object type]`,其中 `type` 是对象的类型

常用的ES6方法

  • 变量声明
    1. let 不具备变量提升 块级作用域
    2. const 不具备变量提升 定义的基本类型不能改变 引用类型可以改变
    在代码块内,使用letconst命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ
  • 箭头函数【=>】
  • 展开运算符 【...】

原型和原型链

  • 首先问一个问题 为什么js会有原型机制?;

    Javascript在设计之初没有 "类"(class) 的概念而是参考C和java的使用New命令时调用的"类"的构造函数,但是构造函数在生成实例时无法共享属性和方法,所以为构造函数引用了prototype属性,实例对象一旦创建,将自动引用prototype对象的属性和方法

  • 引入原型解决了那些问题(好处)?

    1. 对象都能共享原型上的方法,节省内存
    2. 通过找对原型链,方便地实现了继承
  • 什么是原型

    1. 原型包括显示原型(prototype) 和隐式原型 (proto
    2. 所有函数都有一个prototype(显示原型)属性,属性值是一个普通的对象 指向函数的原型对象
    3. 所有的引用类型都有一直__proto__属性指向构造函数的prototype 隐式原型的作用是用来构成原型链,实现基于原型的继承
  • 什么是原型链

    访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链

  • prototype 和 proto 区别是什么

    1. prototype是构造函数的属性
    2. __proto__是每个实例都有的属性,可以访问 [[prototype]] 属性
    3. 实例的__proto__与其构造函数的prototype指向的是同一个对象

THIS 闭包和 作用域

  • 函数调用的几种方式

    1. 普通函数
    2. 作为方法调用
    3. 构造函数调用
    4. call、apply、bind
    call 与apply相似,只是传参的形式不同
    bind除了返回是函数以外,它的参数和 call 一样
    
  • 理解this

    函数执行时,this总是指向调用该函数的的对象,说白了就是this所在的函数属于谁

  • 什么是闭包

    是指有权限访问到其他函数作用域的变量的函数

  • 使用场景

    函数作为返回值

    function Proson () {
        var a = 100
        return function () {
            console.log(a)
        }
    }
    var f1 = Proson();
    var a = 200
    f1();// 输出的是100 而不是200
    
    
    

    函数作为参数传递

     function foo(){
        var a=100;
        return function(){
            console.log(a);
        }
    }
    var f1=foo();//f1为函数
    
    function f2(fn){
        var a=200;
        fn();
    }
    f2(f1);//100
    

持续更新中.....