重学JS: 数据类型及类型检测

栏目: JavaScript · 发布时间: 5年前

内容简介:JavaScript七种内置类型:除对象之外,其他统称为基本类型typeof运算符后面跟操作数,typeof operand 或者 typeof (operand),返回一个类型的字符串值。

数据类型

JavaScript七种内置类型:

  • 空值(null)
  • 未定义(undefined)
  • 布尔值(boolean)
  • 数字(number)
  • 字符串(string)
  • 对象(object)
  • 符号(symbol)

除对象之外,其他统称为基本类型

类型检测

typeof

typeof运算符后面跟操作数,typeof operand 或者 typeof (operand),返回一个类型的字符串值。

示例:

typeof undefined === "undefined" // true
typeof true === "boolean" // true
typeof 1 === "number" // true
typeof 'test' === "string" // true
typeof {} === "object" // true
typeof Symbol() === "symbol" // true

特殊示例:

typeof null === "object"
typeof function () {} === "function"
typeof [1] === "object"

typeof 对null的处理有问题,正确的结果应该是"null",但是实际返回的是"object",这个bug由来已久,也许以后也不会修复。

typeof function() {}返回的是一个"function",似乎function也是JavaScript的一个内置对象,实际上函数是一个可调用对象,它有一个内部属性[[Call]],该属性使其可以被调用。

typeof [1]返回"object",说明数组也是object类型,实际上它是object的一个子类型,和普通对象通过字符串键索引不同,数组通过数字按顺进行索引。

总结表格:

重学JS: 数据类型及类型检测

instance

typeof是检测基本数据类型的最佳工具,但是检测引用类型的值时作用不大,都会返回"object",这时候就需要instance操作符了。instance运算符用于测试构造函数的protytpe属性是否出现在对象的原型链中的任何位置。

用法:object instanceof constructor,object: 要检测的对象,constructor某个构造函数

示例:

function A() {}
function B() {}
function C() {}
A.prototype = new C()
const a = new A()
console.log(a instanceof A) // a是A类的实例 true
console.log(a instanceof C) // A继承C true
console.log(a instanceof B) // a不是A类的实例 false
console.log(a instanceof Object) // Object实所有引用类型的父类 true
console.log(A.prototype instanceof Object) // true
A.prototype = {}
a1 = new A()
console.log(a1 instanceof A) // true
console.log(a instanceof A) // false
const date = new Date()
console.log(date instanceof Date) // true

原理

function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
 var O = R.prototype;// 取 R 的显示原型
 L = L.__proto__;// 取 L 的隐式原型
 while (true) { 
   if (L === null) 
     return false; 
   if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true 
     return true; 
   L = L.__proto__; 
 } 
}

想要对instanceof运算符有更加深入的了解 车票

toString

toString()方法返回一个表示该对象的字符串,每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString()返回"[object type]",其中type是对象的类型

示例

const toString = Object.prototype.toString
console.log(toString.call(null)) // [object Null]
console.log(toString.call(undefined)) // [object Undefined]
console.log(toString.call(new String)) // [object String]
console.log(toString.call(Function)) // [object Function]
console.log(toString.call(new Date)) // [object Date]
console.log(toString.call('new Date')) // [object String]
console.log(toString.call(['a'])) // [object Array]

从示例可以看出,Object.prototype.toString.call()可以准确表示数值的类型

总结

  • typeof运算符适合检测基本数据类型,且返回类型的字符串
  • instanceof运算符适合检测引用类型值
  • toString()返回对象的类型,可以准确判断数值的类型

以上所述就是小编给大家介绍的《重学JS: 数据类型及类型检测》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design for Hackers

Design for Hackers

David Kadavy / Wiley / 2011-10-18 / USD 39.99

Discover the techniques behind beautiful design?by deconstructing designs to understand them The term ?hacker? has been redefined to consist of anyone who has an insatiable curiosity as to how thin......一起来看看 《Design for Hackers》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码