目录
1、js数据类型有哪些
JS的数据类型分为:基本类型和引用类型
基本类型:数字类型(Number)、 字符串类型(String)、 布尔类型(Boolean)、
空型(null)、未定义类型(undefined)、唯一值(Symbol)
引用类型:数组、函数、对象、set 、map
2、内置对象有哪些
数学对象:Math
日期对象:new Date()
数组对象:new Array()
字符串对象:new String()
3、数组去重几种方式
(1)ES6中的Set方法:利用其特性:set结构中的成员不能重复
(2)includes
(3) 双重for循环
(4)indexOf
新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。
(5)sort方法:
利用sort()排序方法,然后根据排序后的结果进行遍历及相邻元素比对。
(6)Map方法:
创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。
4、数组深拷贝几种方式
(1)遍历(仅限于一层,数组的item是基本类型)
let a = [1,2,3,4];
let b = [];
a.forEach(item=>{
b.push(item)
});
console.log(b);//拷贝后a和b的值相同
a[0] = 5;
console.log(b);//即使改变a的值,b的值也不会发生改变
(2)ES6展开符...(仅限于一层,数组的item是基本类型)
let a = [1,2,3,4];
let b = [...a];
console.log(b);
a[0] = 5;
console.log(b);
(3)concat()函数
let a= [1,2,3,4];
let b = a.concat();
console.log(b);
a[0] = 5;
console.log(b);
5、对象深拷贝几种方式
深拷贝:将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据
浅拷贝:只是将数据中所有的数据引用下来,依旧指向同一个存放地址,拷贝之后的数据修改之后,也会影响到原数据的中的对象数据
(1)for循环
(2)JSON:利用JSON.stringify()以及JSON.parse()
(3)扩展运算符
6、定时器有几种,有什么区别
setTimeout(回调函数,时间):在指定的时间后(单位为毫秒),执行某些代码,
代码 只会执行一次
setTimeout(function () {
console.log('5s 后调用回调函数')
}, 5000)
setInterval(回调函数,时间):按照指定的周期(单位为毫秒)来重复执行某些代码,
定时器不会自动停止,除非调用 clearInterval() 函 数
手动停止或着关闭浏览器窗口
let timeId = setInterval(function () {
console.log('1s 调用 1 次回调函数')
}, 1000)
// 使用clearInterval(timeId) 停止间隔函数
7、说下对Promise的理解
Promise是一个构造函数,可以通过 new Promise()得到一个 Promise 的实例,参数是一个回调函数,该回调函数有两个参数resolve和reject。resolve是成功后的回调函数,reject是失败后的回调函数。
Promise对象有三种状态:
(1)pendding:表示初始状态;
(2)fulfilled:resolve方法调用的时候,表示操作成功;
(3)rejected:reject方法调用的时候,表示操作失败;
状态只能从pendding---->fulfilled或者pendding---->rejected,不能逆向转换调用promise对象。
(1)promise实例化对象.then(function(res){});
成功执行then方法,第一个then方法的res是resolve的参数,之后的then方法 中的res是上一个then方法的返回值
(2)promise实例化对象.catch(function(err){});
成功执行catch方法,err是reject的参数
(3)支持链式调用:一直.then
8、说下对模块导入导出的理解
为解决大型系统的javascript文件经常存在复杂的依赖关系,后期的维护成本会越来越高的问题产生了模块化
导出:选择性地给其他模块暴露(提供)自己的属性和方法,供其他模块使用。
导入:可以根据需要,引入其他模块的提供的属性或者方法,供自己模块使用。
批量导出:export {name,age}
批量导入:import {name,age} from “url”;
整体导入:import * as obj from “url” 变量作为obj的属性
重命名导出的变量:import {旧名字 as 新名字} from “url”;
默认导出:export default 变量 (导出没有名字的变量,只能有一个)
9、箭头函数和普通函数的区别
(1)外形不同:箭头函数更简洁,不需要function,需要在()后加=>
如果只有一个参数可以省略(),
如果函数只有一个return语句,可以省略return 和 {}
(2)箭头函数全都是匿名函数:普通函数可以有匿名函数,也可以有具名函数
(3)箭头函数不能用于构造函数:普通函数可以用于构造函数,以此创建对象实例。
(4)箭头函数中 this 的指向不同:在普通函数中,this 总是指向调用它的对象,
如果用作构造函数,它指向创建的对象实例。
(5)箭头函数不具有 arguments 对象:每一个普通函数调用后都具有一个arguments 对象,
用来存储实际传递的参数。但是箭头函数并没有此对象。
(6)其他区别:箭头函数不具有 prototype 原型对象。
箭头函数不具有 super。箭头函数不具有 new.target
10、数组排序的几种写法
(1)利用sort()方法排序
(2)选择排序法:每次找到剩余的最大的或者最小的
(3)冒泡排序法:每次比较两个相邻的数,一次循环能确定一个最大值或者最小值
(4)插入排序法:选定第一个元素,一次扫描后面的元素,放到合适位置