JS数据类型检测

JS数据类型检测的方法有哪些

JavaScript中数据类型有哪些

JavaScript中,数据类型分为原始类型和对象类型
原始数据类型包括

  • String:表示一个字符串,例如:’jingzhi‘
  • Number:表示一个数值,例如:123
  • Boolean:表示一个布尔类型的数据,值有两种truefalse
  • Null:表示一个指向不存在或无效的对象或地址引用
  • Undefined:一个变量未赋值时的状态,表示未定义
  • Symbol:声明一个符号,符号拥有唯一性,且不能参与运算,例如:const a = Symbol('a')
    引用数据类型包括
  • Object:表示一个对象,例如:var a = {}
  • Function:表示一个函数,例如function foo() {}
  • Array:表示一个数组,例如:[1, 2, 3, 4, 5]
  • 剩下的还有很多,例如:DateMathSetMap等等

JavaScript中检测数据类型的方法有哪些?

typeof

typeof 'a' // 'string'
typeof 1 // 'number'
typeof NaN // number
typeof true // 'boolean'
typeof undefined // 'undefined'
typeof null // 'object'
typeof Symbol('a') // 'object'
typeof {} // 'object'
typeof [] // 'object'
typeof /a/ // 'object'
typeof function() {} // 'function'
....

结论:

  1. 可以看到typeof只能检测出除了null以外的原始数据类型
  2. typeof只能判断对象类型中的Function,其余的都为Object

instanceof

console.log(1 instanceof Number) // false
console.log(new Number(1) instanceof Number) // true

const arr = []
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // true

function Fn() {
	this.name = '构造函数'
}
Fn.prototype = Object.create(Array.prototype)
let a = new Fn()
console.log(a instanceof Array) // true

instanceof用来检测构造函数的prototype属性是否出现在某个实例对象的原型链上,例如:a instanceof B,意为a是否为B的实例,即a的原型链上是否有B
结论:

  1. instanceof可以准确判断引用(对象)类型,但不能准确检测原始类型
  2. 由于原型的指向是可以修改的,因此这种检测方式不安全

Object.prototype.toString.call()

Object.prototype.toString({}) // '[object Object]'
Object.prototype.toString.call({}) // '[object object]'
Object.prototype.toString.call('a') // '[object String]'
Object.prototype.toString.call(1) // '[object Number ]'
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
Object.prototype.toString.call(Symbol('a')) // '[object Symbol]'
Object.prototype.toString.call(11n) // '[object BigInt ]'
Object.prototype.toString.call(/a/) // '[object RegExp ]'
Object.prototype.toString.call(new Date()) // '[object Date]'
Object.prototype.toString.call([0, 1, 2]) // '[object Array]'
Object.prototype.toString.call(function () { }) // '[object Function]'
Object.prototype.toString.call(new Error()) // '[object Error]'
Object.prototype.toString.call(new Set()) // '[object Set]'
Object.prototype.toString.call(new Map()) // '[object Map]'

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

上一篇:Arrays.deepToString()与Arrays.toString()的区别


下一篇:c#-使用PdfSharp在页面的右侧截断页面以横向修剪