JavaScript變量與類型

javascript筆記(一)

變量

  • 局部變量
    用 var 操作符定義的變量將成為定義該變量的作用域中的局部變量。也就是說,如果在函數(shù)中使用 var 定義一個(gè)變量,那么這個(gè)變量在函數(shù)退出后就會被銷毀,例如:

      ```
      function test(){
          var message = "hi"; // 局部變量
      }
      test();
      alert(message); // 錯(cuò)誤!
      ```
    

這里,變量 message 是在函數(shù)中使用 var 定義的。當(dāng)函數(shù)被調(diào)用時(shí),就會創(chuàng)建該變量并為其賦值。而在此之后,這個(gè)變量又會立即被銷毀,因此例子中的下一行代碼就會導(dǎo)致錯(cuò)誤。不過,可以像下面這 樣省略 var 操作符,從而創(chuàng)建一個(gè)全局變量:

    ```
    function test(){   
        message = "hi"; // 全局變量
    }
    test();
    alert(message); // "hi"
    ```

? 這個(gè)例子省略了 var 操作符,因而 message 就成了全局變量。這樣,只要調(diào)用過一次 test()函數(shù),這個(gè)變量就有了定義,就可以在函數(shù)外部的任何地方被訪問到。
注:雖然省略 var 操作符可以定義全局變量,但這也不是我們推薦的做法。因?yàn)樵诰植孔饔糜蛑卸x的全局變量很難維護(hù),而且如果有意地忽略了 var 操作符,也會由于相應(yīng)變量不會馬上就有定義而導(dǎo)致不必要的混亂。

JavaScript 與其他語言的(如 Java)的重要區(qū)別是在 JavaScript 中語句塊(blocks)是沒有作用域的,只有函數(shù)有作用域。因此如果在一個(gè)復(fù)合語句中(如 if 控制結(jié)構(gòu)中)使用 var 聲明一個(gè)變量,那么它的作用域是整個(gè)函數(shù)(復(fù)合語句在函數(shù)中)。 但是從 ECMAScript Edition 6 開始將有所不同的, let 和 const 關(guān)鍵字允許你創(chuàng)建塊作用域的變量。

數(shù)據(jù)類型

JavaScript有5種原始類型(也稱為基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number和String。還有1種復(fù)雜數(shù)據(jù)類型:Object。在JavaScript中Function、Arrary、Date...都是Object對象類型。

null和undefined是不一樣的。只聲明未賦值的變量,是undefined的。

var m;
undefined
null == undefined; // 因?yàn)?=有自動類型轉(zhuǎn)換
true
null === undefined;
false
NaN != NaN;
true
NaN !== NaN;
true

有一個(gè)isNaN()函數(shù),測試入?yún)⑹欠癫荒苻D(zhuǎn)為數(shù)字。

isNaN(true);
false
isNaN(false);
false
isNaN("");
false
isNaN("ss");
true
isNaN(null);
false
isNaN(undefined);
true
isNaN([]);
false
isNaN({});
true

可以看到,布爾型,空字符串,null,空數(shù)組{}。都是可以轉(zhuǎn)為數(shù)字的。
undefined,空對象是不能轉(zhuǎn)為數(shù)字的。

在JavaScript中Object類型是所有它的實(shí)例的基礎(chǔ)。像我們知道的Array()、Date()、還有有意思的function()類型,都是從Object繼承的。Object 類型所具有的任何屬性和方法也同樣存在于更具體的對象中。

Object的每個(gè)實(shí)例都具有下列屬性和方法:

  1. constructor:保存著用于創(chuàng)建當(dāng)前對象的函數(shù)。
  2. hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對象實(shí)例中(而不是在實(shí)例的原型中)是否存在。其中,作為參數(shù)的屬性名(propertyName)必須以字符串形式指定(例如:o.hasOwnProperty("name"))
  3. isPrototypeOf(object):用于檢查傳入的對象是否是調(diào)用方的原型
  4. propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用 for-in 語句(本章后面將會討論)來枚舉。
  5. toString():返回對象的字符串表示。
  6. valueOf():返回對象的字符串、數(shù)值或布爾值表示。

轉(zhuǎn)化為布爾

簡單來說就是以下六個(gè)值轉(zhuǎn)化結(jié)果為false,其他的值全部轉(zhuǎn)換為true

  1. undefined

  2. null

  3. ""(空字符串)

  4. 0

  5. NaN

  6. false
    特別注意:所有對象的布爾值都是true

     Boolean({})
     true
    

注意,js是區(qū)分大小寫的,不要寫錯(cuò)成boolean。

