• js数据类型判断的五种方法及归纳。


    js数据类型

    众所周知,js数据类型分为原始数据类型和引用数据类型,原始数据类型包括Number,String,boolean,undefined,null,储存在栈内存中,栈中储存的数据就是数据本身。引用数据类型包括function,object,Array。储存在堆内存中,其中在栈内存中储存了指针,保存了数据在堆内存中的位置。
    当然,在es6引入了Symbol数据类型和BigInt数据类型,其中Symbol代表创建后独一无二且不变的数据类型,主要作用是为了解决可能出现的全局变量冲突的问题;BigInt是一种升级版的Number数据类型,可以安全储存和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。本博客暂不讨论这两种数据类型的判断。

    方法1:typeof

    console.log(typeof 2)							// 'number'
    console.log(typeof 'dghh')						// 'string'
    console.log(typeof true)						// 'boolean'
    console.log(typeof undefined)					// 'undefined'
    console.log(typeof null)						// 'object'
    console.log(typeof [1,2,3])						// 'object'
    console.log(typeof function(){})				// 'function'
    console.log(typeof {})							// 'object'
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中数组,对象,null判断都为object,无法判断这三者数据类型,其余均正确。

    方法2:===

    其实这种方法只针对数据类型的可选值只有一种的情况,可判断null和undefined。

    let a = undefined
    let b = null
    console.log(a === undefined)			// true
    console.log(b === nul)					// true
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    方法3: instanceof

    该方法可判断对象的具体数据类型,原理为在左边参数的原型链是否能找出右边构造函数的原型。

    console.log(2 instanceof Number)						// false
    console.log('dghh' instanceof String)					// false
    console.log(true instanceof Boolean)					// false
    console.log(function() {} instanceof Function)			// true
    console.log([1,2] instanceof Array)						// true
    console.log({} instanceof Object)						// true
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意这里判断时,右边为构造函数,首字母大写,返回值是boolean类型。

    方法4:constructor

    constructor有两个作用,一是判断数据类型,二是实例对象可以通过调用该属性查看构造函数,由于null与undefined并不能使用构造函数构造,因此constructor无法判断null与undefined。

    console.log((2).constructor === Number)					// true 这里数字直接量如果不加括号直接调用,数字后小数点会引发歧义
    console.log(''.constructor === String)					// true
    console.log(true.constructor === Boolean) 				// true
    console.log(function(){}.constructor === Function)		// true
    console.log([].constructor === Array)					// true
    console.log({}.constructor === Object)					// true
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里需要注意一点,constructor的原理是找到构造函数来判断数据类型,但根据原型链的知识,当数据类型的原型被修改时,constructor方法就失效了,例如:

    function Fun() {}
    Fun.prototype = new String()	//修改原型
    let fun = new Fun()
    console.log(fun.constructor)	// function String()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    方法5:toString()方法

    但是由于number,array,function等都重写的Object的toString()方法,因此需要使用Object原型上的toString()方法,并用call绑定到需要检测的变量上,该方法可判断所有数据类型,但只能通过输出来观察数据类型。当然,如果实在有判断需求,可通过返回值为字符串,通过slice(8,-1)来截取字符串判断。如下:

    let toS = Object.prototype.toString()
    console.log(toS.call(1))				// '[object Number]'
    console.log(toS.call(1).slice(8,-1))	// 'Number' 截取字符串判断
    console.log(toS.call('dghh'))			// '[object String]'
    console.log(toS.call(true))				// '[object Boolean]'
    console.log(toS.call([]))				// '[object Array]'
    console.log(toS.call(function() {}))	// '[object Function]'
    console.log(toS.call({}))				// '[object Object]'
    console.log(toS.call(undefined))		// '[object Undefined]'
    console.log(toS.call(null))				// '[object Null]'
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    22杭电多校11 Find different(环计数问题)
    十六、垃圾回收相关概念
    音视频发展调研
    vulnhub之Ripper
    SAP中己经用MBST冲销的凭证,可以再次用MBST冲销吗?
    关于近期IP-Guard新版本客户端重复发送邮件的问题处理说明
    Libvirt Java API操作QEMU虚拟机(重启,强制关机,挂起,恢复,详情,关机,注销,快照备份等 )(CentOS)
    Qt ModelView显示数据库数据
    高空简易水果采摘装置设计(CAD+proe)
    Java实现数字的千分位的处理
  • 原文地址:https://blog.csdn.net/qq_44930379/article/details/125475391