由一次代碼優化想到的Js 數據類型


引子:

上周三進行了代碼優化,其中有一個很普遍的代碼,例如:

  if(test =="") {dothis();}else{dothat()} ----->可以簡化為 !test ? dothis():dothat();

  if(test =="") {dothis()}     ----->可以簡化為 !test&&dothis();

看這個問題簡化的根源,其實就是對test的值進行判斷,判斷是否為false或者是true,如果test==""就執行dothis()這個函數,這個其實就是類型的判斷問題,看來""就是一個false,於是我聯想,還是其他的嗎?

是有的,比如0,false,null,undefined,NaN,我寫了一個例子來測試下:

<!DOCTYPE HTML>
<html >
<head>
    <meta charset="gbk">
    <title></title>
    <script type="text/javascript">
    if(false || null || undefined || '' || 0 || NaN){
        alert(1);
    }else{
        alert(2);
    }
    </script>
</head>
<body>    
</body>
</html>

上述代碼我在各個瀏覽器下輸出為結果2,可見js中是將這6種類型的值當做false的,還有沒有其他的,目前我只想到這些,不過由這個的變體有很多,應用也很多,在函數中,對語句中等等的。。

Js 數據類型

 對於這個主題,首先來看幾個問題,如果你對這幾個問題很清楚的話,那就請直接跳過吧,不用接着往下看了,如果不清楚,建議你還是看看。

  1)如果判斷函數?function 和object的聯系是什么?

  2)typeof 和instanceof 的區別是什么和作用是什么?

  3)undefined 和null 有什么區別?

  4)js 有哪幾種基本的數據類型?

  5)Undefined,undefined,’undefined’分別是什么?

  6)typeof null  ,null instanceof Object 的值是什么

關於類型,不同的書上有很多的不同的說法,

  首先看看ECMA 是怎么說的,ECMA262-5上說 ECMAScript的類型是Undefined,Null,Boolean,String,Number,Object,每種類型對應一種值,分別是undefined,null,true/false, "elements",number,

a collection of prototies,每種類型都有一個對應的值,分別為 ‘undefined’,'null','boolean','string','number','object'.這種說法不能解釋function 是什么類型,null 和undefined 的區別

  javascript高級教程第一版(p11頁)中說,js只有5中原始的基本數據類型(Undefined,Null,Boolean,String,Number),很明顯不對。那么,對象是是什么呢?到第二版中,將Object增加進來了,說Object是
一種復雜的數據類型。所有的值都將是上述6種類型之一,我覺得這種說法還靠譜一點,但是如果 是函數呢?這就說不清楚它屬於哪一類了。

  aimingoo 提到javascript中兩套類型系統,一個是基本數據類型,另外一個是對象類型系統,基本數據類型包括6種,分別是undefined,string,null,boolean,function,object,基本數據類型是通過typeof

來檢測的,對象類型系統是以基礎類型系統為基礎的,對象類型系統通過instanceof來檢測,對象類型與基本數據類型存在着對應的關系,例如String->sting, Boolean-> boolean,Number->number,他們只是映射,本質上

是不同的,undefined,string,null,boolean 是值類型的。function,object 是引用類型的。String,Boolean,Number 類均是object類型,是Object的子類。Function() 也是引用類型,所有的引用類型均是Object的子類。

  我覺得通過兩套類型系統理解js中的數據類型是比較靠譜的。首先它通過typeof 和instanceof 來區別基本數據類型和對象類型,不同的對象類型通過 a instanceof Type 來判斷是否是其相應的類型,

例如:alert(typeof null ) 結果是 “object”,但是alert(null instanceof Object)  結果是false 這個說明null 是對象,但是它不是Object的子類,其次,它能夠解答 “aaaa”.length為什么是4,這個是一個裝箱操作,

當.運算符發現左邊的操作數是一個“值類型”數據時,會隱式地調用Object(x)過程將它轉為對象,於是"aaaa".length 將被隱式地轉化為 String("aaaa").length,而String() 是有length 屬性的,所以有這個值4

回到本文開始處的幾個問題,很明顯都可以解釋了:

  1)如果判斷函數?function 和object的聯系是什么?

     通過typeof 來判斷,function和object都是引用類型,函數的基本數據類型,object是對象類型,function是object的子類

  2)typeof 和instanceof 的區別是什么和作用是什么?

    typeof 用來判斷基本數據類型,instanceof 來判斷對象類型, 但function 有點特殊 alert(typeof function(){}) //"function"  alert(function(){} instanceof Object)  //true

  3)undefined 和null 有什么區別?

    一個是值類型,一個是引用類型

  4)js 有哪幾種基本的數據類型?

    6種:undefined,boolean,string,number,object,function

  5)Undefined,undefined,’undefined’分別是什么?

    Undefined 是類型,undefined 是值,’undefined‘是類型的名稱

  6)typeof null  ,null instanceof Object 的值是什么

    ’object‘  ,false

歡迎大家拍磚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM