亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳解JavaScript中typeof與instanceof用法

2019-11-19 12:38:24
字體:
來源:轉載
供稿:網友

今天寫JS代碼,遇到動態生成多個名稱相同的input復選按鈕

需要判斷其是否是數組,用到了if (typeof(document.MapCheckMgr.checkid)!="undefined")

以前用得少,就順便查了一下關于typeof的那些事

 typeof用以獲取一個變量或者表達式的類型,typeof一般只能返回如下幾個結果:

number,boolean,string,function(函數),object(NULL,數組,對象),undefined。

如:

alert(typeof (123));//typeof(123)返回"number" alert(typeof ("123"));//typeof("123")返回"string"

我們可以使用typeof來獲取一個變量是否存在,如if(typeof a!="undefined"){},而不要去使用if(a)因為如果a不存在(未聲明)則會出錯,

正因為typeof遇到null,數組,對象時都會返回object類型,所以當我們要判斷一個對象是否是數組時

或者判斷某個變量是否是某個對象的實例則要選擇使用另一個關鍵語法instanceof

instanceof用于判斷一個變量是否某個對象的實例,如var a=new Array();alert(a instanceof Array);會返回true,

同時alert(a instanceof Object)也會返回true;這是因為Array是object的子類。

再如:function test(){};var a=new test();alert(a instanceof test)會返回true。

<script>  var str = new String();  function show(str1){  if(str1 instanceof String){    alert('1');  }else{    alert('0');  }  }  show(str);  str = "abccddd";  if(typeof str=='string'){alert(str);}  else{alert('0');} </script>

  關于typeof

typeof一元運算符,用來返回操作數類型的字符串。

typeof幾乎不可能得到它們想要的結果。typeof只有一個實際應用場景,就是用來檢測一個對象是否已經定義或者是否已經賦值。而這個應用卻不是來檢查對象的類型。

Value Class Type
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object (function in Nitro/V8)
new RegExp("meow") RegExp object (function in Nitro/V8)
{} Object object
new Object() Object object

上面表格中,Type 一列表示 typeof 操作符的運算結果??梢钥吹剑@個值在大多數情況下都返回 "object"。

Class 一列表示對象的內部屬性 [[Class]] 的值。

JavaScript 標準文檔中定義: [[Class]] 的值只可能是下面字符串中的一個: Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String.

為了獲取對象的 [[Class]],我們需要使用定義在 Object.prototype 上的方法 toString。

對象的類定義

JavaScript 標準文檔只給出了一種獲取 [[Class]] 值的方法,那就是使用 Object.prototype.toString。

function is(type, obj) {  var clas = Object.prototype.toString.call(obj).slice(8, -1);  return obj !== undefined && obj !== null && clas === type;}is('String', 'test'); // trueis('String', new String('test')); // true

上面例子中,Object.prototype.toString 方法被調用,this 被設置為了需要獲取 [[Class]] 值的對象。

注:Object.prototype.toString 返回一種標準格式字符串,所以上例可以通過 slice 截取指定位置的字符串,如下所示:

Object.prototype.toString.call([])  // "[object Array]"Object.prototype.toString.call({})  // "[object Object]"Object.prototype.toString.call(2)  // "[object Number]"

注:這種變化可以從 IE8 和 Firefox 4 中看出區別,如下所示:

// IE8Object.prototype.toString.call(null)  // "[object Object]"Object.prototype.toString.call(undefined)  // "[object Object]"http:// Firefox 4Object.prototype.toString.call(null)  // "[object Null]"Object.prototype.toString.call(undefined)  // "[object Undefined]"

測試為定義變量

typeof foo !== 'undefined'

上面代碼會檢測 foo 是否已經定義;如果沒有定義而直接使用會導致 ReferenceError 的異常。 這是 typeof 唯一有用的地方。

結論

為了檢測一個對象的類型,強烈推薦使用 Object.prototype.toString 方法; 因為這是唯一一個可依賴的方式。正如上面表格所示,typeof 的一些返回值在標準文檔中并未定義, 因此不同的引擎實現可能不同。

除非為了檢測一個變量是否已經定義,我們應盡量避免使用 typeof 操作符。

x typeof x
undefined "undefined"
true 或false "boolean"
任意數字或者NaN "number"
任意字符串 "string"
函數對象(在ECMA-262術語中,指的是實現了[[Call]] 的對象) "function"
任意內置對象(非函數) "object"
數組 "obeject"
null "object"
宿主對象(JS引擎內置對象,而不是DOM或者其他提供的) 由編譯器各自實現的字符串,但不是"undefined","number","boolean","number","string"。
正則表達式 各瀏覽器表現不一

如果想將null和對象區分開,則必須針對特殊值顯式檢測。如:my_value===null。對于宿主對象來說,typeof有可能并不返回‘object',而返回字符串。但實際上客戶端js中的大多數宿主對象都是‘object'類型。對于所有內置可執行對象進行typeof運算都將返回“function”。

