提示:本章技术分享为如何判断javascript 的数据类型
文章目录
- 前言
- 一、判断方法
- 1.typeof
- 一、那我们怎么才能识别出null呢?
- 二、 typeof作用于未定义的变量,会报错吗?
- 三、typeof Number(1)返回的是什么?
- 四、 typeof new Number(1)返回的是什么?
- 2.instanceof
- 3.Object.prototype.toString
- 4.Array.isArray
- 总结
前言
提示:这里需要在介绍一些新的数据类型以及初步介绍:
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
总结
总结:
以上就是对各种数据类型的判断方法,我们可以根据不同的数据类型选择相对应的数据类型判断方法,编写不易,望大家前端之路洒满阳光!
谢谢!