JavaScript數據類型
在JavaScript中定義了以下幾種數據類型:
- 字符串(String)
- 數字(Number)
- 布爾(Boolean)
- 數組(Array)
- 對象(Object)
- 空(Null)
- 未定義(Undefined)
1. 字符串
字符串是以單引號‘或雙引號"括起來的任意文本:
var carname="Volvo XC60";
var carname=‘Volvo XC60‘;
如果‘
本身也是一個字符,那就可以用""
括起來:
var answer="It‘s alright";
如果"
本身也是一個字符,那就可以用‘‘
括起來:
var answer=‘He is called "Johnny"‘;
如果字符串內部既包含‘
又包含"
怎麽辦?可以用轉義字符\
來標識,比如:
‘I\‘m \"OK\"!‘;
轉義字符\
可以轉義很多字符,比如\n
表示換行,\t
表示制表符,字符\
本身也要轉義,所以\\
表示的字符就是\
。
多行字符串
由於多行字符串用\n
寫起來比較費事,所以最新的ES6標準新增了一種多行字符串的表示方法,用反引號 ` ... ` 表示:
`這是一個
多行
字符串`;
模板字符串
要把多個字符串連接起來,可以用+
號連接:
var name = ‘小明‘; var age = 20; var message = ‘你好, ‘ + name + ‘, 你今年‘ + age + ‘歲了!‘; alert(message);
如果有很多變量需要連接,用+
號就比較麻煩。ES6新增了一種模板字符串,表示方法和上面的多行字符串一樣,但是它會自動替換字符串中的變量:
var name = ‘小明‘; var age = 20; var message = `你好, ${name}, 你今年${age}歲了!`; alert(message);
操作字符串
length
獲取字符串長度
var s = ‘Hello, world!‘; s.length; // 13
要獲取字符串某個指定位置的字符,使用類似Array的下標操作,索引號從0開始:
var s = ‘Hello, world!‘; s[0]; // ‘H‘s[6]; // ‘ ‘ s[7]; // ‘w‘ s[12]; // ‘!‘ s[13]; // undefined 超出範圍的索引不會報錯,但一律返回undefined
需要特別註意的是,字符串是不可變的,如果對字符串的某個索引賦值,不會有任何錯誤,但是,也沒有任何效果:
var s = ‘Test‘; s[0] = ‘X‘; alert(s); // s仍然為‘Test‘
JavaScript為字符串提供了一些常用方法,註意,調用這些方法本身不會改變原有字符串的內容,而是返回一個新字符串:
toUpperCase
toUpperCase()把一個字符串全部變為大寫:
var s = ‘Hello‘; s.toUpperCase(); // 返回‘HELLO‘
toLowerCase
toLowerCase()
把一個字符串全部變為小寫:
var s = ‘Hello‘; var lower = s.toLowerCase(); // 返回‘hello‘並賦值給變量lower lower; // ‘hello‘
indexOf
indexOf()會搜索指定字符串出現的位置:
var s = ‘hello, world‘; s.indexOf(‘world‘); // 返回7 s.indexOf(‘World‘); // 沒有找到指定的子串,返回-1
lastIndexOf
lastIndexOf()從字符串尾部向頭部搜索指定字符:
var s = ‘hello‘; s.lastIndexOf(‘l‘); //返回 3
substr
substr()截取字符串:
var s = ‘hello‘; s.substr(1,2); //返回 ‘el’ // 從索引1開始截取長度為2的字符串
substring
substring()
返回指定索引區間的子串:
var s = ‘hello, world‘ s.substring(0, 5); // 從索引0開始到5(不包括5),返回‘hello‘ s.substring(7); // 從索引7開始到結束,返回‘world‘
trim
trim()去除字符串兩邊空格:
var s = ‘ hello ‘; s.trim(); //返回 ‘hello’
charAt
charAt()獲取指定位置字符:
var s = ‘hello‘; s.charAt(1); //返回 ‘e’
match和search
match()返回匹配字符串的數組,如果沒有匹配則返回null
search()返回匹配字符串的首字符位置索引:
var str1="welcome to the world of world JS!"; var str2=str1.match("world"); var str3=str1.search("world"); alert(str2[0]); // 結果為"world" alert(str3); // 結果為15
slice
slice(),對字符串進行切片操作:
var str1="abcdefgh"; var str2=str1.slice(2,4); //結果為"cd",從索引2開始,截取到索引4,不包含索引4 var str3=str1.slice(4); //結果為"efgh",從索引4開始,截取到字符串末尾 var str4=str1.slice(2,-1); //結果為"cdefg",從索引2開始,截取到字符串末尾,不包含末尾字符 var str5=str1.slice(-3,-1); //結果為"fg",從索引-3開始,截取到字符串末尾索引-1,不包含末尾字符
replace
replace(),替換字符串:
var s = ‘hello,jack‘; s.replace(‘jack‘, ‘michael‘); //返回‘hello,michael’
split
split(),分割字符串:
var str1="一,二,三,四,五,六,日"; var strArray=str1.split(","); //返回數組:["一", "二", "三", "四", "五", "六", "日"]
2. 數字(Number)
JavaScript不區分整數和浮點數,統一用Number表示,以下都是合法的Number類型:
123; // 整數123 0.456; // 浮點數0.456 1.2345e3; // 科學計數法表示1.2345x1000,等同於1234.5 -99; // 負數 NaN; // NaN表示Not a Number,當無法計算結果時用NaN表示 Infinity; // Infinity表示無限大,當數值超過了JavaScript的Number所能表示的最大值時,就表示為Infinity
計算機由於使用二進制,所以,有時候用十六進制表示整數比較方便,十六進制用0x前綴和0-9,a-f表示,例如:0xff00
,0xa5b4c3d2
,等等,它們和十進制表示的數值完全一樣。
2進制: 1111 0011 1101 0100 <-----> 16進制:0xF3D4 <-----> 10進制:62420
2進制: 1 111 001 111 010 100 <-----> 8進制:0171724
3. 布爾值(Boolean)
布爾值和布爾代數的表示完全一致,一個布爾值只有true
、false
兩種值,要麽是true
,要麽是false
,可以直接用true
、false
表示布爾值,實際運算中true=1,false=0,也可以通過布爾運算計算出來:
true; // 這是一個true值 false; // 這是一個false值 2 > 1; // 這是一個true值 2 >= 3; // 這是一個false值
4. 數組(Array)
a. 定義數組
數組是一組按順序排列的集合,集合的每個值稱為元素。JavaScript的數組可以包括任意數據類型。例如:
[1, 2, 3.14, ‘Hello‘, null, true];
上述數組包含6個元素。數組用[]
表示,元素之間用,
分隔。
另一種創建數組的方法是通過Array()
函數實現:
new Array(1, 2, 3); // 創建了數組[1, 2, 3]
然而,出於代碼的可讀性考慮,強烈建議直接使用[]
。
數組的元素可以通過索引來訪問。請註意,索引的起始值為0
:
var arr = [1, 2, 3.14, ‘Hello‘, null, true]; arr[0]; // 返回索引為0的元素,即1 arr[5]; // 返回索引為5的元素,即true arr[6]; // 索引超出了範圍,返回undefined
b. 數組的屬性和方法
要取得Array
的長度,直接訪問length
屬性:
var arr = [1, 2, 3.14, ‘Hello‘, null, true]; arr.length; // 6
請註意,直接給Array
的length
賦一個新的值會導致Array
大小的變化:
var arr = [1, 2, 3]; arr.length; // 3 arr.length = 6; arr; // arr變為[1, 2, 3, undefined, undefined, undefined] arr.length = 2; arr; // arr變為[1, 2]
Array可以通過索引把對應的元素修改為新的值,因此,對Array
的索引進行賦值會直接修改這個Array
:
var arr = [‘A‘, ‘B‘, ‘C‘]; arr[1] = 99; arr; // arr現在變為[‘A‘, 99, ‘C‘]
請註意,如果通過索引賦值時,索引超過了範圍,同樣會引起Array
大小的變化:
var arr = [1, 2, 3]; arr[5] = ‘x‘; arr; // arr變為[1, 2, 3, undefined, undefined, ‘x‘]
大多數其他編程語言不允許直接改變數組的大小,越界訪問索引會報錯。然而,JavaScript的Array
卻不會有任何錯誤。在編寫代碼時,不建議直接修改Array
的大小,訪問索引時要確保索引不會越界。
indexOf
與String類似,Array
也可以通過indexOf()
來搜索一個指定的元素的位置:
var arr = [10, 20, ‘30‘, ‘xyz‘]; arr.indexOf(10); // 元素10的索引為0 arr.indexOf(20); // 元素20的索引為1 arr.indexOf(30); // 元素30沒有找到,返回-1 arr.indexOf(‘30‘); // 元素‘30‘的索引為2
slice
slice()就是對應String的substring()
版本,它截取Array
的部分元素,然後返回一個新的Array
:
var arr = [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘]; arr.slice(0, 3); // 從索引0開始,到索引3結束,但不包括索引3: [‘A‘, ‘B‘, ‘C‘] arr.slice(3); // 從索引3開始到結束: [‘D‘, ‘E‘, ‘F‘, ‘G‘]
註意到slice()
的起止參數包括開始索引,不包括結束索引。
如果不給slice()
傳遞任何參數,它就會從頭到尾截取所有元素。利用這一點,我們可以很容易地復制一個Array
:
var arr = [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘]; var aCopy = arr.slice(); aCopy; // [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘] aCopy === arr; // false
push和pop
push()向Array
的末尾添加若幹元素,pop()
則把Array
的最後一個元素刪除掉:
var arr = [1, 2]; arr.push(‘A‘, ‘B‘); // 返回Array新的長度: 4 arr; // [1, 2, ‘A‘, ‘B‘] arr.pop(); // pop()返回‘B‘ arr; // [1, 2, ‘A‘] arr.pop(); arr.pop(); arr.pop(); // 連續pop 3次 arr; // [] arr.pop(); // 空數組繼續pop不會報錯,而是返回undefined arr; // []
unshift和shift
如果要往Array
的頭部添加若幹元素,使用unshift()
方法,shift()
方法則把Array
的第一個元素刪掉:
var arr = [1, 2]; arr.unshift(‘A‘, ‘B‘); // 返回Array新的長度: 4 arr; // [‘A‘, ‘B‘, 1, 2] arr.shift(); // ‘A‘ arr; // [‘B‘, 1, 2] arr.shift(); arr.shift(); arr.shift(); // 連續shift 3次 arr; // [] arr.shift(); // 空數組繼續shift不會報錯,而是返回undefined arr; // []
sort
sort()可以對當前Array
進行排序,它會直接修改當前Array
的元素位置,直接調用時,按照默認順序排序:
var arr = [‘B‘, ‘C‘, ‘A‘]; arr.sort(); arr; // [‘A‘, ‘B‘, ‘C‘]
對數字元素進行sort時,會出現未真實按照數字大小排序的情況:
arr=[1,5,2,100]; arr.sort(); console.log(arr) // 排序結果:[1, 100, 2, 5] //這是因為默認以字符的ASCII碼進行排序,首字符相同,則比較第2位。故並沒有按照數字的真實大小進行排序
解決方法:
arr=[1,5,2,100]; function intSort(a,b){ if (a>b){ return 1; } else if(a<b){ return -1; } else { return 0 } } arr.sort(intSort); console.log(arr) // 排序結果:[1, 2, 5, 100] //intSort函數也可寫為如下形式 //function intSort(a,b){ // return a-b; //}
reverse
reverse()把整個Array
的元素給反轉:
var arr = [‘one‘, ‘two‘, ‘three‘]; arr.reverse(); arr; // [‘three‘, ‘two‘, ‘one‘]
splice
splice()方法是修改Array
的“萬能方法”,它可以從指定的索引開始刪除若幹元素,然後再從該位置添加若幹元素:
var arr = [‘Microsoft‘, ‘Apple‘, ‘Yahoo‘, ‘AOL‘, ‘Excite‘, ‘Oracle‘]; // 從索引2開始刪除3個元素,然後再添加兩個元素: arr.splice(2, 3, ‘Google‘, ‘Facebook‘); // 返回刪除的元素 [‘Yahoo‘, ‘AOL‘, ‘Excite‘] arr; // [‘Microsoft‘, ‘Apple‘, ‘Google‘, ‘Facebook‘, ‘Oracle‘] // 只刪除,不添加: arr.splice(2, 2); // [‘Google‘, ‘Facebook‘] arr; // [‘Microsoft‘, ‘Apple‘, ‘Oracle‘] // 只添加,不刪除: arr.splice(2, 0, ‘Google‘, ‘Facebook‘); // 返回[],因為沒有刪除任何元素 arr; // [‘Microsoft‘, ‘Apple‘, ‘Google‘, ‘Facebook‘, ‘Oracle‘]
concat
concat()方法把當前的Array
和另一個Array
連接起來,並返回一個新的Array
:
var arr = [‘A‘, ‘B‘, ‘C‘]; var added = arr.concat([1, 2, 3]); added; // [‘A‘, ‘B‘, ‘C‘, 1, 2, 3] arr; // [‘A‘, ‘B‘, ‘C‘]
請註意,concat()
方法並沒有修改當前Array
,而是返回了一個新的Array
。
實際上,concat()
方法可以接收任意個元素和Array
,並且自動把Array
拆開,然後全部添加到新的Array
裏:
var arr = [‘A‘, ‘B‘, ‘C‘]; arr.concat(1, 2, [3, 4]); // [‘A‘, ‘B‘, ‘C‘, 1, 2, 3, 4]
join
join()方法是一個非常實用的方法,它把當前Array
的每個元素都用指定的字符串連接起來,然後返回連接後的字符串:
var arr = [‘A‘, ‘B‘, ‘C‘, 1, 2, 3]; arr.join(‘-‘); // ‘A-B-C-1-2-3‘
如果Array
的元素不是字符串,將自動轉換為字符串後再連接。
5. 對象(Object)
JavaScript的對象是一組由鍵-值組成的無序集合,例如:
var person = { name: ‘Bob‘, age: 20, tags: [‘js‘, ‘web‘, ‘mobile‘], city: ‘Beijing‘, hasCar: true, zipcode: null };
JavaScript對象的鍵都是字符串類型,值可以是任意數據類型。上述person
對象一共定義了6個鍵值對,其中每個鍵又稱為對象的屬性,例如,person
的name
屬性為‘Bob‘
,zipcode
屬性為null
。
要獲取一個對象的屬性,我們用對象變量.屬性名
的方式:
person.name; // ‘Bob‘ person.zipcode; // null
訪問屬性是通過.
操作符完成的,但這要求屬性名必須是一個有效的變量名。如果屬性名包含特殊字符,就必須用‘‘
括起來:
var xiaohong = { name: ‘小紅‘, ‘middle-school‘: ‘No.1 Middle School‘ };
xiaohong的屬性名middle-school
不是一個有效的變量,就需要用‘‘
括起來。訪問這個屬性也無法使用.
操作符,必須用[‘xxx‘]
來訪問:
xiaohong[‘middle-school‘]; // ‘No.1 Middle School‘ xiaohong[‘name‘]; // ‘小紅‘ xiaohong.name; // ‘小紅‘
也可以用xiaohong[‘name‘]
來訪問xiaohong
的name
屬性,不過xiaohong.name
的寫法更簡潔。我們在編寫JavaScript代碼的時候,屬性名盡量使用標準的變量名,這樣就可以直接通過object.prop
的形式訪問一個屬性了。
實際上JavaScript對象的所有屬性都是字符串,不過屬性對應的值可以是任意數據類型。
如果訪問一個不存在的屬性會返回什麽呢?JavaScript規定,訪問不存在的屬性不報錯,而是返回undefined
:
var xiaoming = { name: ‘小明‘ }; xiaoming.age; // undefined
由於JavaScript的對象是動態類型,你可以自由地給一個對象添加或刪除屬性:
var xiaoming = { name: ‘小明‘ }; xiaoming.age; // undefined xiaoming.age = 18; // 新增一個age屬性 xiaoming.age; // 18 delete xiaoming.age; // 刪除age屬性 xiaoming.age; // undefined delete xiaoming[‘name‘]; // 刪除name屬性 xiaoming.name; // undefined delete xiaoming.school; // 刪除一個不存在的school屬性也不會報錯
如果我們要檢測xiaoming
是否擁有某一屬性,可以用in
操作符:
var xiaoming = { name: ‘小明‘, birth: 1990, school: ‘No.1 Middle School‘, height: 1.70, weight: 65, score: null }; ‘name‘ in xiaoming; // true ‘grade‘ in xiaoming; // false
不過要小心,如果in
判斷一個屬性存在,這個屬性不一定是xiaoming
的,它可能是xiaoming
繼承得到的:
‘toString‘ in xiaoming; // true
因為toString
定義在object
對象中,而所有對象最終都會在原型鏈上指向object
,所以xiaoming
也擁有toString
屬性。
要判斷一個屬性是否是xiaoming
自身擁有的,而不是繼承得到的,可以用hasOwnProperty()
方法:
var xiaoming = { name: ‘小明‘ }; xiaoming.hasOwnProperty(‘name‘); // true xiaoming.hasOwnProperty(‘toString‘); // false
6. Null & Undefined類型
Undefined類型
Undefined 類型只有一個值,即 undefined。當聲明的變量未初始化時,該變量的默認值是 undefined。
當函數無明確返回值時,返回的也是值 "undefined";
Null類型
另一種只有一個值的類型是 Null,它只有一個專用值 null,即它的字面量。值 undefined 實際上是從值 null 派生來的,因此 ECMAScript 把它們定義為相等的。
盡管這兩個值相等,但它們的含義不同。undefined 是聲明了變量但未對其初始化時賦予該變量的值,null 則用於表示尚未存在的對象(在討論 typeof 運算符時,簡單地介紹過這一點)。如果函數或方法要返回的是對象,那麽找不到該對象時,返回的通常是 null。
參考資料:
1. http://www.w3cschool.cn/javascript/js-datatypes.html
2. http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434499190108eec0bdf14e704a09935cd112e501e31a000
3. http://www.cnblogs.com/yuanchenqi/articles/6893904.html
JavaScript數據類型