js类型判断及鸭式辨型

2019-12-04 06:07栏目:竞技宝竞猜
TAG:

JavaScript中,数组是一个特殊的对象,其property名为正整数,且其length属性会随着数组成员的增减而发生变化,同时又从Array构造函数中继承了一些用于进行数组操作的方法。而对于一个普通的对象来说,如果它的所有property名均为正整数,同时也有相应的length属性,那么虽然该对象并不是由Array构造函数所创建的,它依然呈现出数组的行为,在这种情况下,这些对象被称为“类数组对象”。以下是一个简单的类数组对象:复制代码 代码如下:var o = {0:42, 1:52, 2:63, length:3}console.log;与普通对象不同的是,类数组对象拥有一个特性:可以在类数组对象上应用数组的操作方法。比如,在ECMAScript 5标准中,可以用以下方法来将上面的对象o合并成字符串:复制代码 代码如下:console.log(Array.prototype.join.call;//"42,52,63"也可以在类数组对象上使用slice()方法获取子数组:复制代码 代码如下:console.log(Array.prototype.slice.call;//[52]在浏览器环境中,document.getElementsByTagName()语句返回的就是一个类数组对象。在function调用中,function代码内的arguments变量也是一个类数组对象。

三种检测对象的类方式: instanceof、constructor 、构造函数名字

在ECMAScript 5标准中,字符串string就是一个只读的类数组对象:复制代码 代码如下:var s = "History";console.log;//tconsole.log(Array.prototype.join.call;//H i s t o r y

 

用法如下:

 

1)instanceof

 

console.log([1,2,3] instanceof Array);

true

 

console.log([龙电竞官网,1,2,3] instanceof Object);

true

尽管构造函数是原型的唯一标识,instanceof运算符的右操作数是构造函数,instanceof实际计算过程中检测的是对象的继承关系,而不是检测的创建对象时的构造函数,只是使用了构造函数作为中介

 

 

 

当然也可以使用isPrototypeOf 来判断一个对象是否存在于另一对象的原型链中,此时不使用构造函数作为中介

 

var a1 = new Array();

console.log(Array.prototype.isPrototypeOf(a1));

true

 

console.log(Array.prototype.isPrototypeOf([1,2,3]));

true

注意:多个执行上下文时(例如存在不同框架时)instanceof使用有限制

 

 

 

2)constructor

 

每个javascript函数都可以用作构造函数,调用构造函数需要使用prototype属性,因而每个javascript函数会自动拥有prototype属性,这个属性值是一个对象,这个对象包含一个contructor属性,constructor属性值是一个函数对象。

 

即对于函数var F = function(){}; F.prototype.constructor===F

 

关系图如下:

 

 

 

 

 

eg:

 

复制代码

var F= function(){};

var p = F.prototype;

var c = p.constructor;

console.log(p);

console.log(c);

console.log(c===F);

 

Object {}

function (){}

true

复制代码

因而对象继承的constructor均指代他们的构造函数

 

eg:

 

 

 

var o= new F();

console.log(o.constructor===F);

 

//输出 

true

 

 

var a = new Array();

console.log(a.constructor===Array);

//输出

true

 

 

复制代码

function typeDiscern(x){

  switch(x.constructor){

    case Number: return "Number:"+x;

    case String: return "String:"+x;

    case Array: return "Array:"+x;

        }

}

console.log(typeDiscern([1,2,3]));

console.log(typeDiscern("abc"));

console.log(typeDiscern(5));

//输出

Array:1,2,3

String:abc

Number:5

复制代码

 

 

 

 

注意: 同instanceof在多个上下文下没法使用,另外并不是所有的对象都包含constructor属性

 

 

 

eg:

 

定义Person类

 

 

 

复制代码

function Person(name)   

{   

   this.name=name;   

   this.getName=function()   

        {   

           return this.name;   

        }   

};   

  

var wish=new Person('js');   

  

console.log(wish.constructor==Person); 

console.log(Person.prototype);

console.log(Person.constructor);  

console.log(wish.getName());

 

//输出

true

Person {}

function Function() { [native code] }

js

复制代码

 

 

给Person自定义prototype

 

复制代码

function Person(name)   

{   

   this.name=name;   

   this.getName=function()   

        {   

           return this.name;   

        }   

};   

Person.prototype={

    toString: function(){

        return this.name;

    }

};

  

版权声明:本文由龙竞技官网发布于竞技宝竞猜,转载请注明出处:js类型判断及鸭式辨型