JavaScript中typeof和instanceof的介绍

本文介绍了JavaScript中的类型检测方法,包括typeof操作符的使用及其返回值,如何判断一个变量是否为对象或数组,以及instanceof运算符的原理和使用场景。

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

typeof

typeof操作符返回一个字符串,指示未经计算的操作数的类型。

typeof operation

operation是一个表达式,表示对象或原始值,其类型将被返回。
对应不同的数据类型可能的返回值有:

String ==> string
Undefined ==> undefined
Number ==> number
Boolean ==> boolean
Null ==> object
函数对象 ==> function
任何其他对象 ==> object
Symbol(ES6新增的) ==> symbol

这里写图片描述

这里写图片描述

(undefined, number, string, boolean)属于简单的值类型,不是对象。剩下的几种情况——函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型
判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。

var fn = function() {};
console.log(fn instanceof Object);  // true

在JavaScript中,对象是对象,数组也是对象,函数竟然也是对象!对象里面的一切都是属性,只有属性,没有方法。javascript中的对象可以任意的扩展属性,函数和数组怎么定义属性呢?

typeof $     // 返回 "function",在jquery中$是一个函数
$.trim('   123 ')    // trim就是$的一个属性,属性值是函数

一切(引用类型)都是对象,对象是属性的集合。

instanceof

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

所有构造函数都继承自Object,而继承Object是自动完成的,不需要我们手动继承。

function fn() {
    console.log('fn is a function');
}
fn.a = 1;
fn.b = {
    name: 'test'
};
fn.c = function() {
    console.log('c is an attribute of the function fn');
}
console.log(typeof fn);  // function
fn.c();  // c is an attribute of the function fn
object instanceof constructor

object [要检测的对象] constructor [某个构造函数]
用来检测 constructor.prototype 是否存在于参数 object 的原型链上

function C() {}
var c = new C();
console.log(c instanceof C);  // true
C.prototype = {};
console.log(c instanceof C);  // false,因为C.prototype指向了一个空对象,这个空对象不在o的原型链上

obj instanceof Foo 返回true,则并不意味着该表达式会永远返回true,因为Foo.prototype属性的值有可能会改变,改变之后的值很有可能不存在于obj的原型链上,这时原表达式的值就会成为false。
借助于非标准的__proto__魔法属性,可以改变对象的原型。

判断一个变量是否为数组

导言:
toString()——每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中type是对象的类型。

判断一个变量是否为数组的通用方法:

var ary = [1, 3, 4, 45];

function isArray(array) {
    return Object.prototype.toString.call(array) == '[object Array]';
}

isArray(ary);  // true

注意:Array属于引用型数据,在传递过程中,仅仅是引用地址的传递。

console.log(ary.__proto__.constructor == Array); // true.该方法有一定的弊端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值