1、js有哪些数据类型?有什么区别
js一共有Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt,八种数据类型。
Symbol:ES6新增数据类型,代表创建后独一无二且不可变的数据类型,主要是为了解决可能出现的全局变量冲突的问题。
BigInt:是一种数字类型数据,可以表示任意精度格式的整数,可以安全地存储和操作大整数。
其中,Undefined、Null、Boolean、Number、String是基础数据类型;对象、数组和函数是引用数据类型。两种数据类型的区别在于存储的位置不同,基础数据类型直接存储在栈中的简单数据段,占据空间小、大小固定;引用数据类型存储在堆中的对象,占据空间大、大小不固定,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
2、数据类型的检测方式
typeof
console.log(typeof 2); // number
instanceof
console.log('str' instanceof String); // false
constructor
console.log((2).constructor === Number); // true
Object.prototype.toString.call()
var a = Object.prototype.toString;
console.log(a.call(2));
3、判断数组的方式
Object.prototype.toString.call()
const obj = [1,2,3]
Object.prototype.toString.call(obj).slice(8,-1) === 'Array'; // true
通过原型链做判断
const obj = [1,2]
obj.__proto__ === Array.prototype; // true
Array.isArray()
const obj = [1,2,3]
Array.isArray(obj); // true
instanceof
const obj = [1,2,3]
obj instanceof Array // true
Array.prototype.isPrototypeOf
const obj = [1,2,3]
Array.prototype.isPrototypeOf(obj) // true
4、null和undefined的区别
undefined代表的是未定义,null代表的是空对象。一般在变量声明了还没有定义的时候,会返回undefined,null主要用于变量的初始化,赋值给一些可能会返回对象的变量。用typeof判断时,null会返回object,而undefined返回undefined。
null == undefined // true
null === undefined // false
5、typeof null 的值是什么
typeof null 的值是 object
null的值是机器码null指针(null指针的值全是0),即null的类型标签时000,和Object的类型标签一样,所以typeof null 的值是Object。
6、typeof undefined的值是什么
typeof undefined 的值是undefined
undefined的值是(-2)30,是一个超出证书范围的数字,所以typeof undefined的值是undefined。
7、instanceof操作符的实现原理及实现
instanceof运算符用于判断构造函数的prototype属性是否出现在对象的原型链中的任何位置。
function myInstanceof(left, right) {// 获取对象的原型let proto = Object.getPrototypeOf(left)// 获取构造函数的 prototype 对象let prototype = right.prototype; // 判断构造函数的 prototype 对象是否在对象的原型链上while (true) {if (!proto) return false;if (proto === prototype) return true;// 如果没有找到,就继续从其原型上找,Object.getPrototypeOf方法用来获取指定对象的原型proto = Object.getPrototypeOf(proto);}
}
8、如何安全的获取undefined值
因为undefined是一个标识符,所以可以被当作变量来使用和赋值,但是这样会影响undefined的正常判断。void不改变表达式的结果,只是让表达式不返回值。因此可以用void 0 来获得undefined。
9、typeof NaN的结果
NaN指不是一个数字,用于指出数字类型中的错误情况。
typeof NaN的结果是Number
NaN是一个特殊值,它和自身不相等,是唯一一个非自反的值。而NaN !== NaN 为true。
10、isNaN和Number.isNaN函数的区别
isNaN接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的值都会返回为true,非数字值传入也会返回true,会影响NaN的判断。
Number.isNaN会首先判断传入的参数是否为数字,如果是数字再继续判断是否为NaN,不会进行数据类型的转换,对结果更为准确。
11、== 操作符的强制类型转换规则
对于 == 来说,如果双方的数据类型不同,会先进行数据类型转换。判断规则如下:
a、判断两者类型是否相同,相同的话就比较二者大小
b、类型不同,就进行类型转换
c、会先判断是否再比对null和undefined,是的话就返回true
d、判断两者类型是否为string和Number,是的话,就将string转换为Number
e、判断一方是否为boolean,是的话就把boolean转为number再判断
f、判断一方是否为Object,且另一方为string、number或Symbol,是的话就把Object转换为基础数据类型,再进行转换。
12、其他值到字符串的转换规则
null转换为"null",undefined转换为"undefined";
true 转换为 "true",false 转换为 "false";
Number直接转换,不过那些极小和极大的数字会使用指数形式;
Symbol直接转换,但是只允许显式强制类型转换,使用隐式强制类型转换会产生错误。
13、其他值到Number的转换规则
null转换为0,undefined转换为 NaN;
true 转换为 1,false 转换为 0;
String的非数字值则转换为 NaN,空字符串为 0;
Symbol不能转换;
对象、数组首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字。
14、其他值到布尔的转换规则
只有undefined、null、false、0、NaN、""会被转换为false,其他均为true。
15、Object.is()和==、===的区别
双等号(==)进行相等判断时,如果两边的类型不一致,则会进行强制类型转化后再进行比较;
三等号(===)进行相等判断时,如果两边的类型不一致时,不会做强制类型准换,直接返回 false;
Object.is()来进行相等判断时,一般情况下和三等号的判断相同,它处理了一些特殊的情况,比如 -0 和 +0 不再相等,两个 NaN 是相等的。
16、+操作符什么时候用于字符串的拼接
如果 + 的其中一个操作数是字符串(或者通过以上步骤最终得到字符串),则执行字符串拼接,否则执行数字加法。对于除了加法的运算符来说,只要其中一方是数字,那么另一方就会被转为数字。
17、为什么会出现BigInt
avaScript中Number.MAX_SAFE_INTEGER表示最⼤安全数字,计算结果是9007199254740991,即在这个数范围内不会出现精度丢失(⼩数除外)。但是⼀旦超过这个范围,js就会出现计算不准确的情况,这在⼤数计算的时候不得不依靠⼀些第三⽅库进⾏解决,因此官⽅提出了BigInt来解决此问题。