1. js中的数据类型
1.1 基本数据类型
- Number
- String
- Boolean
- undefined
- null
- Symbol
- Bigint
1.2 引用数据类型
- Object
- Array
- Function
- 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的区别
- 变量提升:var会变量提升,初始化并不会被提升,let和const也会变量提升,但是在变量声明之前不能访问,即出现 “暂时性死区”;
- 作用域:var是函数作用域和全局作用域,let和const还有块级作用域;
- 重新声明:var可以多次声明,let和const在同一个作用域内不能多次声明;
- 不可重新赋值:const必须在声明的时候初始化,且之后不能重新赋值;
7. 函数的调用方式
- 直接调用
- 通过对象的方法调用
- 作为构造函数调用
- call、apply和bind调用
8. 箭头函数和普通函数有什么区别
- this绑定不同: 箭头函数的this指向上层或者上上层普通函数的this指向,普通函数的this根据调用方式不同而不同;
- arguments参数不同:箭头函数没有 arguments 参数,可使用(...args) => {} 拓展运算符来获取动态参数;
- 构造函数不同:箭头函数不能作为构造函数,
- call、apply和bind绑定this不同:普通函数可以显示地通过这几个方法设置this,但箭头函数通过这些方法也不会改变this;