js面试重点总结(基础)

198 阅读4分钟

js面试重点部分总结(1)

数据类型

  • 基础数据类型:数字型:Number,字符型:String,布尔型:Boolean,对空:Null,未定义:Undefind,新增属性:Symbol
  • 引用数据类型/复杂数据类型:Object,Array,Function 还有两个特殊的RegExp和Date

检测数据类型

  • typeof: 只能检测基础数据类型除null以外的值,null会返回Object,检测引用数据类型除了Function以外均会返回Object
  • instanceof:A instanceof B 判断构造函数B的prototype原型对象是否在A实例的原型链上,返回布尔值,因此此方法只适用于检测复杂数据类型,且由于Object的prototype一定处在复杂数据类型的原型链上所以若B为Object始终返回True
  • toString:Object的原型对象上的toString方法,调用该方法的对象返回一个格式为[[object ***]]格式的字符串,其中xxx就是该对象的数据类型,对于Object类型直接调用该方法,当其他类型对象要调用该方法时应使用call/apply来调用才能返回正确的类型信息,该方法为万金油方法
  • constructor:可以检测出字面量创建出的实例对象是由哪个构造函数创建出来的,不好用
  • isArray:检测是否为数组的简单方法

递减递增

  • a++ a--:先返回自身,后自加/自减
  • ++a --a:先自加/自减,后返回自加/自减后的值
  • 两者单独使用时其实效果相同

作用域

代码中的一个名字并不是总是可靠有效的,而限定名字有效使用的作用区域就是作用域

作用:

  1. 提高了程序的逻辑局部性
  2. 减少了命名冲突,增加可靠性

js在es6前有两个作用域即全局作用域和函数作用域,全局作用域内定义的变量在该script标签全局或该独立的script文件全局皆能访问到;函数作用域或者称为局部作用域,仅作用于函数内部局部环境,外部访问不到 在es6之后新增了块级作用域,被{}包裹并且拥有let、const声明的部分就是块级作用域,块级作用域中定义的变量仅能在该块级作用域中被访问

变量的作用域

分为全局变量和局部变量,在全局作用域中声明的变量的变量就是全局变量,在局部作用域中声明的变量就是局部变量

  • 全局变量能在代码任意位置访问到,在全局作用域中用var声明的变量为全局变量,特殊情况下,在局部作用域中没有用var声明的变量也能是全局变量(不建议使用)
  • 局部变量仅能在局部作用域中被访问到,在函数内用var声明的变量为局部变量,函数形参也是局部变量

区别:

  • 全局变量在任何时候都能被访问到,只有在浏览器关闭时才会被销毁,因此比较占内存;
  • 相反局部变量只有当该变量存在的代码块被执行时才会被初始化,当代码块执行完毕后就会被销毁,比较节省内存

作用域链

写在函数中的部分就是局部作用域,没有写在函数中的部分就是全局作用域,在函数中还能声明函数再次开辟一块局部作用域,根据内部函数可以访问外部函数的机制进行链式查找,哪些数据能被内部函数访问到就是作用域链,根据就近原则查找变量的最终值

预解析

js代码是由js解析器来执行的,在浏览器执行js代码时分为两步,预解析和代码执行

预解析:在代码执行前会将var声明的变量和function定义的函数提升到当前作用域顶部进行提前声明或定义,函数定义在变量声明之前,js代码执行是从上到下依次执行

  • 变量预解析:将var声明的变量提升到作用域顶部,也叫变量提升,注意仅提升变量声明,不提升变量赋值
  • 函数预解析:与变量预解析一样,将函数声明提升到作用域顶部,但是不会执行,注意函数名代表的函数整体,所以函数提升后函数名仍然代表整个函数只是没有被执行
  • 函数表达式声明函数的问题:会将其作为变量来进行变量提升,而不是函数,接收函数的变量名无法被正常调用