国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js中對(duì)數(shù)據(jù)類型的總結(jié)及判斷數(shù)據(jù)類型的各種方法及優(yōu)缺點(diǎn)

voyagelab / 1828人閱讀

摘要:最常見的判斷方法它的官方解釋操作符返回一個(gè)字符串,表示未經(jīng)計(jì)算的操作數(shù)的類型。另外,是判斷對(duì)象是否屬于某一類型,而不是獲取的對(duì)象的類型。多個(gè)窗口意味著多個(gè)全局環(huán)境,不同的全局環(huán)境擁有不同的全局對(duì)象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。

js中的數(shù)據(jù)類型

js中只有六種原始數(shù)據(jù)類型和一個(gè)Object:

Boolean

Null

Undefined

Number

String

Symbol (ECMAScript 6 新定義)

Object

大家認(rèn)真記清這個(gè)描述,不要到時(shí)候把Array、Date都當(dāng)成js的數(shù)據(jù)類型就尷尬了。那可能會(huì)有人問,那Array和Date算什么呢,他們都屬于Object,看下面分類:

Object分類
Object分為本地對(duì)象內(nèi)置對(duì)象宿主對(duì)象三種
本地對(duì)象
定義:獨(dú)立于宿主環(huán)境的ECMAScript實(shí)現(xiàn)提供的對(duì)象。簡(jiǎn)單的說就是ECMA定義的類。他們包括:
Object   Function   Array   String
Boolean   Number  Date RegExp
Error   EvalError   RangeError  ReferenceError
SyntaxError   TypeError URIError

所以Array和Date都屬于對(duì)象類型,它們是本地對(duì)象。

疑問:

1.有人可能會(huì)問,為什么String也是Object類型,上面不是說了是原始類型嗎?
答:原始類型中有字符串String不錯(cuò),它只是表達(dá)了一種數(shù)據(jù)類型,但數(shù)據(jù)類型也有自己的類定義啊,是吧,上面的String說的就是它的類型定義,是個(gè)對(duì)象,所以當(dāng)然也是引用類型了。其他同理。
看下面demo

var str1="hello";
var str2=new String("hello");
typeof str1 //string
typeof str2 //object

//如果想獲取str2的字符串,可以通過str2.toString()

str1 instanceof String //false
str2 instanceof String //true
內(nèi)置對(duì)象
定義:“由ECMAScript實(shí)現(xiàn)提供的、獨(dú)立于宿主環(huán)境的所有對(duì)象,在ECMAScript程序開始執(zhí)行時(shí)出現(xiàn)”。這意味著開發(fā)者不必明確實(shí)例化內(nèi)置對(duì)象,它已經(jīng)被實(shí)例化了。
內(nèi)置對(duì)象只有兩個(gè)GlobalMath,他們其實(shí)也是本地對(duì)象,根據(jù)定義每個(gè)內(nèi)置對(duì)象都是本地對(duì)象。
宿主對(duì)象
所有非本地對(duì)象都是宿主對(duì)象,即由ECMAScript實(shí)現(xiàn)的宿主環(huán)境提供的對(duì)象。所有BOMDOM對(duì)象都是宿主對(duì)象。
typeof

最常見的判斷方法:typeof,它的官方解釋:

typeof操作符返回一個(gè)字符串,表示未經(jīng)計(jì)算的操作數(shù)的類型。
簡(jiǎn)單理解就是typeof是判斷的是原始類型(值類型),但函數(shù)返回的是function,null返回的也是object
typeof Undefined //"undefined"
var num;
typeof num  //undefined
typeof各類型返回結(jié)果列表
類型 結(jié)果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol (ECMAScript 6 新增) "symbol"
宿主對(duì)象(由JS環(huán)境提供) Implementation-dependent
函數(shù)對(duì)象([[Call]] 在ECMA-262條款中實(shí)現(xiàn)了) "function"
任何其他對(duì)象 "object"
為什么typeof null是object
在 JavaScript 最初的實(shí)現(xiàn)中,JavaScript 中的值是由一個(gè)表示類型的標(biāo)簽和實(shí)際數(shù)據(jù)值表示的。對(duì)象的類型標(biāo)簽是 0。由于 null 代表的是空指針(大多數(shù)平臺(tái)下值為 0x00),因此,null的類型標(biāo)簽也成為了 0,typeof null就錯(cuò)誤的返回了"object"。
typeof優(yōu)缺點(diǎn)列表
優(yōu)點(diǎn) 缺點(diǎn)
判斷原始類型比較方便 null返回的是object
方法返回的是function
所有的引用類型都返回object,Array、Date等不能準(zhǔn)確定位
instanceof
定義:“instanceof 運(yùn)算符用來測(cè)試一個(gè)對(duì)象(第一個(gè)參數(shù))在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)(第二個(gè)參數(shù))的 prototype 屬性。”
簡(jiǎn)單理解就是:instanceof是判斷兩個(gè)對(duì)象“最近”prototype是否一樣。
另外,instanceof是判斷對(duì)象是否屬于某一類型,而不是獲取的對(duì)象的類型。
var str1="hello";
var str2=new String("hello");
var arr=[1,2,3];
function person(){}
function man(){}
man.prototype=new person();
var m1=new person();
var m2=new man();

