JavaScript變量與類型

javascript筆記(一)

變量

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

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

這里专甩,變量 message 是在函數中使用 var 定義的钟鸵。當函數被調用時钉稍,就會創(chuàng)建該變量并為其賦值。而在此之后棺耍,這個變量又會立即被銷毀贡未,因此例子中的下一行代碼就會導致錯誤。不過蒙袍,可以像下面這 樣省略 var 操作符俊卤,從而創(chuàng)建一個全局變量:

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

? 這個例子省略了 var 操作符,因而 message 就成了全局變量害幅。這樣消恍,只要調用過一次 test()函數,這個變量就有了定義以现,就可以在函數外部的任何地方被訪問到狠怨。
注:雖然省略 var 操作符可以定義全局變量,但這也不是我們推薦的做法邑遏。因為在局部作用域中定義的全局變量很難維護佣赖,而且如果有意地忽略了 var 操作符,也會由于相應變量不會馬上就有定義而導致不必要的混亂记盒。

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

數據類型

JavaScript有5種原始類型(也稱為基本數據類型):Undefined棚辽、Null、Boolean巷疼、Number和String晚胡。還有1種復雜數據類型:Object。在JavaScript中Function嚼沿、Arrary估盘、Date...都是Object對象類型。

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

var m;
undefined
null == undefined; // 因為==有自動類型轉換
true
null === undefined;
false
NaN != NaN;
true
NaN !== NaN;
true

有一個isNaN()函數攀细,測試入參是否不能轉為數字箫踩。

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

可以看到爱态,布爾型,空字符串境钟,null锦担,空數組{}。都是可以轉為數字的慨削。
undefined洞渔,空對象是不能轉為數字的。

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

Object的每個實例都具有下列屬性和方法:

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

轉化為布爾

簡單來說就是以下六個值轉化結果為false,其他的值全部轉換為true

  1. undefined

  2. null

  3. ""(空字符串)

  4. 0

  5. NaN

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

     Boolean({})
     true
    

注意邓萨,js是區(qū)分大小寫的,不要寫錯成boolean菊卷。

轉換為數字

  • Number()轉換任意類型參數為數值

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

    Number()轉換對象:

    1. 先調用對象自身的valueOf方法缔恳,如果該方法返回原始類型的值(數值、字符串和布爾值)洁闰,則直接對該值使用Number方法歉甚,不再進行后續(xù)步驟。
    2. 如果valueOf方法返回復合類型的值扑眉,再調用對象自身的toString方法纸泄,如果toString方法返回原始類型的值,則對該值使用Number方法腰素,不再進行后續(xù)步驟聘裁。
    3. 如果toString方法返回的是復合類型的值,則報錯弓千。
  • parseInt()用于將字符串轉換為整數

      parseInt("1.2")
      1
      parseInt("1.7")
      1     -----------截斷衡便,非四舍五入
      parseInt("a222")
      NaN
      parseInt("2a")
      2     ----------匹配最長數
      parseInt("")
      NaN   ----------是NaN
      parseInt("0xA")
      10     ---------自動進制轉換
    
  • parseFloat()將字符串轉為小數

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

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

自動類型轉換

  • “+” 轉為字符串拼接
  • “-”镣陕,“*”谴餐,“/”,"%" 轉為數值運算。調用Number()
  • "+","-"做一元運算時呆抑,轉為數值
  • 布爾運算符岂嗓,轉為布爾型
  • == 和 != 運算,如果類型不同理肺,先進行類型轉換摄闸。
    原則是:
    • 如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值——false 轉換為 0妹萨,而true 轉換為 1;
    • 如果一個操作數是字符串炫欺,另一個操作數是數值乎完,在比較相等性之前先將字符串轉換為數值;
    • 如果一個操作數是對象品洛,另一個操作數不是树姨,則調用對象的 valueOf()方法,用得到的基本類型值按照前面的規(guī)則進行比較桥状;
    • 這兩個操作符在進行比較時則要遵循下列規(guī)則帽揪。
      null 和 undefined 是相等的。
      要比較相等性之前辅斟,不會將 null 和 undefined 轉換成其他任何值转晰。

例如:

    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"——如果這個值未定義;
(2) "boolean"——如果這個值是布爾值士飒;
(3) "string"——如果這個值是字符串查邢;
(4) "number"——如果這個值是數值;
(5) "object"——如果這個值是對象或 null酵幕;
(6) "function"——如果這個值是函數扰藕。

相等與嚴格相等

相等運算符(==)比較兩個“值”是否相等,嚴格相等運算符(===)比較它們是否為“同一個值”芳撒。兩者的一個重要區(qū)別是邓深,如果兩個值不是同一類型,嚴格相等運算符(===)直接返回false笔刹,而相等運算符(==)會將它們轉化成同一個類型芥备,再用嚴格相等運算符進行比較。

相等運算符隱藏的類型轉換徘熔,會帶來一些違反直覺的結果门躯。

建議不要使用相等運算符(==),最好只使用嚴格相等運算符(===)酷师。

void運算符

void運算符的作用是執(zhí)行一個表達式讶凉,然后返回undefined染乌。

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

上面是void運算符的兩種寫法,都正確懂讯。建議采用后一種形式荷憋,即總是使用括號。因為void運算符的優(yōu)先性很高褐望,如果不使用括號勒庄,容易造成錯誤的結果。比如瘫里,void 4+7 實際上等同于 (void 4) +7实蔽。
下面是void運算符的一個例子。

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

這個運算符主要是用于書簽工具(bookmarklet)或者用于在超級鏈接中插入代碼谨读,目的是返回undefined可以防止網頁跳轉局装。
比如,下面是常用于網頁鏈接的觸發(fā)鼠標點擊事件的寫法劳殖。
<a href="#" onclick="f();">文字</a>
上面代碼有一個問題铐尚,函數f必須返回false,或者onclick事件必須返回false哆姻,否則會引起瀏覽器跳轉到另一個頁面宣增。

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末矛缨,一起剝皮案震驚了整個濱河市爹脾,隨后出現的幾起案子,更是在濱河造成了極大的恐慌劳景,老刑警劉巖誉简,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異盟广,居然都是意外死亡闷串,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門筋量,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姆坚,“玉大人拱烁,你說我怎么就攤上這事暴拄「渥鳎” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵呀酸,是天一觀的道長凉蜂。 經常有香客問我,道長,這世上最難降的妖魔是什么窿吩? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任茎杂,我火速辦了婚禮,結果婚禮上纫雁,老公的妹妹穿的比我還像新娘煌往。我一直安慰自己,他們只是感情好轧邪,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布刽脖。 她就那樣靜靜地躺著,像睡著了一般忌愚。 火紅的嫁衣襯著肌膚如雪曲管。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天菜循,我揣著相機與錄音翘地,去河邊找鬼。 笑死癌幕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的昧穿。 我是一名探鬼主播勺远,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼时鸵!你這毒婦竟也來了胶逢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤饰潜,失蹤者是張志新(化名)和其女友劉穎初坠,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體彭雾,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡碟刺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了薯酝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片半沽。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吴菠,靈堂內的尸體忽然破棺而出者填,到底是詐尸還是另有隱情,我是刑警寧澤做葵,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布占哟,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏榨乎。R本人自食惡果不足惜怎燥,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谬哀。 院中可真熱鬧刺覆,春花似錦、人聲如沸史煎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篇梭。三九已至氢橙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恬偷,已是汗流浹背悍手。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袍患,地道東北人坦康。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像诡延,于是被迫代替她去往敵國和親滞欠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容