// Numberstypeof 37 === 'number';typeof 3.14 === 'number';typeof Math.LN2 === 'number';typeof Infinity === 'number';typeof NaN === 'number'; // 盡管NaN是"Not-A-Number"的縮寫,意思是"不是一個數字"typeof Number(1) === 'number'; // 不要這樣使用!// Stringstypeof "" === 'string';typeof "bla" === 'string';typeof (typeof 1) === 'string'; // typeof返回的肯定是一個字符串typeof String("abc") === 'string'; // 不要這樣使用!// Booleanstypeof true === 'boolean';typeof false === 'boolean';typeof Boolean(true) === 'boolean'; // 不要這樣使用!// Undefinedtypeof undefined === 'undefined';typeof blabla === 'undefined'; // 一個未定義的變量,或者一個定義了卻未賦初值的變量// Objectstypeof {a:1} === 'object';typeof [1, 2, 4] === 'object'; // 使用Array.isArray或者Object.prototype.toString.call方法//可以分辨出一個數組和真實的對象typeof new Date() === 'object';typeof new Boolean(true) === 'object' // 令人困惑.不要這樣使用typeof new Number(1) === 'object' // 令人困惑.不要這樣使用typeof new String("abc") === 'object'; // 令人困惑.不要這樣使用// Functionstypeof function(){} === 'function';typeof Math.sin === 'function';

關于instanceof

instanceof 左操作數是一個類,右操作數是標識對象的類。如果左側的對象是右側類的實例,則返回true.而js中對象的類是通過初始化它們的構造函數來定義的。即instanceof的右操作數應當是一個函數。所有的對象都是object的實例。如果左操作數不是對象,則返回false,如果右操作數不是函數,則拋出typeError。

instanceof 運算符是用來測試一個對象是否在其原型鏈原型構造函數的屬性。其語法是object instanceof constructor

instanceof 操作符用來比較兩個操作數的構造函數。只有在比較自定義的對象時才有意義。 如果用來比較內置類型,將會和 typeof 操作符 一樣用處不大。

比較自定義對象

function Foo() {}function Bar() {}Bar.prototype = new Foo();new Bar() instanceof Bar; // truenew Bar() instanceof Foo; // true// 如果僅僅設置 Bar.prototype 為函數 Foo 本身,而不是 Foo 構造函數的一個實例Bar.prototype = Foo;new Bar() instanceof Foo; // false

instanceof 比較內置類型

new String('foo') instanceof String; // truenew String('foo') instanceof Object; // true'foo' instanceof String; // false'foo' instanceof Object; // false

有一點需要注意,instanceof 用來比較屬于不同 JavaScript 上下文的對象(比如,瀏覽器中不同的文檔結構)時將會出錯, 因為它們的構造函數不會是同一個對象。

結論:instanceof 操作符應該僅僅用來比較來自同一個 JavaScript 上下文的自定義對象。 正如 typeof 操作符一樣,任何其它的用法都應該是避免的。

function C(){} // defining a constructorfunction D(){} // defining another constructorvar o = new C();o instanceof C; // true, because: Object.getPrototypeOf(o) === C.prototypeo instanceof D; // false, because D.prototype is nowhere in o's prototype chaino instanceof Object; // true, because:C.prototype instanceof Object // trueC.prototype = {};var o2 = new C();o2 instanceof C; // trueo instanceof C; // false, because C.prototype is nowhere in o's prototype chain anymoreD.prototype = new C(); // use inheritancevar o3 = new D();o3 instanceof D; // trueo3 instanceof C; // truevar myString = new String();var myDate = new Date();myString instanceof String; // returns truemyString instanceof Object; // returns truemyString instanceof Date;  // returns falsemyDate instanceof Date;   // returns truemyDate instanceof Object;  // returns truemyDate instanceof String;  // returns falsefunction Car(make, model, year) { this.make = make; this.model = model; this.year = year;}var mycar = new Car("Honda", "Accord", 1998);var a = mycar instanceof Car;  // returns truevar b = mycar instanceof Object; // returns true

總結

