Javascript面试题 - 初级

70 阅读4分钟

1. js中的数据类型

1.1 基本数据类型

  1. Number
  2. String
  3. Boolean
  4. undefined
  5. null
  6. Symbol
  7. Bigint

1.2 引用数据类型

  1. Object
  2. Array
  3. Function
  4. RegExp

2. 数据类型的检测

  • 使用typeof可判断:Number、String、Boolean、undefined、Function;
  • 使用instanceof可判断:Object、Array、Function;
  • 使用constructor可判断:Number、String、Boolean、Object、Array、Function、RegExp;
  • 使用Object.prototype.toString.call可判断:Number、String、Boolean、undefined、null、Function、Object、Array、Function、RegExp。

2.1 其他判断数组的方法

  • Array.isArrray

3. 数组的方法

  • pop:删除最后一个元素,返回被删除的元素,会修改原数组;
  • push:元素末尾添加元素,返回数组长度,会修改原数组;
  • shift:删除第一个元素,返回被删除的元素,会修改原数组;
  • unshift:元素开头添加元素,返回数组长度,会修改原数组;
  • indexOf:返回指定元素第一次出现的下标,找不到值时返回 -1;
  • lastIndexOf:返回指定元素最后一次出现的下标,找不到值时返回 -1;
  • slice:提取从开始位置到结束位置(不包含)的元素,不会改变原数组;
  • splice:删除从索引处指定个数的元素,且可追加元素,会修改原数组;
  • sort:会将数组元素通过转字符串按照utf-16码排序,返回原数组,会修改原数组,可传入一个比较函数按照此规则对其进行排序;
  • reverse:对数组进行反转,返回原数组,会修改原数组;
  • join:合并数组元素,返回通过入参分隔符或者逗号连接的字符串;
  • includes:判断数组是否包含某一个值,返回布尔值;
  • forEach:遍历数组;
  • map:遍历每个数组元素,通过入参函数处理,返回处理之后的元素新数组;
  • flat:通过入参深度将数组元素扁平,返回新数组;
  • filer:返回符合入参函数测试的元素;
  • every:判断元素每个元素是否符合入参函数测试,返回布尔值;
  • Array:判断元素是否至少有一个元素符合入参函数测试,返回布尔值;
  • reduce:聚合函数,入参函数中保存有上次函数处理的结果,总体返回一个聚合值;
  • find:返回数组中符合入参函数测试的第一个元素;
  • findIndex:返回数组中符合入参函数测试的第一个元素索引,没找到时返回 -1;
  • concat:合并数组,返回合并之后的新数组,不会改变原数组;
  • entries:返回一个迭代器对象,迭代参数为索引和元素;
  • keys:返回一个迭代器对象,迭代参数为索引;
  • values:返回一个迭代器对象,迭代参数为元素;

4. 数组去重

  • 通过filter去重
[1, 2, 3, 2, 4, 5].filter((item, i, array) => i === array.indexOf(item))
  • 通过Set去重
[...new Set([1, 2, 3, 2, 4, 5])]

5. apply、call、bind使用和区别

使用

都是为了改变函数执行上下文(即函数内部的this指向),第一个参数都是this需要指向的对象。

区别

  • call、apply的区别只是参数不同,call的参数是依次传递进去,apply的参数是个数组;
  • call、apply都是立即执行;
  • bind方法不会马上执行,会返回一直新的函数,并将第一个参数作为新函数的执行上下文,参数依次传递。

6. var、let和const的区别

  1. 变量提升:var会变量提升,初始化并不会被提升,let和const也会变量提升,但是在变量声明之前不能访问,即出现 “暂时性死区”;
  2. 作用域:var是函数作用域和全局作用域,let和const还有块级作用域;
  3. 重新声明:var可以多次声明,let和const在同一个作用域内不能多次声明;
  4. 不可重新赋值:const必须在声明的时候初始化,且之后不能重新赋值;

7. 函数的调用方式

  1. 直接调用
  2. 通过对象的方法调用
  3. 作为构造函数调用
  4. call、apply和bind调用

8. 箭头函数和普通函数有什么区别

  1. this绑定不同: 箭头函数的this指向上层或者上上层普通函数的this指向,普通函数的this根据调用方式不同而不同;
  2. arguments参数不同:箭头函数没有 arguments 参数,可使用(...args) => {} 拓展运算符来获取动态参数;
  3. 构造函数不同:箭头函数不能作为构造函数,
  4. call、apply和bind绑定this不同:普通函数可以显示地通过这几个方法设置this,但箭头函数通过这些方法也不会改变this;