標識符命名規(guī)則
對于變量名,鍵值對中的鍵名應(yīng)滿足如下要求:
- 開頭必須是字母、下劃線(
_
)或美元符號($
) - 除了開頭以外的字符也可以是數(shù)字
- 不可以是關(guān)鍵字和保留字
- 最好不要和全局變量/函數(shù)同名扛门,會把原有變量/函數(shù)覆蓋的風險
這里亮元,關(guān)鍵字就是在 js 中有特殊意義的單詞,而保留字是為了以后使用預(yù)留的詞語炬太。但不要求背它們孔祸,隨著學習的深入隆敢,自然就都記住了。
常見的關(guān)鍵字有:
break崔慧、delete拂蝎、function、return惶室、typeof温自、case、do皇钞、if悼泌、switch、var夹界、catch馆里、else、in可柿、this鸠踪、void、continue复斥、false营密、instanceof、throw永票、while卵贱、debugger滥沫、finally侣集、new键俱、true、const世分、with编振、let、default臭埋、for踪央、null、try瓢阴、async 等等
常見的保留字有:
class畅蹂、enum、export荣恐、extends液斜、import 、super等等
本文可能會直接用到的有:
- var: 定義一個變量
- console.log(): 在瀏覽器控制臺或后臺終端輸出一個值
- alert(): 在瀏覽器彈窗輸出一個值
基本數(shù)據(jù)類型
Javascript 基本類型包括:數(shù)值叠穆,字符串少漆,null,undefined 和布爾型硼被。還有 ES6 中的 Symbol 類型示损,這篇博客暫時先不提 Symbol 類型。
比如:
var num = 1; //數(shù)值型
var str = 'hello world; //字符串嚷硫,雙引號也可以
var flag = true; //布爾型检访,取值 true 或 false
var obj = null; //空類型
var it = undefined; //undefined
這里簡單解釋一下需要注意問題:
- 數(shù)值類型是不區(qū)分整型與浮點型的;
- 數(shù)值類型默認都是以 double 浮點數(shù)形式儲存的仔掸;
- 數(shù)值類型范圍在 5e-324 至1.7976931348623157e+308烛谊,即 `Number.MIN_VALUE 至 Number.MAX_VALUE;
- js 沒有字符類型嘉汰,只有字符串類型丹禀;
- null 表示正常的、意料之中的空值鞋怀,而 undefined 表示以外的空值双泪。對于只聲明未賦值的變量,默認值為 undefined密似;
- 數(shù)值類型有幾個特殊值:
- Infinity: 正無窮
- -Infinity:負無窮
- NaN:非法數(shù)值(Not a Number)焙矛,但他還是個數(shù)值(好矛盾)
復(fù)雜數(shù)據(jù)類型
基本數(shù)據(jù)類型對應(yīng)的對象
js 中其實除了基本類型以外其他類型的本質(zhì)都是對象,就算是基本類型變量残腌,除了 undefined 和 null 以外村斟,都有其對應(yīng)的對象類型贫导。如下:
var num = new Number(2);
var str = new String('hello');
var flag = new Boolean(true);
這里一定要清楚,其對象類型和基本類型不是一個東西蟆盹,具體的看完類型轉(zhuǎn)換就一切都清楚了孩灯。
js中其他常見的對象
當然,下面繼續(xù)說對象逾滥,js 常用的對象有:Array峰档,Object,Date寨昙,RegExp等等讥巡。定義方法如下:
var arr = new Array(); //得到一個空數(shù)組
var arr2 = new Array(5); //得到一個長度為5的數(shù)組,初值為undefined
var arr3 = new Array('b','a','c'); //得到一個長為3舔哪,對應(yīng)值為'b','a','c' 的數(shù)組
var obj = new Object(); //得到一個空對象
var now = new Date(); //得到當前時間
var reg = RegExp('^[A-Za-z][\w\d]*$'); //得到一個正則表達式
對于數(shù)組欢顷、正則表達式和對象還有一種字面量的定義方法,這個方法和上面是完全等價的:
var arr = []; //得到一個空數(shù)組
var arr3 = ['b','a','c']; //得到一個長為3捉蚤,對應(yīng)值為'b','a','c' 的數(shù)組
var obj = {}; //得到一個空對象
var reg = /^[A-Za-z][\w\d]*$/; //得到一個正則表達式
數(shù)組和對象的訪問
這個部分直接舉例子:
- 數(shù)組:一些數(shù)據(jù)的集合抬驴,這里不要求數(shù)據(jù)必須是同樣類型的
var arr = [1, 2, 3, 'a']; //定義一個數(shù)組
arr[0]; //1 訪問數(shù)組的第1個元素,注意索引從0開始
arr[1]; //2 訪問數(shù)組的第2個元素
arr[3]; //'a' 訪問數(shù)組的第4個元素
arr[-1], arr[4], arr[1.3]; //undefined 訪問數(shù)組越界或索引不正確都返回 undefined
- 對象: 鍵值對的集合外里,鍵值對之間由逗號分開怎爵,鍵和值由冒號分開
var obj = {
name: 'Bob',
age: 18,
gender: 'M'
};
obj.name; //'Bob' 獲取 obj 對象的姓名
obj.age; //18 獲取 obj 對象的年齡
obj.gender; //'M' 獲取 obj 對象的性別
注意當鍵名中有符號也需要加引號。
其余的對象會在以后用到的時候再仔細講
基本運算和運算符
運算符就像我們數(shù)學中的加減乘除盅蝗,也像數(shù)學中的計算規(guī)定的先后順序鳖链,這里我直接給出所以運算符的運算順序和實例,必要的解釋在表格后面墩莫,沒有解釋到的屬于比較深奧的運算符芙委,記住它的順序即可,功能后續(xù)再理解狂秦。
優(yōu)先級 | 運算符 | 結(jié)合性 | 舉例 | 說明 | |||
---|---|---|---|---|---|---|---|
20 | 圓括號 | n/a | (…) | - | |||
19 | 成員訪問 | 從左到右 | obj.name | - | |||
19 | 需計算的成員訪問 | 從左到右 | obj["name"] | - | |||
19 | new(帶參數(shù)列表) | n/a | new Person() | - | |||
18 | 函數(shù)調(diào)用 | 從左到右 | fun(args) | - | |||
18 | new(無參數(shù)列表) | 從右到左 | new fun | - | |||
17 | 后置遞增 | n/a | a++ | 相當于 a = a + 1; | |||
17 | 后置遞減 | n/a | a-- | 相當于 a = a - 1; | |||
16 | 邏輯非 | 從右到左 | !a | - | |||
16 | 按位非 | 從右到左 | ~a | - | |||
16 | 一元加法 | 從右到左 | +a | - | |||
16 | 一元減法 | 從右到左 | -a | - | |||
16 | 前置遞增 | 從右到左 | ++a | - | |||
16 | 前置遞減 | 從右到左 | --a | - | |||
16 | typeof | 從右到左 | typeof 4 | 得到值的類型 'number' | |||
16 | void | 從右到左 | void(0) | 執(zhí)行表達式并返回 undefined | |||
16 | delete | 從右到左 | deleteobj.age | 刪除對象屬性 | |||
15 | 冪 | 從右到左 | 2**4 | 得 16 | |||
14 | 乘法 | 從左到右 | 2*3 | 得 6 | |||
14 | 除法 | 從左到右 | 4/2 | 得 2 | |||
14 | 取模(求余) | 從左到右 | 4%3 | 得 1 | |||
13 | 加法 | 從左到右 | 1+3 | 得 4 | |||
13 | 減法 | 從左到右 | 2-3 | 得 -1 | |||
12 | 按位左移 | 從左到右 | 32<<5 | 得 1024 | |||
12 | 按位右移 | 從左到右 | 32>>2 | 得 -8 | |||
12 | 無符號右移 | 從左到右 | -32>>>2 | 得 1073741816 | |||
11 | 小于 | 從左到右 | -1 < 2 | 得 true | |||
11 | 小于等于 | 從左到右 | -1 <= 2 | 得 true | |||
11 | 大于等于 | 從左到右 | -1 >= 2 | 得 false | |||
11 | 大于 | 從左到右 | -1 > 2 | 得 false | |||
11 | in | 從左到右 | "name" in obj | - | |||
11 | instanceof | 從左到右 | li instanceof HTMLElement | - | |||
10 | 等號 | 從左到右 | 5 == '5' | 得 true | |||
10 | 非等號 | 從左到右 | 5 != '5' | 得 false | |||
10 | 全等號 | 從左到右 | 5 === '5' | 得 false | |||
10 | 非全等號 | 從左到右 | 5 !== '5' | 得 true | |||
9 | 按位與 | 從左到右 | 10 & 40 | 得 8 | |||
8 | 按位異或 | 從左到右 | 10 ^ 40 | 得 34 | |||
7 | 按位或 | 從左到右 | 10 | 40 | 得 42 | ||
6 | 邏輯與 | 從左到右 | 0 && 3 | 得 0灌侣,不得 false | |||
5 | 邏輯或 | 從左到右 | 0 | 3 | 得 3,不得 true | ||
4 | ?: | 從右到左 | 8 !=0 ? 1 : 3 | 得 1 | |||
3 | 賦值 | 從右到左 | a = 2 | - | |||
3 | += | 從右到左 | a += 2 | 相當于 a = a + 2 | |||
3 | -= | 從右到左 | a -= 2 | 相當于 a = a - 2 | |||
3 | *= | 從右到左 | a *= 2 | 相當于 a = a * 2 | |||
3 | /= | 從右到左 | a /= 2 | 相當于 a = a / 2 | |||
3 | &= | 從右到左 | a &= 2 | 相當于 a = a & 2 | |||
3 | = | 從右到左 | a | = 2 | 相當于 a = a | 2 | |
3 | ^= | 從右到左 | a ^= 2 | 相當于 a = a ^ 2 | |||
3 | %= | 從右到左 | a %= 2 | 相當于 a = a % 2 | |||
3 | <<= | 從右到左 | a <<= 2 | 相當于 a = a << 2 | |||
3 | >>= | 從右到左 | a >>= 2 | 相當于 a = a >> 2 | |||
3 | >>>= | 從右到左 | a >>>= 2 | 相當于 a = a >>> 2 | |||
2 | yield | 從右到左 | yield returnValue; | - | |||
2 | yield* | 從右到左 | yield* returnValue; | - | |||
1 | 展開運算符 | n/a | arr1.push(...arr2) | - | |||
0 | 逗號 | 從左到右 | a=1,b=2 | 返回最后一個表達式的值 2 |
需要說明的是:
- 優(yōu)先級越高的優(yōu)先計算裂问,同優(yōu)先級的從左到右依次計算侧啼;
- a++ 與 ++a 的區(qū)別: 前者先返回值后自加,后者先自加再返回值(a-- 與 --a 同理)堪簿;
- 涉及到位運算的部分不是十分重要痊乾,但以后的文章會細談;
- == 和 === 的區(qū)別椭更,前者比較是發(fā)生自動類型轉(zhuǎn)換哪审,后者不發(fā)生自動類型轉(zhuǎn)換(!= 與 !== 同理);
- 對于
exp ? val1 : val2;
如果 exp 的結(jié)果為 true虑瀑,整個表達式得 val1, 否則得 val2;