以上所述是小編給大家介紹的JavaScript中typeof與instanceof用法 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品资源美女情侣酒店| 26uuu另类亚洲欧美日本一| 国产成人avxxxxx在线看| 国产精品jvid在线观看蜜臀| 日韩综合中文字幕| 精品中文字幕在线观看| 国产精品96久久久久久| 精品magnet| 一区二区在线视频| 亚洲日韩中文字幕| 国产在线拍揄自揄视频不卡99| 亚洲人成伊人成综合网久久久| 久久久久久久久爱| 欧美亚洲视频一区二区| 日本久久亚洲电影| 日本最新高清不卡中文字幕| 国产91露脸中文字幕在线| 日韩精品极品视频免费观看| 成人在线一区二区| 国产极品jizzhd欧美| 亚洲一区二区三区视频播放| 欧美中文在线观看国产| 亚洲午夜激情免费视频| 国产精品v日韩精品| 久久久www成人免费精品| 日韩视频―中文字幕| 色综合久久悠悠| 亚洲人成网7777777国产| 色无极亚洲影院| 久久久精品影院| 亚洲2020天天堂在线观看| 97在线免费视频| 中文字幕无线精品亚洲乱码一区| 国产精品2018| 中文字幕久久亚洲| 久久久久在线观看| 色www亚洲国产张柏芝| 日韩国产激情在线| 久久国产精品影视| 精品久久久久久久久久久久久久| 欧美精品激情在线观看| 亚洲第一精品自拍| 国产v综合ⅴ日韩v欧美大片| 精品亚洲一区二区三区在线观看| 国产在线观看精品一区二区三区| 久久男人资源视频| 在线视频欧美性高潮| 激情成人在线视频| 国产主播在线一区| 亚洲第一男人天堂| 久久久亚洲网站| 一区二区福利视频| 91亚洲国产成人精品性色| 亚洲精品欧美日韩专区| 亚洲第一网中文字幕| 一本一本久久a久久精品牛牛影视| 97在线看免费观看视频在线观看| 国产精品一区二区久久精品| 中日韩午夜理伦电影免费| 国产精品美女久久久免费| 久久久人成影片一区二区三区| 亚洲欧美日韩精品久久亚洲区| 亚洲黄色www网站| 精品久久久久久久久国产字幕| 欧美专区中文字幕| 日本久久久久亚洲中字幕| 亚洲国产精品成人一区二区| 青草青草久热精品视频在线网站| 日韩va亚洲va欧洲va国产| 精品一区二区三区四区| 亚洲国产美女精品久久久久∴| 2019精品视频| 久久香蕉国产线看观看网| 久久九九有精品国产23| 热99久久精品| 欧美日本国产在线| 亚洲精品国产拍免费91在线| 国产精品久久久久久亚洲影视| 久久精品亚洲94久久精品| 欧美成人黄色小视频| 成人免费在线网址| 在线播放国产一区二区三区| 国产亚洲精品激情久久| 69精品小视频| 亚洲四色影视在线观看| 久久精品一本久久99精品| 国产成人精品日本亚洲| 2024亚洲男人天堂| 激情成人中文字幕| 性视频1819p久久| 国产一区二区三区欧美| 精品免费在线观看| 一区二区在线免费视频| 成人日韩av在线| 亚洲自拍另类欧美丝袜| 日本国产欧美一区二区三区| 欧美成人中文字幕| 日韩精品亚洲精品| 韩国精品美女www爽爽爽视频| 国产精品一区二区av影院萌芽| 亚洲日本成人女熟在线观看| 亚洲xxx大片| 成人一区二区电影| 久久精品色欧美aⅴ一区二区| 日韩中文字幕在线免费观看| 青青草成人在线| 久久久久五月天| 日韩欧美在线看| 韩日欧美一区二区| 欧美国产日韩一区| 第一福利永久视频精品| 亚洲福利在线观看| 麻豆精品精华液| 这里只有精品视频| 日韩一区在线视频| 欧美激情成人在线视频| 欧美在线免费视频| 国产精品h在线观看| 国产精品永久免费视频| 国产精品黄页免费高清在线观看| 在线视频欧美日韩精品| 国产91热爆ts人妖在线| **欧美日韩vr在线| 亚洲理论电影网| 国产视频精品一区二区三区| 深夜福利日韩在线看| 国产精品一区二区性色av| 亚洲精品永久免费精品| 中文亚洲视频在线| 亚洲香蕉成人av网站在线观看| 秋霞午夜一区二区| 日韩免费观看在线观看| 日韩免费电影在线观看| 欧美亚洲成人免费| 亚洲国产精品成人va在线观看| 久久久久久这里只有精品| 欧美在线视频a| 亚洲性猛交xxxxwww| 亚洲欧美综合区自拍另类| 国产精品欧美风情| 久久成人一区二区| 91sao在线观看国产| 夜夜嗨av一区二区三区四区| 成人做爰www免费看视频网站| 亚洲专区中文字幕| 这里只有精品在线观看| 日韩免费中文字幕| 97视频在线观看视频免费视频| 亚洲一区二区在线| 成人国产在线激情| 国产日韩欧美另类| 日产精品久久久一区二区福利| 日本久久久久久久| 欧美精品一区在线播放| 97在线精品视频| 久久久亚洲网站| 日韩精品免费看| 日本精品免费一区二区三区| 中文字幕亚洲专区| 中文字幕免费国产精品| 亚洲肉体裸体xxxx137| 一区二区欧美在线| 日本高清视频精品| 国产精品人成电影在线观看|