Number
JavaScript
不區(qū)分整數(shù)和浮點數(shù)武契,統(tǒng)一用Number
表示募判,以下都是合法的Number
類型:
123; // 整數(shù)123
0.456; // 浮點數(shù)0.456
1.2345e3; // 科學計數(shù)法表示1.2345x1000,等同于1234.5
-99; // 負數(shù)
NaN; // NaN表示Not a Number咒唆,當無法計算結果時用NaN表示
Infinity; // Infinity表示無限大届垫,當數(shù)值超過了JavaScript的Number所能表示的最大值時,就表示為Infinity
Number可以直接做四則運算全释,規(guī)則和數(shù)學一致:
1 + 2; // 3
(1 + 2) * 5 / 2; // 7.5
2 / 0; // Infinity
0 / 0; // NaN
10 % 3; // 1
10.5 % 3; // 1.5
要特別注意相等運算符==装处。JavaScript在設計時,有兩種比較運算符:
第一種是==比較浸船,它會自動轉換數(shù)據(jù)類型再比較妄迁,很多時候,會得到非常詭異的結果李命;
第二種是===比較登淘,它不會自動轉換數(shù)據(jù)類型,如果數(shù)據(jù)類型不一致封字,返回false黔州,如果一致,再比較阔籽。
由于JavaScript這個設計缺陷流妻,不要使用==比較,始終堅持使用===比較笆制。
另一個例外是NaN這個特殊的Number與所有其他值都不相等绅这,包括它自己:
NaN === NaN; // false
唯一能判斷NaN的方法是通過isNaN()函數(shù):
isNaN(NaN); // true
最后要注意浮點數(shù)的相等比較:
1 / 3 === (1 - 2 / 3); // false
這不是JavaScript的設計缺陷。浮點數(shù)在運算過程中會產生誤差项贺,因為計算機無法精確表示無限循環(huán)小數(shù)君躺。要比較兩個浮點數(shù)是否相等,只能計算它們之差的絕對值开缎,看是否小于某個閾值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null和undefined
null表示一個“空”的值棕叫,它和0以及空字符串''不同,0是一個數(shù)值奕删,''表示長度為0的字符串俺泣,而null表示“空”。
在其他語言中完残,也有類似JavaScript的null的表示伏钠,例如Java也用null,Swift用nil谨设,Python用None表示熟掂。但是,在JavaScript中扎拣,還有一個和null類似的undefined赴肚,它表示“未定義”。
JavaScript的設計者希望用null表示一個空的值二蓝,而undefined表示值未定義誉券。事實證明,這并沒有什么卵用刊愚,區(qū)分兩者的意義不大踊跟。大多數(shù)情況下,我們都應該用null鸥诽。undefined僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用商玫。
數(shù)組
數(shù)組是一組按順序排列的集合,集合的每個值稱為元素衙传。JavaScript的數(shù)組可以包括任意數(shù)據(jù)類型决帖。例如:
[1, 2, 3.14, 'Hello', null, true];
上述數(shù)組包含6個元素。數(shù)組用[]表示蓖捶,元素之間用,分隔地回。
另一種創(chuàng)建數(shù)組的方法是通過Array()函數(shù)實現(xiàn):
new Array(1, 2, 3); // 創(chuàng)建了數(shù)組[1, 2, 3]
然而,出于代碼的可讀性考慮俊鱼,強烈建議直接使用[]刻像。
對象
要獲取一個對象的屬性,我們用對象變量.屬性名的方式:
person.name; // 'Bob'
person.zipcode; // null
變量
申明一個變量用var語句并闲,比如:
var a; // 申明了變量a细睡,此時a的值為undefined
var $b = 1; // 申明了變量$b,同時給$b賦值帝火,此時$b的值為1
var s_007 = '007'; // s_007是一個字符串
var Answer = true; // Answer是一個布爾值true
var t = null; // t的值是null
字符串常見操作
操作字符串
字符串常見的操作如下:
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()
把一個字符串全部變?yōu)榇髮懀?br>
var s = 'Hello';s.toUpperCase(); // 返回'HELLO'
toLowerCase
toLowerCase()
把一個字符串全部變?yōu)樾懀?br>
var s = 'Hello';var lower = s.toLowerCase(); // 返回'hello'并賦值給變量lowerlower; // 'hello'
indexOf
indexOf()
會搜索指定字符串出現(xiàn)的位置:
var s = 'hello, world';s.indexOf('world'); // 返回7s.indexOf('World'); // 沒有找到指定的子串,返回-1
substring
substring()
返回指定索引區(qū)間的子串:
var s = 'hello, world's.substring(0, 5); // 從索引0開始到5(不包括5)沟优,返回'hello's.substring(7); // 從索引7開始到結束涕滋,返回'world'
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
注意了何吝,數(shù)字30和字符串'30'是不同的元素。
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()
的起止參數(shù)包括開始索引黔酥,不包括結束索引。
如果不給slice()
傳遞任何參數(shù)洪橘,它就會從頭到尾截取所有元素跪者。利用這一點,我們可以很容易地復制一個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新的長度: 4arr; // [1, 2, 'A', 'B']arr.pop(); // pop()返回'B'arr; // [1, 2, 'A']arr.pop(); arr.pop(); arr.pop(); // 連續(xù)pop 3次arr; // []arr.pop(); // 空數(shù)組繼續(xù)pop不會報錯渣玲,而是返回undefinedarr; // []
unshift和shift
如果要往Array
的頭部添加若干元素,使用unshift()
方法弟晚,shift()
方法則把Array
的第一個元素刪掉:
var arr = [1, 2];
arr.unshift('A', 'B'); // 返回Array新的長度: 4arr; // ['A', 'B', 1, 2]arr.shift(); // 'A'arr; // ['B', 1, 2]arr.shift(); arr.shift(); arr.shift(); // 連續(xù)shift 3次arr; // []arr.shift(); // 空數(shù)組繼續(xù)shift不會報錯忘衍,而是返回undefinedarr; // []
sort
sort()
可以對當前Array
進行排序,它會直接修改當前Array
的元素位置卿城,直接調用時枚钓,按照默認順序排序:
var arr = ['B', 'C', 'A'];
arr.sort();
arr; // ['A', 'B', 'C']
能否按照我們自己指定的順序排序呢?完全可以瑟押,我們將在后面的函數(shù)中講到搀捷。
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
的元素不是字符串,將自動轉換為字符串后再連接木西。
多維數(shù)組
如果數(shù)組的某個元素又是一個Array
畴栖,則可以形成多維數(shù)組,例如:
var arr = [[1, 2, 3], [400, 500, 600], '-'];
上述Array
包含3個元素八千,其中頭兩個元素本身也是Array
吗讶。