js检测数据类型得四种方式
1.typeof:返回一个字符串,表示操作数的类型。
语法:
typeof(变量) //or typeof 变量
示例:
console.log(typeof 2)//number
console.log(typeof true)//boolean
console.log(typeof 'str')//string
console.log(typeof function () {
})//function
console.log(typeof console.log);//function
console.log(typeof {})//object
console.log(typeof [])//object
console.log(typeof (new Date()))//object
console.log(typeof window)////object
console.log(typeof undefined)//undefined
console.log(typeof null)//object
console.log(typeof Symbol()); //symbol(es6)
console.log(typeof 23423n); //bigint(谷歌67版本新提出)
总结:
- typeof 的返回类型为字符串,值有:number、boolean、string、object、function、undefined、symbol、bigint
- typeof 一般用来判断基本数据类型,除了判断null会输出"object",其它都是正确的
- typeof 判断引用数据类型时,除了判断函数会输出"function",其它都是输出"object"
注意:这里涉及两个经常考的面试题!
- null 的数据类型是object (null是一个空的引用对象,是一个占位符)
- console.log 的数据类型是function
- 对于引用数据类型的判断,使用typeof并不准确,所以可以使用instanceof来判断引用数据类型
2.instanceof:用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。
语法:
obj1 instanceof obj2 //obj1 是否是 obj2的实例
示例:
console.log(2 instanceof Number)//false console.log(true instanceof Boolean)//false console.log('str' instanceof String)//false console.log([] instanceof Array)//true console.log(function () { } instanceof Function)//true console.log({} instanceof Object)//true
总结:
- instanceof 只能正确判断引用数据类型,而不能判断基本数据类型。
- instanceof 返回值为布尔值
注意:
- instanceof只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型
3.constructor:该属性本来是原型对象上的属性,指向构造函数。但是根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor属性的。
示例:
var num = 123; console.log(num.__proto__)//Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, …} console.log(num.constructor)// Number() { [native code] } console.log(num.constructor == Number)//true
补充:
function Person() { } var Tom = new Person(); // undefined和null没有constructor属性,所以只有在确定待判断的值不是undefined和null才能使用 console.log(Tom.constructor == Person)//true console.log((123).constructor == Number)//true console.log('abcdef'.constructor == String)//true console.log((true).constructor == Boolean)//true console.log([1, 2, 3, 4].constructor == Array)//true console.log(new Date().constructor == Date)//true console.log(new Error().constructor == Error)//true console.log(window.constructor == Window)//true
总结:
所有对象(使用 Object.create(null) 创建的对象除外)都将具有 constructor 属性。在没有显式使用构造函数的情况下,创建的对象(例如对象和数组文本)将具有 constructor 属性,这个属性指向该对象的基本对象构造函数类型。
注意:
- null和undefined是无效的对象,所以他们不会有constructor属性!
- 函数的constructor是不稳定的,主要是因为开发者可以重写prototype,如果创建一个对象来改变它的原型,constructor 就不能用来判断数据类型了:
function Fn() { } var f_test = new Fn() console.log(f_test.constructor == Fn)//true ``` 修改其prototype后 ``` Fn.prototype = new Array() var f_test = new Fn() console.log(f_test.constructor == Fn)//false console.log(f_test.constructor == Array)//true
4.Object.prototype.toString.call()
官网解释:每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。以下代码说明了这一点:
var o=new Object() console.log(o.toString())//[object Object]
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
示例:
console.log(Object.prototype.toString.call('')); // [object String] console.log(Object.prototype.toString.call(1)); // [object Number] console.log(Object.prototype.toString.call(true)); // [object Boolean] console.log(Object.prototype.toString.call(Symbol())); // [object Symbol] console.log(Object.prototype.toString.call(undefined)); // [object Undefined] console.log(Object.prototype.toString.call(null)); // [object Null] console.log(Object.prototype.toString.call(new Function())); // [object Function] console.log(Object.prototype.toString.call(new Date())); // [object Date] console.log(Object.prototype.toString.call([])); // [object Array] console.log(Object.prototype.toString.call(new RegExp())); // [object RegExp] console.log(Object.prototype.toString.call(new Error())); // [object Error] console.log(Object.prototype.toString.call(document)); // [object HTMLDocument] console.log(Object.prototype.toString.call(window)); // [object global] window 是全局对象 global 的引用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2016-10-08 es6学习笔记一数组(中)