判断boolean类型方法是否改变_面试题:判断数据类型的方法有哪些?

3092eee1b2c25c5ade69cfa6a1072894.png

在ECMAScript规范中,共定义了7种数据类型,分为基本数据类型和引用类型两大类,如下所示:

基本类型:Number、String、Boolean、Null、Undefined、Symbol(ES6)、BigInt(ES10)

引用类型:Obeject、Array、Date等等

  • 基本类型也称为简单类型,存储在栈中,可以按值访问
  • 引用类型也称为复杂类型,变量名和内存地址(指针)保存在栈中,属性和值存储在堆内存中

什么是原始值

原始值是固定而简单的值,是存放在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置

它有以下类型:Undefined,Null,Boolean,Number,String,Symbol,BigInt

具体内容可以去看看MDN,这里不做详细介绍

那么都有什么方法可以判断他们的类型呢?下面让我们分别来聊聊吧!

先来聊聊几种常用的判断方法:

typeof

只能区分基本类型(number、string、boolean、undefined、function、object)

如果数据类型为 null、array、object,使用typeof判断都会统一返回 object字符串

typeof undefined;    // undefined 
typeof null;    // object 
typeof true;    // boolean 
typeof 1;    // number 
typeof '123';    // string 
typeof Symbol('foo');   // symbol 
typeof 1n;     // bigint
typeof BigInt(1);   // bigint
typeof function(){};  // function 
typeof {a:1};    // object
typeof [];     // object
typeof window;    // object
typeof new Date();   // object
typeof /\s/;    // object
typeof Math.sign;   // function
typeof Math.PI;   // number

在这其中要注意的是:

  • 其中null返回了object是因为JavaScript语言设计遗留的问题
  • 对于引用类型,除 function 以外,一律返回 object 类型
  • 对于 function 返回 function

instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

原理:从当前引用的proto属性一层一层顺着原型链往上找,找到对应的prototype就返回true,否则返回false

  • 判断一个数据是否为某个对象的实例
function Father() {}
let son = new Father()
console.log(son instanceof Father)   //true
  • 判断一个数据是否为某个引用类型
console.log(function() {} instanceof Function)  //true
console.log([1,2,3] instanceof Array)     //true
console.log({a: 'b'} instanceof Object)     //true

要注意的是原始值使用instanceof都会返回false

[]、Array、Object 三者之间的关系

instanceof 能够判断出[ ].__proto__ 指向 Array.prototype

Array.prototype.__proto__ 又指向了Object.prototype

最终 Object.prototype.__proto__ 指向了null,标志着原型链的结束

650a259353e039def41d92b8b8a3f26b.png

值得一提的是

const h3 = null;
console.log(h3 instanceof Object); // false

null是空对象指针,因此typeof null === 'object',然而null又不是object的引用类型的实例,因此使用instanceof会显示false

另一个场景:

// a.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值