數(shù)據(jù)類型,變量

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
吗讶。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恋捆,隨后出現(xiàn)的幾起案子照皆,更是在濱河造成了極大的恐慌,老刑警劉巖沸停,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膜毁,死亡現(xiàn)場離奇詭異,居然都是意外死亡愤钾,警方通過查閱死者的電腦和手機瘟滨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來能颁,“玉大人杂瘸,你說我怎么就攤上這事』锞眨” “怎么了败玉?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長占业。 經常有香客問我绒怨,道長,這世上最難降的妖魔是什么谦疾? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任南蹂,我火速辦了婚禮,結果婚禮上念恍,老公的妹妹穿的比我還像新娘六剥。我一直安慰自己晚顷,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布疗疟。 她就那樣靜靜地躺著该默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪策彤。 梳的紋絲不亂的頭發(fā)上栓袖,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音店诗,去河邊找鬼裹刮。 笑死,一個胖子當著我的面吹牛庞瘸,可吹牛的內容都是我干的捧弃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼擦囊,長吁一口氣:“原來是場噩夢啊……” “哼违霞!你這毒婦竟也來了?” 一聲冷哼從身側響起瞬场,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤买鸽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贯被,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癞谒,經...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年刃榨,在試婚紗的時候發(fā)現(xiàn)自己被綠了弹砚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡枢希,死狀恐怖桌吃,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情苞轿,我是刑警寧澤茅诱,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站搬卒,受9級特大地震影響瑟俭,放射性物質發(fā)生泄漏。R本人自食惡果不足惜契邀,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一摆寄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦微饥、人聲如沸逗扒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矩肩。三九已至,卻和暖如春肃续,著一層夾襖步出監(jiān)牢的瞬間黍檩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工始锚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留建炫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓疼蛾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艺配。 傳聞我的和親對象是個殘疾皇子察郁,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容