typeof和instanceof的作用和区别

JavaScript有三种方法,可以确定一个值到底是什么类型。

  • typeof 运算符
  • instanceof 运算符
  • Object.prototype.toString 方法

typeof 运算符

最常用的是 typeof 运算符,返回一个值的数据类型有以下几种结果。

  1. 原始类型
  2. 函数
  3. undefined
  4. object

1.原始类型

数值、字符串、布尔值分布返回 numberstringboolean

typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"

2.函数

函数返回function

function f() {}
typeof f
// "function"

3. undefined

undefined 和没有用 var 声明的变量,用typeof 返回的是 undefined

typeof undefined
// "undefined"
var x
typeof x
// "undefined"
y
// ReferenceError: y is not defined
typeof y
// "undefined"

这里y没有用var声明,直接使用就会报错,但是用typeof就不报错,而是返回undefined。
实际编程中,这个特点通常用在判断语句。

// 错误的写法
if (v) {
  // ...
}
// ReferenceError: v is not defined

// 正确的写法
if (typeof v === "undefined") {
  // ...
}

4.object

除了以上三种情况,其他情况都返回object

typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"

注意

  • 空数组[]的返回值是object,这表示,JavaScript内部,数组本质上是一种特殊的对象。
  • null的返回值是object,这是由于历史原因造成的,1995年JavaScript语言的第一版,所有值都设计成32位,其中最低的3位用来表述数据类型,object对应的值是000。当时,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),完全没考虑null,只把它当作object的一种特殊值,32位全部为0。这是typeof null返回object的根本原因。
    为了兼容以前的代码,后来就没法修改了。这并不是说null就属于对象,本质上null是一个类似于undefined的特殊值。

instanceof 运算符

instanceof 是判断变量是否为某个对象的实例,返回值为truefalse

var o = {};
var a = [];

o instanceof Array // false
a instanceof Array // true
a instanceof Object // true

typeof 对数组 [] 和对象 {} 的返回值都是Object,无法区分数组和对象,但是instanceof可以区分。
注意: 数组Array是对象Object的一个子类,所以 a instanceof Object的返回值是 true

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,459评论 0 4
  • 前端07班 王语句JavaScript程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是...
    ea203453e188阅读 4,410评论 0 4
  • 文/Mission小可儿 花儿问大地爱情是什么, 大地沉默。 扎根的养分却从未被停止过。 鸟儿问天空爱情是什么, ...
    Mission小可儿阅读 2,695评论 8 1
  • 不要写别人不懂的诗歌 不要刻意的自我放逐 不强说愁,亦不惧登楼 只看 所有说所有流泪 所有长所有伤痕 日子在我们的...
    阿超_mama阅读 1,508评论 0 5
  • 来自Utopia 부모님께 드리는 말 양육태도는 "부모 또는 양육자가 자녀를 양육함에 있어서 나타내는 ...
    万事从容阅读 3,751评论 0 0