str1 instanceof String    //false
str2 instanceof String    //true
arr instanceof Array      //true
arr instanceof window.frames[0].Array  //false
m1 instanceof person      //true
m2 instanceof man         //true
m2 intanceof person       //true
優(yōu)缺點(diǎn)列表
優(yōu)點(diǎn) 缺點(diǎn)
判斷對(duì)象的具體類型 只能判斷對(duì)象,對(duì)原始類型不能判斷
多全局對(duì)象時(shí)返回不正確
多全局對(duì)象解釋
簡(jiǎn)單來說:多全局對(duì)象就是跨窗口或跨frame操作。
全局環(huán)境

在瀏覽器中,我們的腳本可能需要在多個(gè)窗口之間進(jìn)行交互。多個(gè)窗口意味著多個(gè)全局環(huán)境,不同的全局環(huán)境擁有不同的全局對(duì)象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。
這可能會(huì)引發(fā)一些問題。
比如,表達(dá)式 [] instanceof window.frames[0].Array 會(huì)返回false,因?yàn)?Array.prototype !== window.frames[0].Array.prototype,因此你必須使用 Array.isArray(myObj) 或者 Object.prototype.toString.call(myObj) === "[object Array]"來判斷myObj是否是數(shù)組。

根據(jù)對(duì)象的constructor判斷
alert(c.constructor === Array) ----------> true
alert(d.constructor === Date) -----------> true
alert(e.constructor === Function) -------> true
注意: constructor 在類繼承時(shí)會(huì)出錯(cuò)
eg:
      function A(){};
      function B(){};
      A.prototype = new B(); //A繼承自B
      var aObj = new A();
      alert(aobj.constructor === B) -----------> true;
      alert(aobj.constructor === A) -----------> false;
而instanceof方法不會(huì)出現(xiàn)該問題,對(duì)象直接繼承和間接繼承的都會(huì)報(bào)true:
      alert(aobj instanceof B) ----------------> true;
      alert(aobj instanceof B) ----------------> true;
言歸正傳,解決construtor的問題通常是讓對(duì)象的constructor手動(dòng)指向自己:
      aobj.constructor = A; //將自己的類賦值給對(duì)象的constructor屬性
      alert(aobj.constructor === A) -----------> true;
      alert(aobj.constructor === B) -----------> false; //基類不會(huì)報(bào)true了;

缺點(diǎn):繼承的對(duì)象判斷時(shí),不準(zhǔn)確。感覺雞肋。

最靠譜的方法: Object.prototype.toString.call(obj)

這種方法不存在多全局環(huán)境和Array、null返回object的情況,

原始類型和原始類型對(duì)應(yīng)的引用類型聲明的變量都能返回正確的值

但是這個(gè)方法對(duì)自定義類型無效,自定義類型返回的都是Object,所以自定義時(shí)還是使用instanceof

var str1="hello";
var str2=new String("hello");
var arr=[1,2,3];
function Man(){}
var man=new Man();
Object.prototype.toString.call(str1);   //[object String]
Object.prototype.toString.call(str2);   //[object String]
Object.prototype.toString.call(arr);   //[object Array]
Object.prototype.toString.call(man);   //[object Object]
Object.prototype.toString.call(null);   //[object Null]
Object.prototype.toString.call(/test/)  //[object RegExp]
優(yōu)點(diǎn) 缺點(diǎn)
不存在多全局環(huán)境問題 只能判斷本地對(duì)象和宿主對(duì)象
原始類型無論是字面量語(yǔ)法聲明還是通過對(duì)應(yīng)的引用類型聲明都能正確判斷 自定義類型都返回[object Object]
jquery.type()

就是對(duì)prototype的封裝。源碼附上:

type: function( obj ) {
        return obj == null ?
            String( obj ) :
            class2type[ toString.call(obj) ] || "object";
    },
對(duì)數(shù)組的判斷
var arr=[1,2,3];
typeof arr   //object  分辨不出類型
arr instanceof Array   //true //受多全局環(huán)境影響
Object.prototype.toString.call(arr);  //[object Array] //推薦
Array.isArray(arr)    //true //推薦
$.type(arr)   //array  //推薦

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94351.html

相關(guān)文章

  • 前端面試題總結(jié)js、html、小程序、React、ES6、Vue、算法、全棧熱門視頻資源)

    摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...

    li21 評(píng)論0 收藏0
  • 前端面試題總結(jié)js、html、小程序、React、ES6、Vue、算法、全棧熱門視頻資源)

    摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...

    AaronYuan 評(píng)論0 收藏0
  • 前端面試題總結(jié)js、html、小程序、React、ES6、Vue、算法、全棧熱門視頻資源)

    摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...

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

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

0條評(píng)論

voyagelab

|高級(jí)講師

TA的文章

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