1.判断一个对象上是否有某属性
① 通过点. 或者方括号[]
let test = { name: ‘he’ }
test.name , test[‘name’] // 都会输出he。当属性不存在会返回undefined
test[‘toString’] // ƒ toString() { [native code] } 原型链上有的toString方法,也能返回
② in 运算符
如果指定的属性在指定的对象或其原型链中,则in 运算符返回true。无法区分是自身还是原型上的属性
let test = { name: ‘he’ }
‘name’ in test // true
‘undefine’ in test // true undefined属性也可正常判断
③ hasownProperty()
test.hasownProperty('name’) // true. 自身的属性
test.hasownProperty(‘toString’) // fasle ,原型链上的属性
2.判断JS数据的类型
①.typeof
只会返回以下几种类型 number, boolean, string, function,object,undefined
注意: typeof(Null, Array,对象) 返回的都是是object (typeof 的局限性)
②.instanceof
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
用法:A instanceof B ,判断A是否是B的实例(检测的是原型),返回true或false
var b = '123'; alert(typeof b); //string
alert(b instanceof String); //false
var c = new String("123"); alert(typeof c); //object
alert(c instanceof String); //true
③.constructor
函数定义时,js引擎会为函数添加prototype对象指向原型,在prototype上添加constructor属性,指向该函数. 从原型链角度讲,这个时候构造函数F就是新对象f的类型。
注: 基本类型 null和undefined这两不能适用constructor。因为他是无效对象,因此不会有constructor存在,需要用其他方法判断
基本用法:
var a='we'
a.constructor === String // true
④.Object.prototype.toString.call()
toString()是Object原型上的方法,调用该方法默认返回当前对象的[[Class]], 这是内部属性,返回格式[object 类型]
Object.prototype.toString.call('') //[object String]
Object.prototype.toString.call([1,2,3]) // [object Array]
⑤.判断数据类型(结合以上 typeof 和instanceof ,适用于所有数据的方法)
function getDataType (obj) {
if (obj === null) {
return 'null'
} else if (typeof obj === 'object') {
if (obj instanceof Array) {
return 'array'
} else {
return 'object'
}
} else { return typeof obj }
}
例子:
- 判断一个对象是否属于数组
①Objct.prototype.toString.call(obj)="[object Arrary]" (最佳)
②obj instanceof Array
③typeof obj"object" &&obj.constructor==Array
3.判断一个变量是否为空对象
注意: 存在一个问题,对象上不可枚举的属性以下都不可行
①. json对象转化成json字符串,在判断该字符串是否为{}
var b = (JSON.stringify(obj) === ‘{}’)
②. Object.keys() 【ES6新增】
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。如果我们的对象为空,他会返回一个空数组。将所有可枚举属性键名列举到数组中,判断数组长度是不是0