深圳市博士通科技有限公司

JavaScript数据类型

2020/10/27 10:12:57   阅读:1816    发布者:1816

1.1基本()类型

  • Number: 任意数值
  • String: 任意文本
  • Boolean: true/false
  • undefined: undefined
  • null: null
  • symbol(ECMAScript 6 新定义)
  • BigInt(ECMAScript 2020 新增)

1.2对象(引用)类型

  • Object: 任意对象
  • Array: 特别的对象类型(下标/内部数据有序)
  • Function: 特别的对象类型(可执行)

二、数据类型判断

通常我们会使用四种方法来判断JavaScript的类型,分别是:typeofinstanceofconstructortoString(),接下来我们分别来看这几种方法使用以及区别

2.1通过typeOf 判断

typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包含这8种: numberbigIntbooleansymbolstringobjectundefinedfunction

引用类型,除了function返回function类型外,其他均返回object,其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型


作者:撒点料儿
链接:https://juejin.im/post/6865211899303165959
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.2通过instanceof 判断

instanceof用来判断A是否为B的实例,表达式为:A instanceof B,如果AB的实例,则返回true,否则返回falseinstanceof检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型。

另外一种情况下,obj instanceof A 原表达式的值也会改变,就是改变对象 obj 的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的 proto 伪属性,是可以实现的。比如执行 obj.proto = {} 之后,obj instanceof A就会返回 false ,但它不能检测 null undefined

由上图可以看出[]的原型指向Array.prototype,间接指向Object.prototype, 因此 [] instanceof Array 返回true [] instanceof Object 也返回true

instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

2.3 通过constructor 判断

constructor是原型prototype的一个属性,当函数被定义时候,js引擎会为函数添加原型prototype,并且这个prototypeconstructor属性指向函数引用, 因此重写prototype会丢失原来的constructor。 从原型链角度讲,构造函数就是新对象的类型。这样做的意义是,让对象诞生以后,就具有可追溯的数据类型

2.4 通过 toString() 判断

toString()Object的原型方法,调用该方法,默认返回当前对象的[[Class]]。这是一个内部属性,其格式为[object Xxx],其中Xxx就是对象的类型。

对于Object对象,直接调用toString()就能返回[object Object],而对于其他对象,则需要通过callapply来调用才能返回正确的类型信息。

这是因为toStringObject的原型方法,而Array Function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。

链接:https://juejin.im/post/6865211899303165959