在掘金课堂上听课后对于之前不懂的很多基础八股问题有了更深的理解,所以把一些八股问题和答案总结在这里。希望大家对照查漏补缺
原始值和引用值类型及区别
首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变。原始值(简单数据类型)
存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。包含五种:undefined,null,boolean,number和string。
引用值(复杂数据类型)
存储在堆中的对象,放在变量的栈空间中的值是该对象存储在堆中的地址,也就是说,存储在变量处的值是一个指针(内存地址),指向存储对象的堆内存中,包含Object,array,function等
可以通过typeof来判断某数据是何简单数据类型。插入: typeof mdn 文档
function type(value) {
if (value === null) {
return "null";
}
判断数据类型typeof, instanceof, Object.prototype.toString.call(), constructor
typeof
typeof是编程语言的一种运算符,用于确定变量的数据类型。这在程序结构可以接受多种数据类型且无需显式指出具体类型时非常有用。function type(value) {
if (typeof(value) === string) { ... }
...
}
因为JavaScript 对传递参数无数据类型要,可通过typeof进行参数数据类型确认
缺点
The typeof operator returns "object" for objects, arrays, and null. The typeof operator does not return "object" for functions,所以说 `typeof` 并不能准确判断变量到底是什么类型instanceof
向下转型时,最好借助instanceOf进行类型判断;防止类型不一致时出现强制类型转换异常object instanceof constructor
console.log(1 instanceof Number); //错误
缺点
-
基本数据类型的实例是无法检测
-
无法检测 null 和 undefined
constructor
constructor 作用和 instanceof 非常相似。但 constructor 检测 Object 与 instanceof 不一样,还可以处理基本数据类型的检测。const a = 1;
console.log(a.constructor === Number); //true
缺点
-
无法检测undefined/null, 因为他们没有constructor
-
函数的
constructor是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的constructor给覆盖了,这样检测出来的结果就是不准确的,由此可知instanceof同样也存在这个问题。
Object.prototype.toString.call()
日常开发中,typeof,instanceof 和Array.isArray()能够满足所需,Object.prototype.toString.call更像是锦上添花,但是,Object.prototype.toString.call有原生的限制,它拿非原生构造函数没啥办法。也就是说自己写的Class,new出来的对象,用Object.prototype.toString.call(),返回的结果是[Object object],const a = 0;
Object.prototype.toString.call(a); //return '[object Number]'
还有检测是否为数组的Array.isArray()等检测方式
类数组和数组的区别与转换
常见伪数组: 有argument和DOM元素集合。伪数组的类型是专门的引用类型。 (比如通过 document.querySelectorAll 得到的列表)
const add = (a,b)=>{
console.log(add.length);//return 2
return a+b;
}
数组的常见API
"JS数组API"指的是JavaScript编程语言中提供的用于操作数组的一组接口(API),这些接口可以帮助开发者对数组进行添加、删除、替换、排序、过滤、映射等操作。可以理解为数组api为数组的常用自带function一些常用的JS数组API包括:
- push() / pop():在数组末尾添加/删除元素
- unshift() / shift():在数组开头添加/删除元素
- splice():添加、删除、替换元素
- slice():返回指定位置的元素组成的新数组
- concat():合并两个或多个数组
- filter():返回符合条件的元素组成的新数组
- map():对数组中的每个元素进行操作后返回新的数组
- forEach():数组中每个元素进行操作后返回undefined,原数组不改变
let arry = [1, 5, 10, 15];
let arry1 = arry.map( x => x + 2);
console.log(arry1) // [ 3, 7, 12, 17 ] 原数组不变,返回改变后的新数组
const a = [1,2,3,4,5];
a.forEach(item => console.log(++ item));//数组a不变,输出2,3,4,5
- reduce():对数组中的所有元素进行累加或累乘操作
- sort():对数组元素进行排序
...等