數(shù)據(jù)類型和變量
數(shù)據(jù)類型
Number
123(正常數(shù)字)随闺、NaN(不是數(shù)字)、Infinity(無限大)
16進(jìn)制表示:0xff19
比較運算符
==
會自動轉(zhuǎn)換數(shù)據(jù)類型再比較兔综,會得到非常詭異的結(jié)果氓奈。
===
不會轉(zhuǎn)換類型了袁。先判斷數(shù)據(jù)類型是否一致坦仍,一致的話再比較具體值。
特殊:
-
NaN===NaN;//false
唯一判斷NaN的方法是通過isNaN()
isNaN(NaN);//true
- 浮點數(shù)由于精度的問題得糜,比較不會相等敬扛。
1/3===(1-2/3);//false
應(yīng)該用:Math.abs(1/3-(1-2/3))<0.000001;//true
null和undefined
null表示空值。0是一個數(shù)字朝抖。''是一個空字符串啥箭。
JavaScript的設(shè)計者希望用null表示一個空的值,而undefined表示值未定義治宣。事實證明急侥,這并沒有什么卵用,區(qū)分兩者的意義不大侮邀。大多數(shù)情況下坏怪,我們都應(yīng)該用null。undefined僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用瑟捣。
數(shù)組
創(chuàng)建方法:
[1,2,'abc']
new Array(1,2,3)
從可讀性考慮近迁,建議使用第一種方法來創(chuàng)建數(shù)組翎冲。
數(shù)組元素通過索引來訪問:
var arr = [1,2,3];
console.log(arr[0]);
對象
JavaScript的對象是一組由鍵-值組成的無序集合。
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
變量
strict模式
JavaScript在設(shè)計之初鹏秋,為了方便初學(xué)者學(xué)習(xí),并不強制要求用var申明變量亡笑。這個設(shè)計錯誤帶來了嚴(yán)重的后果:如果一個變量沒有通過var申明就被使用侣夷,那么該變量就自動被申明為全局變量。
在同一個頁面的不同的JavaScript文件中况芒,如果都不用var申明惜纸,恰好都使用了變量i叶撒,將造成變量i互相影響,產(chǎn)生難以調(diào)試的錯誤結(jié)果耐版。
使用var申明的變量則不是全局變量祠够,它的范圍被限制在該變量被申明的函數(shù)體內(nèi)。
在strict模式下運行的JavaScript代碼粪牲,強制通過var申明變量古瓤,未使用var申明變量就使用的,將導(dǎo)致運行錯誤腺阳。
啟用strict模式的方法是在JavaScript代碼的第一行寫上:
'use strict';
字符串
轉(zhuǎn)義:
\n
:換行
\\:\(兩個反斜杠轉(zhuǎn)義成一個斜杠)
ASCII字符可以用\x##
形式的十六進(jìn)制表示:
\x41
:A
\u####
表示一個Unicode字符:
\u4e2d\u6587
:中文
es6新增換行字符串的表示:
var str = `你好
我是
一棵樹`;
代碼 | 含義 |
---|---|
s.length |
長度 |
s[2] |
區(qū)字符串某個字符落君,類似數(shù)組。索引越界不會報錯亭引,返回undefined |
注意:字符串是不可變的绎速,如果對字符串的某個索引賦值,不會有任何錯誤焙蚓,但是纹冤,也沒有任何效果。
var s = 'Test';
s[0] = 'X';
alert(s); // s仍然為'Test'
代碼(調(diào)用這些方法不會改變原來的字符串购公,而是返回一個新字符串) | 含義 |
---|---|
s.toUpperCase |
大寫 |
s.toLowerCase |
小寫 |
'hello,world'.indexOf('world') |
返回7(注意區(qū)分大小寫) |
s.substring(0,10) |
返回字串萌京,注意前包后不包。沒有第二個參數(shù)代表到最后 |
數(shù)組
arr.length
來獲取數(shù)組長度
注意:
- 直接給Array的length賦值會改變Array的大小宏浩。
var arr = [1, 2, 3];
arr.length; // 3
arr.length = 6;
arr; // arr變?yōu)閇1, 2, 3, undefined, undefined, undefined]
arr.length = 2;arr; // arr變?yōu)閇1, 2]
- 如果通過索引賦值時知残,索引超過了范圍,同樣會引起Array
大小的變化
var arr = [1, 2, 3];
arr[5] = 'x';
arr; // arr變?yōu)閇1, 2, 3, undefined, undefined, 'x']
方法 | 含義 |
---|---|
arr.indexOf(10); |
ie8不兼容該方法比庄,可以使用$.inArray(value,array) 代替求妹。注意10和'10'不是一回事。 |
arr.slice(2,4) |
對應(yīng)str.substring印蔗。如果沒有參數(shù)相當(dāng)于復(fù)制整個數(shù)組扒最。var copy = arr.slice()
|
arr.push(1,2) |
向數(shù)組中添加,返回數(shù)組新長度 |
arr.pop() |
返回并刪除數(shù)組最后一個元素华嘹“扇ぃ空數(shù)組不會報錯,而是返回undefined |
arr.unshift(1,2) |
類似push耙厚,從數(shù)組開頭添加 |
arr.shift() |
返回并刪除數(shù)組第一個元素 |
arr.sort() |
對數(shù)組進(jìn)行排序 |
arr.reverse() |
對數(shù)組進(jìn)行反轉(zhuǎn) |
splice |
從指定索引刪除n個元素强挫,然后再插入幾個元素 |
arr1.concat(arr2); |
將兩個數(shù)組進(jìn)行拼接并返回新數(shù)組(并沒有修改當(dāng)前數(shù)組) |
arr.join('-') |
將數(shù)組的每一個元素用指定字符串連接,然后返回字符串薛躬。 |
`` | |
`` | |
`` | |
`` | |
`` |
splice
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']
join
var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'
對象
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
訪問屬性是通過.操作符完成的俯渤,但這要求屬性名必須是一個有效的變量名。如果屬性名包含特殊字符型宝,就必須用''括起來:
var xiaohong = {
name: '小紅',
'middle-school': 'No.1 Middle School'
};
xiaohong['middle-school'];
xiaohong.name;
代碼 | 含義 |
---|---|
xiaohong.sex='男'; |
給對象添加屬性 |
delete xiaohong.sex; |
刪除對象的屬性 |
'name' in xiaohong |
判斷某個對象是否擁有某個屬性(這個屬性有可能是繼承來的)八匠。 |
xiaohong.hasOwnProperty('name') |
判斷對象自身是否擁有某個屬性 |
條件判斷
if-else
注意:JavaScript把null絮爷、undefined、0梨树、NaN坑夯、''
都視為false。
循環(huán)
for(;;)
for...in
(可以把一個對象的所有屬性依次循環(huán)出來)
for...of
(for in和for of的差別就是抡四,for in操作數(shù)組柜蜈、字符串等取出來的是索引key,for of操作數(shù)組指巡、字符串等取出來的是值value)
var o = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for (var key in o) {
if (o.hasOwnProperty(key)) {//過濾掉繼承過來的屬性
alert(key); // 'name', 'age', 'city'
}
}
由于Array也是對象淑履,而它的每個元素的索引被視為對象的屬性,因此藻雪,for ... in循環(huán)可以直接循環(huán)出Array的索引(這里得出來的索引是String而不是Number):
var a = ['A', 'B', 'C'];
for (var i in a) {
alert(i); // '0', '1', '2'
alert(a[i]); // 'A', 'B', 'C'
}
while
do...while
Map和Set
JavaScript的默認(rèn)對象表示方式{}可以視為其他語言中的Map或Dictionary的數(shù)據(jù)結(jié)構(gòu)秘噪,即一組鍵值對。
但是JavaScript的對象有個小問題阔涉,就是鍵必須是字符串缆娃。但實際上Number或者其他數(shù)據(jù)類型作為鍵也是非常合理的。
為了解決這個問題瑰排,最新的ES6規(guī)范引入了新的數(shù)據(jù)類型Map。
'use strict';
var m = new Map();
var s = new Set();
alert('你的瀏覽器支持Map和Set暖侨!');
iterable
遍歷Array可以采用下標(biāo)循環(huán)椭住,遍歷Map和Set就無法使用下標(biāo)。為了統(tǒng)一集合類型字逗,ES6標(biāo)準(zhǔn)引入了新的iterable類型京郑,Array、Map和Set都屬于iterable類型葫掉。
具有iterable類型的集合可以通過新的for ... of循環(huán)來遍歷些举。
'use strict';
var a = [1, 2, 3];
for (var x of a) {
}
alert('你的瀏覽器支持for ... of');