高级程序设计学习(一):数据类型

111 阅读3分钟

数据类型

简单数据类型

ECMAScript 有 6 种简单数据类型(也称为原始数据):

  1. Undefined (表示未定义)
  2. Null (表示一个空对象指针)
  3. Boolean (布尔值)
  4. Number (数值)
  5. String (字符串)
  6. Symbol (ES6 新增)
Undefined 类型
  • Undefined 类型只有一个值,就是特殊值 undefined。
  • 当声明变量当没有初始化时,默认赋予了 undefined 值。
  • 当使用对象中未赋值属性时,该属性值也为 undefined。
Null 类型

Null 类型同样只有一个值,即特殊值 null。null 值表示一个空对象指针。

一般给空对象进行赋值 null

复杂数据类型

还有一种复杂数据类型叫 Object (对象)

类型检测

1. typeof

对于简单数据类型除了 null(返回 obejct)以外,均可以正确返回。对于复杂类型除了function(返回 function)以外,一律返回 object 。

注意:对于声明了未初始化的变量以及未声明的变量都返回 undefined

有意思的点:对于判断值是否为 NaN 我们可以 typeop nanValue == "number" && nanValue != nanValue

总结: 对于除 null 外的简单数据类型可以使用 typeof 进行类型检测

2. instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true, 否则返回 false。

大致内部执行过程为:

    instanceof (A, B) = {
     if(A.__proto__ === B.prototype) {
       // A的内部属性 __proto__ 指向 B 的原型对象
       return true;
     }
     return false;
    }

从上述过程可以看出,当 A 的 proto 指向 B 的 prototype 时,就认为 A 就是 B 的实例,当检测不是的时候会沿着原型链一路追踪下去

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

instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。

针对数组的这个问题,ES5 提供了 Array.isArray() 方法 。

3. constructor

constructor 属性返回 Object 的构造函数(用于创建实例对象)。注意,此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。

  1. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。

  2. 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object

4. Object.prototype.toString

toString()  方法返回一个表示该对象的字符串。

对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

它们包括(标签与下面给出的类型名相同):

arguments 对象返回 "[object Arguments]"。其它所有内容,包括用户自定义的类,除非有一个自定义的 Symbol.toStringTag,否则都将返回 "[object Object]"

在 null 和 undefined 上调用 Object.prototype.toString() 分别返回 [object Null] 和 [object Undefined]

JQuery 类型判断

class2type = {};
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

type: function( obj ) { 
    return obj == null ?
        String( obj ) :
        class2type[ toString.call(obj) ] || "object";
},