2018/5/18 15:01:56当前位置推荐好文程序员浏览文章

1.1 JavaScript 数据类型

简单数据类型(基本数据类型): Undefined ; Null ; Boolean ; Number ; String ; Symbol(ES6新添加)
复杂数据类型:Object,Object 本质上是由一组无序的名值对组成。
(引使用类型除 Object 外,还包括 Function 、Array、RegExp、Date 等等。)

1.2 判断 JavaScript 数据类型的方法

1.2.1 typeof

typeof——返回给定变量的数据类型,可可以返回如下字符串:

返回字符串 —— 数据类型undefined——Undefinedboolean——Booleanstring——Stringnumber——Numbersymbol——Symbolobject——Object / Null (Null 为空对象的引使用)function——Function

typeof 返回的类型都是字符串形式,需注意,例如:

alert(typeof abcd == "string")   =>   truealert(typeof abcd == String)   =>    false

typeof 对于Function 、Array、RegExp、Date 类型统一返回 object

alert(typeof [] == object)   =>    truealert(typeof new Date)   =>    object

typeof 是操作符而非函数,所以能用圆括号,也能不用。

alert(typeof abcd); /     alert(typeof (abcd));

1.2.2 instanceof

语法: object instanceof constructor
instanceof 运算符使用来检测 constructor.prototype 能否存在于参数 object 的原型链上,是则返回 true,不是则返回 false。

    alert([1,2,3] instanceof Array) ---------------> true    alert(new Date() instanceof Date)    alert(function(){this.name="22";} instanceof Function) ------------> true    alert(function(){this.name="22";} instanceof function) ------------> false

注:instanceof 后面肯定要是对象类型,且大小写不可以错。
instanceof 只可以使用来判断两个对象能否属于实例关系,而不可以判断一个对象实例具体属于哪种类型。

1.2.3 constructor

constructor——返回对象对应的构造函数。

alert({}.constructor === Object);  =>  truealert([].constructor === Array);  =>  truealert(abcde.constructor === String);  =>  truealert((1).constructor === Number);  =>  truealert(true.constructor === Boolean);  =>  truealert(false.constructor === Boolean);  =>  truealert(function s(){}.constructor === Function);  =>  truealert(new Date().constructor === Date);  =>  truealert(new Array().constructor === Array);  =>  truealert(new Error().constructor === Error);  =>  truealert(document.constructor === HTMLDocument);  =>  truealert(window.constructor === Window);  =>  true

Symbol 值通过Symbol函数生成,是一个原始类型的值,不是对象,不可以通过 constructor 判断

alert(Symbol().constructor);    =>    undefined 

注:

  1. null 和 undefined 是无效的对象,没有 constructor,因而无法通过这种方式来判断。
  2. 函数的 constructor 不稳固。
    当一个函数被定义时,JS 引擎会为其增加 prototype 原型,而后在 prototype 上增加一个 constructor 属性,并让其指向函数的引使用。
    但函数的 prototype 被重写后,原有的 constructor 引使用会丢失。再次新建一个次函数的实例后,其 constructor 指向的内容已发生改变。
    因而为了规范开发,在重写对象原型时,一般都需要重新给 constructor 赋值,以保证对象实例的类型不被更改。

1.2.4 Object.prototype.toString()

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

对于 Object 对象,直接调使用 toString() 就可以返回 [object Object] 。而对于其余对象,则需要通过 call / apply 来调使用才可以返回正确的类型信息。

Object.prototype.toString.call(new Date);//[object Date]Object.prototype.toString.call(new String);//[object String]Object.prototype.toString.call(Math);//[object Math]Object.prototype.toString.call(undefined);//[object Undefined]Object.prototype.toString.call(null);//[object Null]Object.prototype.toString.call() ;   // [object String]Object.prototype.toString.call(123) ;    // [object Number]Object.prototype.toString.call(true) ; // [object Boolean]Object.prototype.toString.call(Symbol()); //[object Symbol]Object.prototype.toString.call(new Function()) ; // [object Function]Object.prototype.toString.call(new Date()) ; // [object Date]Object.prototype.toString.call([]) ; // [object Array]Object.prototype.toString.call(new RegExp()) ; // [object RegExp]Object.prototype.toString.call(new Error()) ; // [object Error]Object.prototype.toString.call(document) ; // [object HTMLDocument]Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引使用

参考:http://www.cnblogs.com/onepixel/p/8832776.html

网友评论