天天看点

JavaScript中typeof,instanceof,hasOwnProperty,in的用法和区别

<code>typeof</code>操作符用于返回正在使用值的类型。

在《JavaScript启示录》中<code>new RegExp()</code>介绍会返回<code>function</code>,但是事实上我在chrome控制台中看到的是<code>object</code>。

于是我<code>console.log(new RegExp('^[0-9]+$'))</code>,打印出来的是字符串<code>/^[0-9]+$/</code>。

综上可以看出现版本<code>RegExp</code>和<code>String Number</code>一样属于JavaScript的原始值。

<code>Math</code>作为JavaScript中的静态对象回返回什么呢?

所以<code>Math</code>的<code>__proto__</code>还是<code>Object</code>,<code>typeof</code>还能返回对象的属性和方法的类型。

1.判断某个变量是否已定义

2.区分原始值和复杂值(对象值)

因为复杂值往往返回<code>object</code>,当然有个例外就是原始值里面的<code>null</code>也返回<code>object</code>,然后<code>function</code>作为<code>Object</code>的实例也是复杂值。

3.检测某个变量是否是函数

当使用闭包时判断是函数后再进行下一步。

通过使用<code>instanceof</code>操作符,可以确定一个对象是否是特定构造函数的实例,返回<code>true</code>或<code>false</code>。 <code>instanceof</code>只适用于构造函数创建返回的复杂对象和实例。 任何时间判断一个对象(复杂值)是否是<code>Object</code>的实例时,它都将返回<code>true</code>,因为所有对象都继承自<code>Object()</code>构造函数。

判断在一个继承关系中实例是否属于它的父类。

<code>in</code>操作符可以检查一个对象的属性,包括来自原型链的属性,<code>hasOwnProperty()</code>方法可以检查来自非原型链属性的对象。

例如现在有一个对象<code>let obj = {name: 'mazey'};</code>,<code>name</code>是它自身定义的属性,<code>toString</code>是它从原型链上继承下来的属性。

所以in操作符查找的范围更广一点,可以用<code>hasOwnProperty()</code>判断是否是对象自身的属性,而不是通过类似<code>obj.prototype.foo = 'foo';</code>这样定义的。

在实际项目中经常使用<code>for...in...</code>来遍历对象中可枚举的属性,但是<code>for...in...</code>常常把原型<code>obj.prototype.xxx</code>中的属性也列举出来,所以在循环的时候可以加上<code>hasOwnProperty()</code>方法判断下。

1.<code>typeof</code>可以判断使用值的类型,注意<code>null</code>返回<code>object</code>。 2.<code>instanceof</code>验证构造函数构造出来的实例,可以用来判断一个对象是否属于一个父类。 3.<code>hasOwnProperty</code>方法常常与<code>in</code>操作符搭配使用,用来遍历一个对象自身的属性。

若想把一个对象的自身属性完全删除,要使用<code>delete</code>操作符。

需要注意的是<code>delete</code>不会删除原型链上的属性。

每个对象的属性都分为可枚举和不可枚举属性,可以使用<code>propertyIsEnumerable()</code>方法来检查哪些属性是可枚举的。

每个对象都有一个<code>propertyIsEnumerable</code>方法。此方法可以确定对象中指定的属性是否可以被<code>for...in</code>(for...in语句以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行)循环枚举,但是通过原型链继承的属性除外。如果对象没有指定的属性,则此方法返回<code>false</code>。

有的资料说只要能被<code>for..in</code>遍历的属性就是可枚举的,实际上要排除从原型链上继承下来的属性,只有自身的属性是可枚举的。

所以可枚举的属性一定能被<code>for..in</code>循环遍历出来,但是<code>for...in</code>循环遍历出来的属性不一定是可枚举的,需排除从原型链上继承下来的属性,这里可以通过<code>hasOwnProperty()</code>方法过滤掉不可枚举属性。

JavaScript中typeof,instanceof,hasOwnProperty,in的用法和区别

GitHub:mazeyqian

Blog:blog.mazey.net

继续阅读