JavaScript 检测类型

检测原始值

若检测一个值是字符串、数字、布尔值或undefined,选择使用typeof运算符

  • 对于字符串,typeof返回"string"
  • 对于数字,typeof返回"number"
  • 对于布尔值,typeof返回"boolean"
  • 对于undefind,typeof返回"undefind"

typeof 基本语法

typeof '123123'

注意:"typeof null"返回的是"object"

检测引用值

若检测一个值是引用类型,选择使用instanceof运算符;如:Object、Array、Date和Error

instanceof 基本语法

value instanceof Object (返回结果true或false)
// 检测日期
if (value instanceof Data) {
    console.log(value.getTime())
}
// 检测正则表达式
if (value instanceof RegExp) {

}
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。 instanceof不仅能检测构造这个对象的构造器,还能检测原型链;默认情况下,每个对象都继承Object,因此每个对象的 value instanceof Object都会返回true,如:
let now = new Date()
console.log(now instanceof Object); // true
console.log(now instanceof Date); // true

// instanceof运算符也可以检测自定义的类型
function Person(name) {
      this.name = name
}
let me = new Person('Jack')
console.log(now instanceof Person); // true
在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。
假设一个frame或window (frameA)里的一个对象被传入到另一个frame或window (frameB)中。这两个里面都定义了构造函数Person。如果来自frameA的对象 是frameA的Person的实例,则:
frameA instanceof frameAPerson // true 
frameA instanceof frameBPerson // false
会出现这种情况是因为每个帧(frame)都拥有Person的一份拷贝,它被认为是改帧(frame)中的Person的拷贝的实例。 这个问题不仅出现在自定义类型身上,函数和数组 也有这个问题,不过对于这两个类型一般用不着使用instanceof.
 

检测函数

检测函数最好的方法是使用typeof

function fn() {}
console.log(typeof fn === 'function') // true

检测数组

检测数组可以使用ECMASript5中的Array.isArray()

function isArray(value) {
     if (typeof Array.isArray === 'function') {
         return Array.isArray(value)
     } else {
         return Object.prototype.toString.call(value) === "[object Array]"
     }
}

检测属性

判断属性是否存在使用in运算符,in运算符仅仅会简单的判断属性是否存在,而不会去读取属性的值;如果实例对象的属性存在、或者继承自对象的原型,in运算符 都会返回true,如:

let obj = {
      id: 10,
     name: 'abc'
}
if ('name' in obj) {
      console.log(obj.name)
}

如果只想检查实例对象的某个属性是否存在,则使用hasOwnProperty()方法。所有继承自Object的JavaScript对象都有这个方法,如果实例中存在 这个属性则返回true(如果这个属性只存在于原型里,则返回false),如:

let object = {
     id: 10,
     name: 'abc'
}
if (object.hasOwnProperty('name')) {
     console.log(object.name)
}

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof 

原文地址:https://www.cnblogs.com/wjz-page/p/13340291.html