成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS中typeof與instanceof的區(qū)別

zhoutk / 3426人閱讀

摘要:中和常用來判斷一個(gè)變量是否為空,或者是什么類型的。運(yùn)算符返回一個(gè)用來表示表達(dá)式的數(shù)據(jù)類型的字符串。運(yùn)算符用來測(cè)試一個(gè)對(duì)象在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)的屬性。檢查原型鏈會(huì)找到同上

JavaScript 中typeofinstanceof 常用來判斷一個(gè)變量是否為空,或者是什么類型的。但它們之間還是有區(qū)別的:

typeof

typeof 是一個(gè)一元運(yùn)算,放在一個(gè)運(yùn)算數(shù)之前,運(yùn)算數(shù)可以是任意類型。

它返回值是一個(gè)字符串,該字符串說明運(yùn)算數(shù)的類型。(typeof 運(yùn)算符返回一個(gè)用來表示表達(dá)式的數(shù)據(jù)類型的字符串。 )

typeof其實(shí)就是判斷參數(shù)是什么類型的實(shí)例,就一個(gè)參數(shù)

typeof 一般只能返回如下幾個(gè)結(jié)果:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。

運(yùn)算數(shù)為數(shù)字 typeof(x) = "number"

字符串 typeof(x) = "string"

布爾值 typeof(x) = "boolean"

對(duì)象,數(shù)組和null typeof(x) = "object"

函數(shù) typeof(x) = "function"

console.log(typeof (123));//typeof(123)返回"number" 
console.log(typeof ("123"));//typeof("123")返回"string"
var param1 = "string";
var param2 = new Object();
var param3 = 10;
console.log(typeof(param1)+"
"+typeof(param2)+"
"+typeof(param3)); 
     // string object  number

我們可以使用 typeof 來獲取一個(gè)變量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 因?yàn)槿绻?a 不存在(未聲明)則會(huì)出錯(cuò),對(duì)于 Array,Null 等特殊對(duì)象使用 typeof 一律返回 object,這正是 typeof 的局限性。

經(jīng)常會(huì)在js里用到數(shù)組,比如 多個(gè)名字相同的input, 若是動(dòng)態(tài)生成的, 提交時(shí)就需要判斷其是否是數(shù)組.

  if(document.mylist.length != "undefined" ) {} //這個(gè)用法有誤.

    正確的是 `if( typeof(document.mylist.length) != "undefined" ) {}` 

     或 `if( !isNaN(document.mylist.length) ) {}` 

typeof的運(yùn)算數(shù)未定義,返回的就是 "undefined".

在 JavaScript 中,判斷一個(gè)變量的類型嘗嘗會(huì)用 typeof 運(yùn)算符,在使用 typeof 運(yùn)算符時(shí)采用引用類型存儲(chǔ)值會(huì)出現(xiàn)一個(gè)問題,無論引用的是什么類型的對(duì)象,它都返回 “object”。這就需要用到instanceof來檢測(cè)某個(gè)對(duì)象是不是另一個(gè)對(duì)象的實(shí)例。

instanceof

instanceof 運(yùn)算符用來測(cè)試一個(gè)對(duì)象在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)的 prototype 屬性。

語法:object instanceof constructor
參數(shù):object(要檢測(cè)的對(duì)象.)constructor(某個(gè)構(gòu)造函數(shù))
描述:instanceof 運(yùn)算符用來檢測(cè) constructor.prototype 是否存在于參數(shù) object 的原型鏈上。

instance:實(shí)例,例子

a instanceof b?alert("true"):alert("false"); //a是b的實(shí)例?真:假

instanceof 用于判斷一個(gè)變量是否某個(gè)對(duì)象的實(shí)例,

如 :var a=new Array();

alert(a instanceof Array); // true,

同時(shí) alert(a instanceof Object) //也會(huì)返回 true;

這是因?yàn)?Array 是 object 的子類。



再如:function test(){};

var a=new test();

alert(a instanceof test) 會(huì)返回true

alert(a==b);  //flase

案例:

另外,更重的一點(diǎn)是 `instanceof` 可以在繼承關(guān)系中用來判斷一個(gè)實(shí)例是否屬于它的父類型。

例如:

function Foo(){} 
Foo.prototype = new Aoo();//JavaScript 原型繼承 
var foo = new Foo(); 
console.log(foo instanceof Foo)//true 
console.log(foo instanceof Aoo)//true

上面的代碼中是判斷了一層繼承關(guān)系中的父類,在多層繼承關(guān)系中,instanceof 運(yùn)算符同樣適用。


又如:

console.log(Object instanceof Object);//true 
console.log(Function instanceof Function);//true 
console.log(Number instanceof Number);//false 
console.log(String instanceof String);//false  
console.log(Function instanceof Object);//true  
console.log(Foo instanceof Function);//true 
console.log(Foo instanceof Foo);//false
// 定義構(gòu)造函數(shù)
function C(){} 
function D(){} 

var o = new C();

// true,因?yàn)?Object.getPrototypeOf(o) === C.prototype
o instanceof C; 

// false,因?yàn)?D.prototype不在o的原型鏈上
o instanceof D; 

o instanceof Object; // true,因?yàn)镺bject.prototype.isPrototypeOf(o)返回true
C.prototype instanceof Object // true,同上

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

o instanceof C; // false,C.prototype指向了一個(gè)空對(duì)象,這個(gè)空對(duì)象不在o的原型鏈上.

D.prototype = new C(); // 繼承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true

談到 instanceof 我們要多插入一個(gè)問題,就是 functionarguments,我們大家也許都認(rèn)為 arguments 是一個(gè) Array,但如果使用 instaceof 去測(cè)試會(huì)發(fā)現(xiàn) arguments 不是一個(gè) Array 對(duì)象,盡管看起來很像。

