typeof与instanceof的区别和用法

本文主要介绍了JavaScript中typeof和instanceof的用法及区别。typeof在最初实现中存在判断null为'object'的问题,用'new'实例化构造函数多为'object'类型,括号对确定表达式类型有用。而typeof判断引用类型不精确时,可用instanceof判断,它有特定使用规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、typeof
typeof 操作符返回一个字符串,表示未经计算的操作数的类型。
 
console.log(typeof 3.14); //number
console.log(typeof Math.LN2); //number
console.log(typeof Infinity); //number
console.log(typeof NaN); // number  NaN是"Not-A-Number"的缩写
console.log(typeof ""); //string
console.log(typeof "bla"); //string
console.log(typeof (typeof 1)); // string  typeof 操作符返回一个字符串
console.log(typeof true); //boolean
console.log(typeof false); //boolean
console.log(typeof function () { }) //function
console.log(typeof Math.sin)        //function
console.log(typeof new Function())  //function
console.log(typeof [1, 2, 4]);      //object
console.log(typeof new Date());     //object
console.log(typeof null); //object   从一开始出现JavaScript就是这样的

解析:
在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,
null的类型标签也成为了 0,typeof null就错误的返回了"object".ECMAScript提出了一个修复(通过opt-in),但被拒绝。这将导致typeof null === ‘null’

使用 new 操作符

All constructor functions while instantiated with ‘new’ keyword will always be typeof ‘object’
用“new”关键字实例化时,所有构造函数函数都将始终为“object”类型

var str = new String('String');
var num = new Number(100);
console.log(typeof str); //object
console.log(typeof num); //object

But there is a exception in case of Function constructor of Javascript
但对于javascript的函数构造函数有一个例外

var func = new Function();
console.log(typeof func); //function
语法中需要括号

Parentheses will be very much useful to determine the data type for expressions.
括号对于确定表达式的数据类型非常有用。

var iData = 99;
console.log(typeof iData + ' Amy');  //number Amy
console.log(typeof (iData + ' Amy')); //string
二、instanceof
instanceof运算符测试构造函数的原型属性是否出现在对象的原型链中的任何位置。
 

对于值类型,你可以通过typeof判断,string/number/boolean都很清楚,但是typeof在判断到引用类型的时候,返回值只有object/function,你不知道它到底是一个object对象,还是数组,还是new Number等等。这个时候就可以使用instanceof。使用instanceof有很多细节问题 。

Instanceof 的使用规则是: A instanceof B

A沿着proto这条线来找,同时B沿着prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false

function Foo() {}
var foo = new Foo();
console.log(foo instanceof Foo);    //true
console.log(foo instanceof Object); //true
console.log(Function instanceof Object); //true

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof
https://blog.youkuaiyun.com/qinxuan_1002/article/details/79246355

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值