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

資訊專欄INFORMATION COLUMN

JavaScript類型判斷

Pink / 2714人閱讀

摘要:復雜類型復雜類型從字面量是直接生成構造函數的,所以不會像基本類型一樣兩種情況。

</>復制代碼

  1. JS(ES6)中的基本數據類型:1.數值型(Number):包括整數、浮點數、2.布爾型(Boolean)、3.字符串型(String)、4.數組(Array)、5.空值(Null) 、6.未定義(Undefined),基本數據類型是按值訪問的,因為可以直接操作保存在變量中的實際值。
    引用類型:ObjectArrayFunction 、Data,引用數據類型是保存在堆內存中的對象
1.typeof

</>復制代碼

  1. var a;
  2. console.log("1:" + typeof a);
  3. var b = null;
  4. console.log("2:" + typeof b);
  5. var c = undefined;
  6. console.log("3:" + typeof c);
  7. var d = new Object;
  8. console.log("4:" + typeof d);
  9. var e = function() {};
  10. console.log("5:" + typeof e);
  11. var f = {};
  12. console.log("6:" + typeof f);
  13. var g = "";
  14. console.log("7:" + typeof g);
  15. var h = [];
  16. console.log("8:" + typeof h);
  17. var i = true;
  18. console.log("9:" + typeof i);
  19. var j = 123;
  20. console.log("10:" + typeof j);
  21. var k = NaN;
  22. console.log("11:" + typeof k);
  23. var l = /^[-+]?d+$/;
  24. console.log("12:" + typeof l);

打印結果如下

總結:typeof對null、undefined、NaN、數組、正則、Object的類型都為object

2.constructor

</>復制代碼

  1. constructor 用于判斷一個變量的原型,constructor 屬性返回對創建此對象的數組函數的引用.
    當一個函數 F被定義時,JS引擎會為F添加 prototype 原型,然后再在 prototype上添加一個 constructor 屬性,并讓其指向 F 的引用,當執行 var f = new F() 時,F 被當成了構造函數,f 是F的實例對象,此時 F 原型上的 constructor 傳遞到了 f 上,因此 f.constructor === F

</>復制代碼

  1. var F = function(){}
  2. console.log(F.prototype);
  3. var f = new F();
  4. console.log(f.constructor===F) //true

不難看出,F 利用原型對象上的 constructor 引用了自身,當 F 作為構造函數來創建對象時,原型上的 constructor 就被遺傳到了新創建的對象上, 從原型鏈角度講,構造函數 F 就是新對象的類型。這樣做的意義是,讓新對象在誕生以后,就具有可追溯的數據類型,也就是說對象的constructor屬性指向他的構造函數

所以內置對象在內部構建時闊以這樣做出判斷

null 和 undefined 是無效的對象,因此是不會有 constructor 存在的,這兩種類型的數據需要通過其他方式來判斷

constructor屬性并非一定指向構造函數,他也是可以修改、變更的(當把F.prototype = {}改寫后,會默認把constructor覆蓋掉)

instanceof

</>復制代碼

  1. instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性

</>復制代碼

  1. 及的構造函數有這些基礎類型:StringNumberBoolean、Undefined、Null、Symbol(ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值);
  2. 復雜類型:ArrayObject
  3. 其他類型:FunctionRegExpDate

</>復制代碼

  1. var obj = new Object()
  2. obj instanceof Object // true

注意左側必須是對象(object),如果不是,直接返回false,列如:

</>復制代碼

  1. var num = 1
  2. num instanceof Number // false
  3. num = new Number(1)
  4. num instanceof Number // true

可以看出都是num,而且都是1,只是因為第一個不是對象,是基本類型,所以直接返回false,而第二個是封裝成對象,所以true。
這里要嚴格注意這個問題,有些說法是檢測目標的__proto__與構造函數的prototype相同即返回true,這是不嚴謹的,檢測的一定要是對象才行,如:

基礎類型

</>復制代碼

  1. var num = 1
  2. num.__proto__ === Number.prototype // true
  3. num instanceof Number // false
  4. num = new Number(1)
  5. num.__proto__ === Number.prototype // true
  6. num instanceof Number // true
  7. num.__proto__ === (new Number(1)).__proto__ // true

上面例子可以看出,1與new Number(1)幾乎是一樣的,只是區別在于是否封裝成對象,所以instanceof的結果是不同的,string、boolean等,這些基礎類型一樣的。

</>復制代碼

  1. new String(1) // String {"1"}
  2. String(1) // "1"

new String(1)與String(1)是不同的,new是封裝成對象,而沒有new的只是基礎類型轉換,還是基礎類型
其他基礎類型一樣的。

復雜類型,比如數組與對象,甚至函數等,與基礎類型不同。

復雜類型

</>復制代碼

  1. var arr = []
  2. arr instanceof Array // true
  3. arr instanceof Object // true
  4. Array.isArray(arr) // true

復雜類型從字面量是直接生成構造函數的,所以不會像基本類型一樣兩種情況。
但是上面那個問題,當然,基礎類型也會有這個問題,就是與Object對比。沒辦法,Object在原型鏈的上層,所以都會返回true,如下:

</>復制代碼

  1. (new Number(1)) instanceof Object // true

由于從下往上,比如你判斷是Number,那就沒必要判斷是不是Object了,因為已經是Number了……

其他類型