另外:

測(cè)試 var a=new Array();if (a instanceof Object) alert("Y");else alert("N");

得"Y’

但 if (window instanceof Object) alert("Y");else alert("N");

得"N"

所以,這里的 instanceof 測(cè)試的 object 是指 js 語法中的 object,不是指 dom 模型對(duì)象。

使用 typeof 會(huì)有些區(qū)別

alert(typeof(window)) 會(huì)得 object

需要注意的是,如果表達(dá)式 obj instanceof Foo 返回true,則并不意味著該表達(dá)式會(huì)永遠(yuǎn)返回ture,因?yàn)镕oo.prototype屬性的值有可能會(huì)改變,改變之后的值很有可能不存在于obj的原型鏈上,這時(shí)原表達(dá)式的值就會(huì)成為false。另外一種情況下,原表達(dá)式的值也會(huì)改變,就是改變對(duì)象obj的原型鏈的情況,雖然在目前的ES規(guī)范中,我們只能讀取對(duì)象的原型而不能改變它,但借助于非標(biāo)準(zhǔn)的__proto__魔法屬性,是可以實(shí)現(xiàn)的。比如執(zhí)行obj.__proto__ = {}之后,obj instanceof Foo就會(huì)返回false了。

例子: 表明String對(duì)象和Date對(duì)象都屬于Object類型
下面的代碼使用了instanceof來證明:String和Date對(duì)象同時(shí)也屬于Object類型。

例子: 表明String對(duì)象和Date對(duì)象都屬于Object類型

下面的代碼使用了instanceof來證明:String和Date對(duì)象同時(shí)也屬于Object類型。
var simpleStr = "This is a simple string"; 
var myString  = new String();
var newStr    = new String("String created with constructor");
var myDate    = new Date();
var myObj     = {};

simpleStr instanceof String; // returns false, 檢查原型鏈會(huì)找到 undefined
myString  instanceof String; // returns true
newStr    instanceof String; // returns true
myString  instanceof Object; // returns true

myObj instanceof Object;    // returns true, despite an undefined prototype
({})  instanceof Object;    // returns true, 同上

myString instanceof Date;   // returns false

myDate instanceof Date;     // returns true
myDate instanceof Object;   // returns true
myDate instanceof String;   // returns false

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102056.html

相關(guān)文章

  • 原型模式故事鏈(3)--JS數(shù)據(jù)類型、以及區(qū)別、區(qū)分、轉(zhuǎn)化

    摘要:所以不論你媽媽是喊,狗蛋回家吃飯了,還是喊小明回家吃飯了,其實(shí)喊的都是你。當(dāng)然的嘛狗蛋買了件新衣服,小明當(dāng)然就有這件新衣服了。。。 上一章--原型鏈講解:傳送門:https://segmentfault.com/a/11... 在上一章講解原型鏈時(shí)提到了:所有的引用類型都有一個(gè)_proto_屬性,稱之為隱式原型。那么引用類型是什么鬼? 盡量簡(jiǎn)單的講解一下javascript中的數(shù)據(jù)類...

    stdying 評(píng)論0 收藏0
  • 原型模式故事鏈(3)--JS數(shù)據(jù)類型、以及區(qū)別、區(qū)分、轉(zhuǎn)化

    摘要:所以不論你媽媽是喊,狗蛋回家吃飯了,還是喊小明回家吃飯了,其實(shí)喊的都是你。當(dāng)然的嘛狗蛋買了件新衣服,小明當(dāng)然就有這件新衣服了。。。 上一章--原型鏈講解:傳送門:https://segmentfault.com/a/11... 在上一章講解原型鏈時(shí)提到了:所有的引用類型都有一個(gè)_proto_屬性,稱之為隱式原型。那么引用類型是什么鬼? 盡量簡(jiǎn)單的講解一下javascript中的數(shù)據(jù)類...

    RiverLi 評(píng)論0 收藏0
  • 原型模式故事鏈(3)--JS數(shù)據(jù)類型、以及區(qū)別、區(qū)分、轉(zhuǎn)化

    摘要:所以不論你媽媽是喊,狗蛋回家吃飯了,還是喊小明回家吃飯了,其實(shí)喊的都是你。當(dāng)然的嘛狗蛋買了件新衣服,小明當(dāng)然就有這件新衣服了。。。 上一章--原型鏈講解:傳送門:https://segmentfault.com/a/11... 在上一章講解原型鏈時(shí)提到了:所有的引用類型都有一個(gè)_proto_屬性,稱之為隱式原型。那么引用類型是什么鬼? 盡量簡(jiǎn)單的講解一下javascript中的數(shù)據(jù)類...

    saucxs 評(píng)論0 收藏0
  • typeofinstanceOf區(qū)別

    摘要:如果左側(cè)的對(duì)象是右側(cè)類的實(shí)例,則返回而中對(duì)象的類是通過初始化它們的構(gòu)造函數(shù)來定義的。其語法是操作符用來比較兩個(gè)操作數(shù)的構(gòu)造函數(shù)。 關(guān)于typeof typeof一元運(yùn)算符,用來返回操作數(shù)類型的字符串。 typeof幾乎不可能得到它們想要的結(jié)果。typeof只有一個(gè)實(shí)際應(yīng)用場(chǎng)景,就是用來檢測(cè)一個(gè)對(duì)象是否已經(jīng)定義或者是否已經(jīng)賦值。而這個(gè)應(yīng)用卻不是來檢查對(duì)象的類型。 Value ...

    Aceyclee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<