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

資訊專欄INFORMATION COLUMN

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

voyagelab / 1841人閱讀

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

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

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

Boolean

Null

Undefined

Number

String

Symbol (ECMAScript 6 新定義)

Object

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

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

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

疑問:

1.有人可能會問,為什么String也是Object類型,上面不是說了是原始類型嗎?
答:原始類型中有字符串String不錯,它只是表達(dá)了一種數(shù)據(jù)類型,但數(shù)據(jù)類型也有自己的類定義啊,是吧,上面的String說的就是它的類型定義,是個對象,所以當(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)置對象
定義:“由ECMAScript實現(xiàn)提供的、獨(dú)立于宿主環(huán)境的所有對象,在ECMAScript程序開始執(zhí)行時出現(xiàn)”。這意味著開發(fā)者不必明確實例化內(nèi)置對象,它已經(jīng)被實例化了。
內(nèi)置對象只有兩個GlobalMath,他們其實也是本地對象,根據(jù)定義每個內(nèi)置對象都是本地對象。
宿主對象
所有非本地對象都是宿主對象,即由ECMAScript實現(xiàn)的宿主環(huán)境提供的對象。所有BOMDOM對象都是宿主對象。
typeof

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

typeof操作符返回一個字符串,表示未經(jīng)計算的操作數(shù)的類型。
簡單理解就是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"
宿主對象(由JS環(huán)境提供) Implementation-dependent
函數(shù)對象([[Call]] 在ECMA-262條款中實現(xiàn)了) "function"
任何其他對象 "object"
為什么typeof null是object
在 JavaScript 最初的實現(xiàn)中,JavaScript 中的值是由一個表示類型的標(biāo)簽和實際數(shù)據(jù)值表示的。對象的類型標(biāo)簽是 0。由于 null 代表的是空指針(大多數(shù)平臺下值為 0x00),因此,null的類型標(biāo)簽也成為了 0,typeof null就錯誤的返回了"object"。
typeof優(yōu)缺點(diǎn)列表
優(yōu)點(diǎn) 缺點(diǎn)
判斷原始類型比較方便 null返回的是object
方法返回的是function
所有的引用類型都返回object,Array、Date等不能準(zhǔn)確定位
instanceof
定義:“instanceof 運(yùn)算符用來測試一個對象(第一個參數(shù))在其原型鏈中是否存在一個構(gòu)造函數(shù)(第二個參數(shù))的 prototype 屬性?!?br>簡單理解就是:instanceof是判斷兩個對象“最近”prototype是否一樣。
另外,instanceof是判斷對象是否屬于某一類型,而不是獲取的對象的類型。
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)
判斷對象的具體類型 只能判斷對象,對原始類型不能判斷
多全局對象時返回不正確
多全局對象解釋
簡單來說:多全局對象就是跨窗口或跨frame操作。
全局環(huán)境

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

根據(jù)對象的constructor判斷
alert(c.constructor === Array) ----------> true
alert(d.constructor === Date) -----------> true
alert(e.constructor === Function) -------> true
注意: constructor 在類繼承時會出錯
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方法不會出現(xiàn)該問題,對象直接繼承和間接繼承的都會報true:
      alert(aobj instanceof B) ----------------> true;
      alert(aobj instanceof B) ----------------> true;
言歸正傳,解決construtor的問題通常是讓對象的constructor手動指向自己:
      aobj.constructor = A; //將自己的類賦值給對象的constructor屬性
      alert(aobj.constructor === A) -----------> true;
      alert(aobj.constructor === B) -----------> false; //基類不會報true了;

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

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

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

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

但是這個方法對自定義類型無效,自定義類型返回的都是Object,所以自定義時還是使用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)境問題 只能判斷本地對象和宿主對象
原始類型無論是字面量語法聲明還是通過對應(yīng)的引用類型聲明都能正確判斷 自定義類型都返回[object Object]
jquery.type()

就是對prototype的封裝。源碼附上:

type: function( obj ) {
        return obj == null ?
            String( obj ) :
            class2type[ toString.call(obj) ] || "object";
    },
對數(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

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

相關(guān)文章

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

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

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

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

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

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

    pumpkin9 評論0 收藏0

發(fā)表評論

0條評論

voyagelab

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<