</>復制代碼

  1. var reg = new RegExp(//)
  2. reg instanceof RegExp // true
  3. reg instanceof Object // true
  4. var date = new Date()
  5. date instanceof Date // true
  6. date instanceof Object // true
  7. 除了Function,都一樣,具體Function如下:
  8. function A() {}
  9. var a = new A()
  10. a instanceof Function // false
  11. a instanceof Object // true
  12. A instanceof Function // true

這里要注意,function A() {}相當于var A; A = function() {},然后分析:

a是new出來,所以是經過構造,因此已經是對象,不再是函數,所以false

a是經過構造的對象,返回ture沒問題

A是個函數,這沒什么問題

{}.toString.call(obj)

用法如下

</>復制代碼

  1. console.log({}.toString.call(1));
  2. console.log({}.toString.call("11"));
  3. console.log({}.toString.call(/123/));
  4. console.log({}.toString.call({}));
  5. console.log({}.toString.call(function() {}));
  6. console.log({}.toString.call([]));
  7. console.log({}.toString.call(true));
  8. console.log({}.toString.call(new Date()));
  9. console.log({}.toString.call(new Error()));
  10. console.log({}.toString.call(null));
  11. console.log({}.toString.call(undefined));
  12. console.log(String(null));
  13. console.log(String(undefined));

返回如下

注意:必須通過 call 或 apply 來調用,而不能直接調用 toString , 從原型鏈的角度講,所有對象的原型鏈最終都指向了 Object, 按照JS變量查找規則,其他對象應該也可以直接訪問到 Object 的 toString方法,而事實上,大部分的對象都實現了自身的 toString 方法,這樣就可能會導致 Object 的 toString 被終止查找,因此要用 call/apply 來強制調用Object 的 toString 方法

jQuery中的方法$.type(),就是用到了toString

</>復制代碼

  1. type: function( obj ) {
  2. if ( obj == null ) {
  3. return obj + "";
  4. }
  5. // Support: Android<4.0, iOS<6 (functionish RegExp)
  6. return typeof obj === "object" || typeof obj === "function" ?
  7. class2type[ toString.call(obj) ] || "object" :
  8. typeof obj;
  9. },

分析源代碼:

</>復制代碼

  1. typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ]

通過判斷傳入類型,如果是object或者function類型就直接返回class2type 中鍵值是對的結果,如果不是,那么一定就是基本類型, 通過 typeof 就可以

</>復制代碼

  1. class2type[ toString.call(obj) ] || "object"

這是為了防止一些未知情況的,如果未取到,就返回object,保證了程序可用性

參考文章:
JS類型判斷,typeof/constructor/instanceof的區別
js中的constructor和prototype
JS類型判斷
jquery源碼
揭開js之constructor屬性的神秘面紗

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100670.html

相關文章

  • JavaScript專題系列文章

    摘要:專題系列共計篇,主要研究日常開發中一些功能點的實現,比如防抖節流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數組合專題系列第十六篇,講解函數組合,并且使用柯里化和函數組合實現模式需求我們需要寫一個函數,輸入,返回。 JavaScript 專題之從零實現 jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現一個 jQuery 的 ext...

    Maxiye 評論0 收藏0
  • JavaScript instanceof運算符深入分析

    摘要:注意基本變量類型不是對象類型,只有基本包裝類型才是對象類型。至于顯示的原型,在里用屬性表示,這個是原型繼承的基礎知識,在這里就不在敘述了。 前言 如果你要開發一個復雜的產品,那么肯定少不了使用面向對象機制,當然也避不開 Javascript 里面的繼承,instanceof 運算符是原生 Javascript 語言中用來判斷實例繼承的操作符。所以我們有必要深入理解該運算符! inst...

    zhangyucha0 評論0 收藏0
  • 如何判斷JavaScript的數據類型

    摘要:本文將講解我目前所知道的判斷數據類型的方法。數據類型一共有種除了之外的種屬于原始數據類型。等價于問題四的返回值是什么答案。 本文將講解我目前所知道的判斷JavaScript數據類型的方法。JavaScript數據類型一共有7種: Undefined Null Boolean String Symbol Number Object 除了Object之外的6種屬于原始數據類型。有時,我...

    jackzou 評論0 收藏0
  • javascript如何判斷變量的數據類型

    摘要:除和外,所有的數據類型都是可以轉化為對象,而如果是對象,就肯定有構造函數。特性因為和沒有構造函數,因此不能用此方法來判斷。由于同一條原型繼承鏈上的各個對象的構造函數都不一樣,因此,此方法可以區分開繼承鏈上的各個自定義數據類型。 typeof 用法示例 var arr = []; typeof arr; //object typeof(arr); //object typeo...

    曹金海 評論0 收藏0
  • javascript 數據類型判斷 (常見庫的數據類型判斷源碼的分析)

    摘要:對象類型常見的有,,,正則新增自己提供的樂行判斷如果不對對象做嚴格區分使用。的實現使用了原型繼承的表示左表達式,表示右表達式,它是用是否等于來判斷對象的類型的。常見框架和庫的實數據類型判斷測試這里將的實現原理抽取出來,用原生實現。 JavaScript一共有六種數據類型,分為原始類型(又名基本類型)和對象類型(又名引用類型) 原始類型有五種,分別為number,string,boole...

    libin19890520 評論0 收藏0
  • JavaScript中,如何判斷數組是數組?

    摘要:比如我們今天要討論的,在當中如何判斷一個數組是數組。在數組的原型鏈上也能找到構造函數由上面的幾行代碼可以看出,使用運算符可以分辨數組和對象,可以判斷數組是數組。用判斷實例化的數組擁有一個屬性,這個屬性指向生成這個數組的方法。 如果你沒有注意過這個問題,那么這個標題應該會讓你感到困惑,判斷數據類型這么基礎的問題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對的這門語言,可是JavaSc...

    kohoh_ 評論0 收藏0

發表評論

0條評論

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