如何判断数据类型(全)

提示:本章技术分享为如何判断javascript 的数据类型


前言

提示:这里需要在介绍一些新的数据类型以及初步介绍:
javascript的数据类型一共有7种:
Undefined / Null / Boolean / String / Symbol / Number / Object


提示:以下是本篇文章正文内容,下面案例可供参考

一、判断方法

1.typeof

typeof 可以用来区分除了null类型之外的原始数据类型,对象类型的可以从普通对象里面识别出函数:

typeof undefined // "undefined"

// 这里需要注意的是typrof在这里之间检测出null为是对象类型
typeof null      // "object"

typeof 1         // "number"

typeof "1"       // "string"

typeof Symbol    // "symbol"

typeof function(){} // "function"
                           

看到以上检测的结果,我们发现typeof 不能识别出null,

一、那我们怎么才能识别出null呢?

如果想要判断是否为null 可以直接使用===(全等运算符)来进行判断(或者使用 Object.prototype.toString方法):

let a = null ;
a === null  // true 

二、 typeof作用于未定义的变量,会报错吗?

不会! 会返回undefined.

typeof randomVariable // 'undefined'

三、typeof Number(1)返回的是什么?

返回:“number”

注意: Number和String作为普通函数调用的时候,是将参数转化为相应的原始数据类型,也就是类似于做一个强制类型转换的操作,而不是默认当做构造函数调用.

注意和Array的区分 / Array(…)等价于new Array(…)

typeof Number(1)     // "number"
typeof String("1")   // "string"
Array{1,2,3}
// 等价于
new Array{1,2,3}

四、 typeof new Number(1)返回的是什么?

返回的是:“object”

typeof new Number(1)  // "object"
typeof new String(1)  // "object"

2.instanceof

instanceof 不能用于判断原始数据类型的数据

3 instanceof Number     // false
"3" instanceof String   // false
true instanceof         // false

instanceof 可以用来判断对象的类型

let date = new Date()
date.instanceof Date     //  true

let number = new Number()
number.instanceof Number // true

let string = new String()
string.instanceof String // true

需要注意的是,instanceof的结果并不一定是可靠的,因为在ECMAScript7规范中,可以通过自定义Symbol.haslnstance 方法来覆盖默认行为!

3.Object.prototype.toString

Object.prototype.toString.call(undefined).slice(8,-1) // "undefined"
Object.prototype.toString.call(null).slice(8,-1)      // "Null"
Object.prototype.toString.call(3).slice(8,-1)         // "Number"
Object.prototype.toString.call(new Number(3)).slice(8,-1) //"Number"
Object.prototype.toString.call(true).slice(8,-1)     //"Boolean"
Object.prototype.toString.call("3").slice(8,-1)      //"String"
Object.prototype.toString.call(Symbol()).slice(8,-1) // "Symbol"

由上的示例可知,该方法没有办法区分:

数字类型和数字对象类型

同理还有:

字符串类型和字符串对象类型,布尔类型和布尔对象类型

另外:ECMAscript7规范定义了符号Symbol.toStringTag
你可以通过这个符号自定义Object.prototype.toString方法的行为:

'use strict'
 let number = nrew Number(3)
 number[Symbol.toStringTag] ='Custom'
 Object.prototype.toString.call(number).slice(8,-1) // "Custom"
 
 function a(){}
 a[Symbol.toStringTag]='Custom'
 Object.prototype.toString.call(a).silce(8,-1)      // "Custom"
 
 let array =[]
 array[Symbol.toStringTag]='Custom'
 Object.prototype.toString.call(array).silce(8,-1)  // "Custom"

因为Object.prototype.toString方法可以通过Symbol.toStringTag属性来覆盖默认行为,所以使用这个方法来判断数据类型也不一定是可靠的

4.Array.isArray

Array.isArray(value)可以用来判断value是否为数组

Array.isArray([])   // true
Array.isArray({})   // false
(function (){
console.log(Array.isArray(arguments))
}())               // false

总结

总结:
以上就是对各种数据类型的判断方法,我们可以根据不同的数据类型选择相对应的数据类型判断方法,编写不易,望大家前端之路洒满阳光!
谢谢!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值