轉(zhuǎn)換為數(shù)字

  • Number()轉(zhuǎn)換任意類型參數(shù)為數(shù)值

      Number(true)
      1
      Number(false)
      0
      Number(undefined)
      NaN
      Number(null)
      0
      Number("")
      0
      Number("1.1")
      1.1
      Number("0xA")
      10       --------自動進(jìn)行進(jìn)制轉(zhuǎn)換
      Number("2a")
      NaN
      Number({})
      NaN
      Number([])
      0
    

    Number()轉(zhuǎn)換對象:

    1. 先調(diào)用對象自身的valueOf方法,如果該方法返回原始類型的值(數(shù)值、字符串和布爾值),則直接對該值使用Number方法,不再進(jìn)行后續(xù)步驟。
    2. 如果valueOf方法返回復(fù)合類型的值,再調(diào)用對象自身的toString方法,如果toString方法返回原始類型的值,則對該值使用Number方法,不再進(jìn)行后續(xù)步驟。
    3. 如果toString方法返回的是復(fù)合類型的值,則報(bào)錯(cuò)。
  • parseInt()用于將字符串轉(zhuǎn)換為整數(shù)

      parseInt("1.2")
      1
      parseInt("1.7")
      1     -----------截?cái)?,非四舍五?  parseInt("a222")
      NaN
      parseInt("2a")
      2     ----------匹配最長數(shù)
      parseInt("")
      NaN   ----------是NaN
      parseInt("0xA")
      10     ---------自動進(jìn)制轉(zhuǎn)換
    
  • parseFloat()將字符串轉(zhuǎn)為小數(shù)

    parseFloat("1.7")
    1.7
    parseFloat("1.7e3")
    1700
    parseFloat("")
    NaN
  • 關(guān)于空字符串
    Number("")
    0
    parseInt("")
    NaN
    isNaN("")
    false

parseInt()會返回NaN。isNaN()卻又返回false。

自動類型轉(zhuǎn)換

  • “+” 轉(zhuǎn)為字符串拼接
  • “-”,“*”,“/”,"%" 轉(zhuǎn)為數(shù)值運(yùn)算。調(diào)用Number()
  • "+","-"做一元運(yùn)算時(shí),轉(zhuǎn)為數(shù)值
  • 布爾運(yùn)算符,轉(zhuǎn)為布爾型
  • == 和 != 運(yùn)算,如果類型不同,先進(jìn)行類型轉(zhuǎn)換。
    原則是:
    • 如果有一個(gè)操作數(shù)是布爾值,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值——false 轉(zhuǎn)換為 0,而true 轉(zhuǎn)換為 1;
    • 如果一個(gè)操作數(shù)是字符串,另一個(gè)操作數(shù)是數(shù)值,在比較相等性之前先將字符串轉(zhuǎn)換為數(shù)值;
    • 如果一個(gè)操作數(shù)是對象,另一個(gè)操作數(shù)不是,則調(diào)用對象的 valueOf()方法,用得到的基本類型值按照前面的規(guī)則進(jìn)行比較;
    • 這兩個(gè)操作符在進(jìn)行比較時(shí)則要遵循下列規(guī)則。
      null 和 undefined 是相等的。
      要比較相等性之前,不會將 null 和 undefined 轉(zhuǎn)換成其他任何值。

例如:

    null == undfined       //true
    "NaN" == NaN           //false
    NaN == NaN             //false
    5 == NaN              //false
    NaN != NaN            //true
    false == 0           //true
    true == "1"            //true
    undefined == 0        // false

類型檢測

typeof()

(1) "undefined"——如果這個(gè)值未定義;
(2) "boolean"——如果這個(gè)值是布爾值;
(3) "string"——如果這個(gè)值是字符串;
(4) "number"——如果這個(gè)值是數(shù)值;
(5) "object"——如果這個(gè)值是對象或 null;
(6) "function"——如果這個(gè)值是函數(shù)。

相等與嚴(yán)格相等

相等運(yùn)算符(==)比較兩個(gè)“值”是否相等,嚴(yán)格相等運(yùn)算符(===)比較它們是否為“同一個(gè)值”。兩者的一個(gè)重要區(qū)別是,如果兩個(gè)值不是同一類型,嚴(yán)格相等運(yùn)算符(===)直接返回false,而相等運(yùn)算符(==)會將它們轉(zhuǎn)化成同一個(gè)類型,再用嚴(yán)格相等運(yùn)算符進(jìn)行比較。

相等運(yùn)算符隱藏的類型轉(zhuǎn)換,會帶來一些違反直覺的結(jié)果。

建議不要使用相等運(yùn)算符(==),最好只使用嚴(yán)格相等運(yùn)算符(===)。

void運(yùn)算符

void運(yùn)算符的作用是執(zhí)行一個(gè)表達(dá)式,然后返回undefined。

void 0 // undefined
void (0) // undefined

上面是void運(yùn)算符的兩種寫法,都正確。建議采用后一種形式,即總是使用括號。因?yàn)関oid運(yùn)算符的優(yōu)先性很高,如果不使用括號,容易造成錯(cuò)誤的結(jié)果。比如,void 4+7 實(shí)際上等同于 (void 4) +7。
下面是void運(yùn)算符的一個(gè)例子。

var x = 3;
void (x = 5) //undefined
x // 5

這個(gè)運(yùn)算符主要是用于書簽工具(bookmarklet)或者用于在超級鏈接中插入代碼,目的是返回undefined可以防止網(wǎng)頁跳轉(zhuǎn)。
比如,下面是常用于網(wǎng)頁鏈接的觸發(fā)鼠標(biāo)點(diǎn)擊事件的寫法。
<a href="#" onclick="f();">文字</a>
上面代碼有一個(gè)問題,函數(shù)f必須返回false,或者onclick事件必須返回false,否則會引起瀏覽器跳轉(zhuǎn)到另一個(gè)頁面。

function f(){
    // some code
    return false;
}

void運(yùn)算符可以取代上面兩種寫法。
<a href="javascript:void(0)" onclick="f();">文字</a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容