奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

java語(yǔ)言

如何檢查JavaScript變量的類型

時(shí)間:2025-03-01 12:22:55 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

如何檢查JavaScript變量的類型

  JavaScript基本數(shù)據(jù)類型有5種:字符串、數(shù)字、布爾、null、undefined。 用戶定義的類型(object)并沒(méi)有類的聲明,因此繼承關(guān)系只能通過(guò)構(gòu)造函數(shù)和原型鏈來(lái)檢查。 如何檢查一個(gè)變量的類型?以下僅供參考!

  先給結(jié)論:

  如果你要判斷的是基本數(shù)據(jù)類型或JavaScript內(nèi)置對(duì)象,使用toString; 如果要判斷的時(shí)自定義類型,請(qǐng)使用instanceof。

  不同的編程語(yǔ)言都有自己的方式來(lái)提供類型信息,例如C#的反射、C++的Traits, JavaScript提供類型信息的方式更加靈活,因而也容易產(chǎn)生很多誤用。 下面來(lái)分析常見(jiàn)類型檢查手段的區(qū)別:typeof, instanceof, constructor, toString。

  如果你在尋找類型轉(zhuǎn)換的解決方案,而非類型檢查,請(qǐng)移步JavaScript類型轉(zhuǎn)換。

  typeof

  typeof 操作符返回的是類型字符串,它的返回值有6種取值:

  typeof 3 // "number"

  typeof "abc" // "string"

  typeof {} // "object"

  typeof true // "boolean"

  typeof undefined // "undefined"

  typeof function(){} // "function"

  所有對(duì)象的typeof都是"object",不能用于檢測(cè)用戶自定義類型。 比如Date, RegExp, Array, DOM Element的類型都是"object":

  typeof [] // "object"

  typeof還有一個(gè)知名的bug:

  typeof null  // "object"

  null是基本數(shù)據(jù)類型,它的類型顯然是Null。其實(shí)這也反映了null的語(yǔ)義, 它是一個(gè)空指針表示對(duì)象為空,而undefined才表示什么都沒(méi)有。 總之,typeof只能用于基本數(shù)據(jù)類型檢測(cè),對(duì)于null還有Bug。

  instanceof

  instanceof操作符用于檢查某個(gè)對(duì)象的原型鏈?zhǔn)欠癜硞(gè)構(gòu)造函數(shù)的prototype屬性。例如:

  obj instanceof Widget

  obj的原型鏈上有很多對(duì)象(成為隱式原型),比如:obj.__proto__, obj.__proto__.__proto__, ...如果這些對(duì)象里存在一個(gè)p === Widget.prototype,那么instanceof結(jié)果為true,否則為false。

  instanceof是通過(guò)原型鏈來(lái)檢查類型的,所以適用于任何"object"的類型檢查。

  // 比如直接原型關(guān)系

  function Animal(){ }

  (new Animal) instanceof Animal  // true

  // 原型鏈上的間接原型

  function Cat(){}

  Cat.prototype = new Animal

  (new Cat) instanceof Animal   // true

  instanceof也可以用來(lái)檢測(cè)內(nèi)置兌現(xiàn),比如Array, RegExp, Object, Function:

  [1, 2, 3] instanceof Array // true

  /abc/ instanceof RegExp // true

  ({}) instanceof Object // true

  (function(){}) instanceof Function // true

  instanceof對(duì)基本數(shù)據(jù)類型不起作用,因?yàn)榛緮?shù)據(jù)類型沒(méi)有原型鏈。

  3 instanceof Number // false

  true instanceof Boolean // false

  'abc' instanceof String // false

  null instanceof XXX // always false

  undefined instanceof XXX // always false

  但你可以這樣:

  new Number(3) instanceof Number // true

  new Boolean(true) instanceof Boolean // true

  new String('abc') instanceof String // true

  但這時(shí)你已經(jīng)知道數(shù)據(jù)類型了,類型檢查已經(jīng)沒(méi)有意義了。

  constructor

  constructor屬性返回一個(gè)指向創(chuàng)建了該對(duì)象原型的函數(shù)引用。需要注意的是,該屬性的值是那個(gè)函數(shù)本身。例如:

  function Animal(){}

  var a = new Animal

  a.constructor === Animal // true

  constructor不適合用來(lái)判斷變量類型。首先因?yàn)樗且粋(gè)屬性,所以非常容易被偽造:

  var a = new Animal

  a.constructor === Array

  a.constructor === Animal // false

  另外constructor指向的是最初創(chuàng)建當(dāng)前對(duì)象的函數(shù),是原型鏈最上層的那個(gè)方法:

  function Cat(){}

  Cat.prototype = new Animal

  function BadCat(){}

  BadCat.prototype = new Cat

  (new BadCat).constructor === Animal // true

  Animal.constructor === Function  // true

  與instanceof類似,constructor只能用于檢測(cè)對(duì)象,對(duì)基本數(shù)據(jù)類型無(wú)能為力。 而且因?yàn)閏onstructor是對(duì)象屬性,在基本數(shù)據(jù)類型上調(diào)用會(huì)拋出TypeError異常:

  null.constructor   // TypeError!

  undefined.constructor // TypeError!

  與instanceof不同的是,在訪問(wèn)基本數(shù)據(jù)類型的屬性時(shí),JavaScript會(huì)自動(dòng)調(diào)用其構(gòu)造函數(shù)來(lái)生成一個(gè)對(duì)象。例如:

  (3).constructor === Number // true

  true.constructor === Boolean // true

  'abc'.constructor === String // true

  // 相當(dāng)于

  (new Number(3)).constructor === Number

  (new Boolean(true)).constructor === Boolean

  (new String('abc')).constructor === String

  這種將一個(gè)值類型轉(zhuǎn)換為對(duì)象引用類型的機(jī)制在其他語(yǔ)言中也存在,在C#中稱為裝箱(Boxing)。

  跨窗口問(wèn)題

  我們知道Javascript是運(yùn)行在宿主環(huán)境下的,而每個(gè)宿主環(huán)境會(huì)提供一套ECMA標(biāo)準(zhǔn)的內(nèi)置對(duì)象,以及宿主對(duì)象(如window, document),一個(gè)新的窗口即是一個(gè)新的宿主環(huán)境。 不同窗口下的內(nèi)置對(duì)象是不同的實(shí)例,擁有不同的內(nèi)存地址。

  而instanceof和constructor都是通過(guò)比較兩個(gè)Function是否相等來(lái)進(jìn)行類型判斷的。 此時(shí)顯然會(huì)出問(wèn)題,例如:

  var iframe = document.createElement('iframe');

  var iWindow = iframe.contentWindow;

  document.body.appendChild(iframe);

  iWindow.Array === Array   // false

  // 相當(dāng)于

  iWindow.Array === window.Array // false

  因此iWindow中的數(shù)組arr原型鏈上是沒(méi)有window.Array的。請(qǐng)看:

  iWindow.document.write('

  ');

  iWindow.arr instanceof Array   // false

  iWindow.arr instanceof iWindow.Array // true

  toString

  toString方法是最為可靠的類型檢測(cè)手段,它會(huì)將當(dāng)前對(duì)象轉(zhuǎn)換為字符串并輸出。 toString屬性定義在Object.prototype上,因而所有對(duì)象都擁有toString方法。 但Array, Date等對(duì)象會(huì)重寫從Object.prototype繼承來(lái)的toString, 所以最好用Object.prototype.toString來(lái)檢測(cè)類型。

  toString = Object.prototype.toString;

  toString.call(new Date); // [object Date]

  toString.call(new String); // [object String]

  toString.call(Math);  // [object Math]

  toString.call(3);   // [object Number]

  toString.call([]);   // [object Array]

  toString.call({});   // [object Object]

  // Since JavaScript 1.8.5

  toString.call(undefined); // [object Undefined]

  toString.call(null);  // [object Null]

  toString也不是完美的,它無(wú)法檢測(cè)用戶自定義類型。 因?yàn)镺bject.prototype是不知道用戶會(huì)創(chuàng)造什么類型的, 它只能檢測(cè)ECMA標(biāo)準(zhǔn)中的那些內(nèi)置類型。

  toString.call(new Animal) // [object Object]

  因?yàn)榉祷刂凳亲址脖苊饬丝绱翱趩?wèn)題。當(dāng)然IE彈窗中還是有Bug,不必管它了。 現(xiàn)在多少人還在用IE?多少人還在用彈窗?

  和Object.prototype.toString類似地,F(xiàn)unction.prototype.toString也有類似功能, 不過(guò)它的this只能是Function,其他類型(例如基本數(shù)據(jù)類型)都會(huì)拋出異常。

  總結(jié)

  typeof只能檢測(cè)基本數(shù)據(jù)類型,對(duì)于null還有Bug;

  instanceof適用于檢測(cè)對(duì)象,它是基于原型鏈運(yùn)作的;

  constructor指向的是最初創(chuàng)建者,而且容易偽造,不適合做類型判斷;

  toString適用于ECMA內(nèi)置JavaScript類型(包括基本數(shù)據(jù)類型和內(nèi)置對(duì)象)的類型判斷;

  基于引用判等的類型檢查都有跨窗口問(wèn)題,比如instanceof和constructor。

  總之,如果你要判斷的是基本數(shù)據(jù)類型或JavaScript內(nèi)置對(duì)象,使用toString; 如果要判斷的時(shí)自定義類型,請(qǐng)使用instanceof。

  有時(shí)Duck Typing的方式也非常可行,貌似已經(jīng)成為了前端的慣例。 比如jQuery是這樣判斷一個(gè)Window的:

  isWindow: function(obj){

  return obj && typeof obj === 'object' && "setInterval" in obj;

  }

  另外DOM Element的類型檢測(cè)也可以通過(guò)上述的方法來(lái)完成,但沒(méi)有一種方法在任何瀏覽器上都可行。 DOM Element的類型檢測(cè)可以參見(jiàn)這篇文章:http://tobyho.com/2011/01/28/checking-types-in-javascript/

  同時(shí)發(fā)表在:http://harttle.com/2015/09/18/js-type-checking.html

【如何檢查JavaScript變量的類型】相關(guān)文章:

PHP弱類型變量是如何實(shí)現(xiàn)的05-31

Java 變量類型10-01

Java 變量類型介紹10-17

C語(yǔ)言變量的類型10-30

PHP變量類型和整型類型細(xì)節(jié)11-04

C語(yǔ)言指針變量的類型07-31

Java的變量類型有哪些06-30

C語(yǔ)言變量和數(shù)據(jù)類型08-06

Java數(shù)據(jù)類型以及變量的定義10-12

主站蜘蛛池模板: 饶平县| 南平市| 铁岭市| 宜州市| 开封县| 彩票| 吴江市| 邹平县| 历史| 鄢陵县| 合作市| 玉环县| 腾冲县| 松原市| 涟源市| 河北区| 马鞍山市| 黎平县| 大城县| 孙吴县| 宜良县| 浮山县| 潜山县| 宣恩县| 禄丰县| 库车县| 阿拉尔市| 大埔区| 石柱| 渭南市| 财经| 宜章县| 怀化市| 富锦市| 和静县| 成都市| 湄潭县| 色达县| 浦北县| 岳阳县| 恭城|