Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

typeof与instanceof的区别(Javascript) #63

Open
calidion opened this issue Feb 23, 2017 · 0 comments
Open

typeof与instanceof的区别(Javascript) #63

calidion opened this issue Feb 23, 2017 · 0 comments

Comments

@calidion
Copy link
Owner

calidion commented Feb 23, 2017

javascript有两个常见的类型运算符:typeof 和 instanceof。
通常他们的作用是不同的。

typeof

用于判断基本类型

基本类型总共有六种,它们分别是
number
boolean
string
function
object
undefined

是一元运行符

运算格式:

typeof xxx

比如

typeof 1

会得到

"number"

返回结果是类型的字符串

根据我们typeof 1的结果,我们可以看到我们得到的是一个字符串。

一些简单的例子

> typeof 1
 "number"
> typeof Nan
"undefined"
> typeof NaN
"number"
> typeof 0.1
"number"
> typeof true
"boolean"
> typeof false
"boolean"
> typeof 'aaa'
"string"
> typeof function() {}
"function"
> typeof {}
"object"
> typeof []
"object"

判断是不是已经被定义

  1. 通常一个变量没有被定义就拿来用是会报错的.
  2. 但是有时候我们又需要判断一个变量是不是存在,特别是在写一些通用库时

所以判断一个变量是不是定义是一个必须的功能。

而typeof可以提供这样的能力。

这时typeof xxx的值是'undefined'

> typeof xxx
"undefined"

而如何使用任何其它的方式,都会报错。所以用来判断一个变量是不是存在,typeof是最佳的选择。

instanceof

用于判断对象的类型

所以可以使用instanceof的都必须是对象。所以不属于object类型的基本类型是无法应用instanceof的,或者无法得到你想要的结果。

比如:

> 1 instanceof Number
false

你要想得到正确的结果,需要这样做:

> new Number(1) instanceof Number
true

所以如果你的运算内容不是对象,你就无法得到正确的结果。同样的效果如下:

'string' instanceof String
false
new String('string') instanceof String
true

二元运算符

instanceof 是一个二元运算符,左边a是被运算的值,右边b是运算的类型。格式是这样的

a instanceof b

返回结果是布尔值(Boolean):true/false

所以instanceof是一个判断,而typeof是求值。

示例

基本类型与一些特殊类型无法得到真的结果

> NaN instanceof Object
false
> undefined instanceof Object
false
> null instanceof Object
false

我们可以看到所有的预定义类型都无法使用instanceof得到真的结果。

需要注意前置的运算子

没有括号时,有些代码会被当成是一个语句,而不是一个表达式,从而让instanceof 缺少运算子而报错。
比如

function() {} instanceof Object  

会被当成是

function() {};
instanceof Object  

从而报错,这时加上()号就可以解决。

比如:

 (function() {}) instanceof Object

运行结果如下:

> function() {} instanceof Object  
Uncaught SyntaxError: Unexpected token (
> (function() {}) instanceof Object
true
> {} instanceof Object
VM1226:1 Uncaught SyntaxError: Unexpected token instanceof
> ({}) instanceof Object
true

主要用来判断对象的关系,特别是自定义对象

比如:

function AA() {}
var b = new AA();
b instanceof  AA

这里的结果是:

true

小结

typeof 与 instanceof 还是存在很多的差异的。它们的目的还是完全不同的。
所以使用时需要注意这些差异。

但是因为javascript并不是一个非常严谨的语言,从而导致很多不必要的混乱。

所以在使用这两个运算符时需要谨慎。

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant