js面试---数据类型

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来解决此问题。

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值