1. 程式人生 > >JavaScript學習(二):原始資料型別-字串、數字、布林值、null、undefined

JavaScript學習(二):原始資料型別-字串、數字、布林值、null、undefined

資料型別 --- 能夠表示並操作值的型別,程式語言的最基本特性就是能夠支援多種資料型別。 JavaScript的資料型別分為兩種: 原始型別 (primitive type)  物件型別(object type) 原始資料型別包括:  數字   字串  布林值   , 特殊的原始值:null  undefined,不是數字、字串和布林值,代表了各自特殊型別的唯一的成員。 除了數字、字串、布林值、null和undefined之外就是物件了,物件是屬性的集合,每個屬性都由“名/值對”構成,有一個特殊的物件-全域性物件。 普通的JavaScript物件是“命名值”的無序集合,但JavaScript同樣定義了一種特殊物件-陣列。表示帶編號的值的有序集合。 函式--JavaScript的特殊物件,是具有與它相關聯的可執行程式碼的物件,通過呼叫函式來執行可執行程式碼,並返回運算結果。        如果函式用來初始化(new)一個新建的物件,稱為建構函式,每個建構函式定義了一類物件-由建構函式初始化的物件組成的集合,類可以看做是物件型別的子型別。JavaScript語言核心除了陣列(Array)類和函式(Function)類之外,還定義其他三種有用的類,日期(Date)類,正則(RegExp)類,錯誤(Error)類。可以通過定義自己的建構函式來定義需要的類。 JavaScript直譯器有自己的記憶體管理機制,可以自動對記憶體進行垃圾回收,這意味著程式可以按需建立物件,不必擔心這些物件的銷燬和記憶體回收。當不再有任何引用指向一個物件,直譯器就會知道這個物件沒用,然後自動回收它所佔的資源。 JavaScript是一種面向物件的語言,不嚴格地講,這意味著我們不用全域性的定義函式去操做不同型別的值,資料型別本身可以定義方法來使用值。從技術上來講,只有JavaScript物件才擁有方法,但是數字、字串和布林值也可以擁有自己的方法,在JavaScript中,只有null和undefined是無法擁有方法的值。 JavaScript分類
原始型別 物件型別
擁有方法的型別 不能擁有方法的型別
可變型別:物件、陣列 不可變型別:字串、布林值、null、undefined
在JavaScript中,字串是不可變的,可以訪問字串任意位置的文字,但並未提供修改已知字串的文字內容的方法。 JavaScript可以自由的進行資料型別的轉換。 JavaScript的變數是無型別的,變數可以賦予任何型別的值,統一一個變數可以賦予不同型別的值,使用var 關鍵字來宣告變數。JavaScript採用詞法作用域,不在任何函式內宣告的變數稱作全域性變數,它在JavaScript程式中的任何地方都是可見的,在函式內宣告的變數具有函式作用域,並且只在函式內可見。 3.1  數字
JavaScript不區分整數值和浮點數值,JavaScript中的所有數字均用浮點數字表示。 採用IEEE 754標準定義的64位浮點格式代表數字,最大+-1.7976931348623157x10 (308次方)  最小 +-5x10(-324次方) 能夠表示的整數範圍-2(53次方)~2(53次方),如果超過了此範圍的整數,則無法保證低位數字的精度。 但是,JavaScript中實際的操作(比如陣列索引,位操作符)則是基於32位整數。
3.1.1 整型直接量 JavaScript除了能表示十進位制的整型直接量,同樣能夠識別十六進位制的值,八進位制不確定。
3.1.2 浮點型直接量 浮點型直接量可以含有小數點,一個實數由整數部分、小數點和小數部分組成。  3.14 還可以使用指數記數法表示浮點型直接量,即在實數後跟字母e或E,後面再跟正負號。 1.1457E-32
3.13 JavaScript中的算術運算 JavaScript使用語言本身的算術運算子來進行數字運算,+    -    *    /     % 除了基本的運算子,還支援複雜的算術運算,這些複雜運算通過作為Math物件的屬性定義的函式和常量來實現: Math.pow(2,53); Math.round(.6);..... JavaScript中的算術運算在溢位(overflow)、下溢(underflow)或被零整除時不會報錯。當數字運算結果超過了JavaScript所能表示的數字上限,結果作為一個特殊的無窮大值,在JavaScript中以Infinity表示,負值超過了也是一樣的演算法。無窮大的特性:基於他們的加減乘除也是無窮大。 下溢是當運算結果無限接近於零並比JavaScript能表示的最小值還小的時候發生的一種情況,這種情況下,會返回0.當一個負數發生下溢時,JavaScript返回一個特殊的值“負零”,負零和正零幾乎完全一樣,很少用到。 被零整除在JavaScript並不報錯,只是簡單的返回無窮大或負無窮大;但有一個例外,0/0是無意義的,運算結果也是一個非數字值,用NaN表示。無窮大除以無窮大、給任意負數做開方運算或者算術運算子與不是數字或無法轉換為數字的運算元一起使用時都將返回NaN. JavaScript預定義了全域性變數Infinity和NaN,用來表示正無窮大和非數字值。非數字值NaN有一點特殊:它和任何值都不相等,包括自身,沒辦法通過x==NaN來判斷變數x是否是NaN isNaN()---如果引數是NaN或者是一個非數字值(比如字串和物件),則返回true; isFinite()---在引數不是NaN、Infinity或-Infinity的時候返回true; 負零值同樣有些特殊,它和正零值是相等的,但除了作為除數之外: var zero = 0; var negz = -0; console.log(zero == negz);                          true console.log(1/zero == 1/negz);                   false
3.1.4 二進位制浮點數和四捨五入錯誤       JavaScript採用了IEEE-754浮點數表示法,這是一種二進位制的 表示法,可以精確的表示分數,比如1/2、1/8和1/1024,但是我們常用的是十進位制分數,1/10、1/100等,二進位制並不能表示類似0.1這樣簡單的數字。       JavaScript中的數字有足夠的精度,並且可以極其近似於0.1,但事實上並不等: var x = .3 - .2; var y = .2 - .1; console.log(x); // 0.09999999999999998 console.log(y); // 0.1 x == y; //--false 在任何使用二進位制浮點數的程式語言都會出現這個問題(可以採取分為單位,而不是元)
3.1.5 日期和時間 JavaScript語言核心包括Date()建構函式,用來建立表示日期和時間的物件,但不是基本資料型別。 var then = new Date(2011,0,1);//2011年1月1日 var later = new Date(2011,0,1,17,10,30); //2011年1月1日下午5:10:30 var now = new Date(); var elapsed = now - then; //日期減法:間隔毫秒數 later.getFullYear(); //--2011 later.getMonth();  //--0 從0開始計算月份 later.getDate();  //--1 從1開始計算的 var day = later.getDay();  //--0代表星期天 console.log(day); later.getHours(); later.getUTCHours(); //使用UTC表示小時的時間 基於時區
3.2 文字      字串是一組由16位值組成的不可變的有序序列,每個字元通常來自於Unicode字符集。JavaScript通過字串型別來表示文字。字串的長度是其所含16位值的個數。      JavaScript採用UTF-16編碼的Unicode字符集,JavaScript字串是由一組無符號的16位值組成的序列。最常用的Unicode字元都是通過16位的內碼錶示,並代表字串中的單個字元,那些不能表示為16位的Unicode字元遵循UTF-16編碼規則-用兩個16位值組成的一個序列表示。這意味著一個長度為2的JavaScript字串(兩個16位值)有可能表示一個Unicode字元: var p = "π"; var e = "e"; console.log(e.length);  //--2
3.2.1 字串直接量     在JavaScript程式中的字串直接量,是由單引號或者雙引號括起來的字元序列。由單引號定界的字串刻印包含雙引號,由雙引號定界的字串中也可以包含單引號。     在ECMAScript 3中,字串直接量必須寫在一行中,而在ECMAScript 5中,字串直接量可以拆分成數行,每行必須以反斜線(\)結束,反斜線和行結束符都不算字串直接量的內容。如果希望在字串直接量中另起一行,可以使用轉義字元  \n     *再用單引號的時候必須注意英文中的縮寫和所有格寫法 can't   O'Relly's,此時必須使用反斜線(\)來轉義。     *JavaScript程式碼和HTML程式碼都用單引號或者雙引號,但最好各自使用個獨立的引號風格。
3.2.2 轉義字元      在JavaScript中,反斜線(\)有著特殊的用途,如在上文中轉義:'can\'t  '  ' O\'Relly\'s'  JavaScript轉義字元 \o    ----   NUL字元(\u0000) \b    ----   退格符(\u0008) \t     ----   水平製表符(\u0009) \n    ----   換行符(\u000A) \v    ----   垂直製表符(\u000B) \f     ----   換頁符  (\u000C) \r    -----   回車符(\u000D) \''    ----    雙引號(\u0022) \'    -----   撇號或者單引號(\u0027) \\    -----  反斜線(\u005C) \xXX    -----  由兩位十六進位制數XX指定的Latin-1字元 \uXXXX   ----  由四位十六進位制數XXXX指定的Unicode字元 如果“\”字元沒有在以上列表中出現,則忽略“\”
3.2.3 字串的使用     JavaScript的內建功能之一就是字串的連線,用“+”作用於字串表示字串連線     JavaScript字串呼叫方法: var s = "hello,world"; s.charAt(0); //第一個字元:h s.substring(1,4); //第2-4個字元:ell s.slice(1,4); //同上 s.slice(-3);  //最後三個字元:rld s.indexOf("l");  //字元"l"第一次出現:2 s.lastIndexOf("l"); //字串"l"最後一次出現:9 s.indexOf("l",3); //在位置3後面首次出現"l"的位置:3 s.split(",");//按照","分割:['hello','world'] s.replace("h","H");//"h"全用"H"替代 s.toUpperCase();//純大寫 
 3.2.4  模式匹配     JavaScript定義了RegExp()建構函式,用來建立表示文字匹配模式的物件   ------  稱為‘正則表示式’     JavaScript採用Perl中的正則表示式語法,String和RegExp物件均定義了利用正則表示式進行模式匹配和查詢與替換的函式     RegExp是JavaScript的特殊物件,雖然不是語言中的基本資料型別,但是具有直接量寫法,可以直接在JavaScript程式中使 var text = "testing:1,2,3"; var pattern = /\d+/g;  //匹配所有包含一個或多個數字的例項 pattern.test(text);  // true text.search(pattern);  //首次匹配成功的位置:8 text.match(pattern);  //所有匹配組成的陣列 ['1','2','3']
3.3 布林值
布林值代表真或假、開或關、是或否,只有兩個值 true、false。 在JavaScript中,任意的JavaScript值都可以轉換成布林值: undefined ,null ,0 ,-0 ,NaN ,“”   會被轉換成false; 所有其他值,包括所有物件(陣列)都會轉換成true 假值(falsy value)--false和上面六個可以轉換成false的值; 真值(truthy value) -- true和可以轉換成true的值; 在JavaScript期望使用一個布林值時,假值會被當成false,真值會被當成true。 if(o !== null)......只有當o不是null時才會執行之後的程式碼 if(o)......o不是任何假值都會執行之後的程式碼
3.4 null和undefined
null 是JavaScript的關鍵字,表示一個特殊值,常用來描述“空值”;、 表示數字、字串和物件是“無值”的; typeof(null) == "object"  // "object"    返回字串“object” ,也就是說,可以把null認為是一個特殊的物件值,含義是非物件。 undefined是預定義的全域性變數,不是關鍵字,它的值就是“未定義”; 表明變數沒有初始化,或者屬性和元素不存在 typeof(undefined)  // "undefined"  返回字串“undefined” 這個值是這個型別的唯一成員