检测原始值
若检测一个值是字符串、数字、布尔值或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