簡介
JavaScript是一種運(yùn)行在瀏覽器中的解釋型的編程語言。
1995年力喷,網(wǎng)景公司的Brendan Eich在兩周之內(nèi)設(shè)計出了JavaScript語言横媚。
ECMAScript
因為網(wǎng)景開發(fā)了JavaScript,一年后微軟又模仿JavaScript開發(fā)了JScript嘉裤,為了讓JavaScript成為全球標(biāo)準(zhǔn)廊驼,幾個公司聯(lián)合ECMA(European Computer Manufacturers Association)組織定制了JavaScript語言的標(biāo)準(zhǔn)据过,被稱為ECMAScript標(biāo)準(zhǔn)。
ECMAScript是一種語言標(biāo)準(zhǔn)妒挎,而JavaScript是網(wǎng)景公司對ECMAScript標(biāo)準(zhǔn)的一種實現(xiàn)蝶俱。
最新版ECMAScript 6標(biāo)準(zhǔn)(簡稱ES6)已經(jīng)在2015年6月正式發(fā)布了,所以饥漫,講到JavaScript的版本榨呆,實際上就是說它實現(xiàn)了ECMAScript標(biāo)準(zhǔn)的哪個版本。
基本語法
- 語句以;結(jié)束
- 語句塊用{...}
- 以//開頭直到行末的字符被視為行注釋
- 塊注釋是用/*...*/把多行字符包裹起來
數(shù)據(jù)類型
Number
JavaScript不區(qū)分整數(shù)和浮點數(shù)庸队,統(tǒng)一用Number表示积蜻,以下都是合法的Number類型
123; // 整數(shù)123
0.456; // 浮點數(shù)0.456
1.2345e3; // 科學(xué)計數(shù)法表示1.2345x1000,等同于1234.5
-99; // 負(fù)數(shù)
NaN; // NaN表示Not a Number彻消,當(dāng)無法計算結(jié)果時用NaN表示
Infinity; // Infinity表示無限大竿拆,當(dāng)數(shù)值超過了JavaScript的Number所能表示的最大值時,就表示為Infinity
Number四則運(yùn)算
1 + 2; // 3
(1 + 2) * 5 / 2; // 7.5
2 / 0; // Infinity
0 / 0; // NaN
10 % 3; // 1
10.5 % 3; // 1.5
字符串
字符串是以單引號'或雙引號"括起來的任意文本宾尚,比如'abc'丙笋,"xyz"等等谢澈。
轉(zhuǎn)義字符\可以轉(zhuǎn)義很多字符,\n表示換行御板,\t表示制表符锥忿,字符\本身也要轉(zhuǎn)義,\\表示的字符就是\
ASCII字符可以以\x##形式的十六進(jìn)制表示
'\x41'; // 完全等同于 'A'
用\u####表示一個Unicode字符
'\u4e2d\u6587'; // 完全等同于 '中文'
多行字符串怠肋,ES6新增用` ... `表示
`這是一個
多行
字符串`;
用+號連接字符串,ES6新增了一種模板字符串
var name = '小明';
var age = 20;
var message = '你好, ' + name + ', 你今年' + age + '歲了!';
alert(message);
ES6新模板字符串
var message = `你好, ${name}, 你今年${age}歲了!`;
alert(message);
獲取字符串某個指定位置的字符敬鬓,使用類似Array的下標(biāo)操作,索引號從0開始
var s = 'Hello, world!';
s[0]; // 'H'
s[6]; // ' '
s[7]; // 'w'
s[12]; // '!'
s[13]; // undefined 超出范圍的索引不會報錯笙各,但一律返回undefined
注意:字符串是不可變的钉答,如果對字符串的某個索引賦值,不會有任何錯誤杈抢,但是数尿,也沒有任何效果
JavaScript為字符串提供了一些常用方法,調(diào)用這些方法本身不會改變原有字符串的內(nèi)容惶楼,而是返回一個新字符串
布爾值
一個布爾值只有true右蹦、false兩種值,要么是true鲫懒,要么是false
true; // 這是一個true值
false; // 這是一個false值
2 > 1; // 這是一個true值
2 >= 3; // 這是一個false值
注意:JavaScript允許對任意數(shù)據(jù)類型做比較
要特別注意相等運(yùn)算符==嫩实。JavaScript在設(shè)計時刽辙,有兩種比較運(yùn)算符:
第一種是==比較窥岩,它會自動轉(zhuǎn)換數(shù)據(jù)類型再比較,很多時候宰缤,會得到非常詭異的結(jié)果颂翼;
第二種是===比較,它不會自動轉(zhuǎn)換數(shù)據(jù)類型慨灭,如果數(shù)據(jù)類型不一致朦乏,返回false,如果一致氧骤,再比較呻疹。
由于JavaScript這個設(shè)計缺陷,不要使用==比較筹陵,始終堅持使用===比較刽锤。
另一個例外是NaN這個特殊的Number與所有其他值都不相等,包括它自己NaN === NaN; // false
數(shù)組
JavaScript的數(shù)組可以包括任意數(shù)據(jù)類型
[1, 2, 3.14, 'Hello', null, true];
new Array(1, 2, 3);
注意朦佩,直接給Array的length賦一個新的值會導(dǎo)致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通過indexOf()來搜索一個指定的元素的位置
slice()截取Array的部分元素并思,然后返回一個新的Array
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0, 3); // 從索引0開始,到索引3結(jié)束语稠,但不包括索引3: ['A', 'B', 'C']
arr.slice(3); // 從索引3開始到結(jié)束: ['D', 'E', 'F', 'G']
push()向Array的末尾添加若干元素宋彼,pop()則把Array的最后一個元素刪除掉
unshift()方法往Array的頭部添加若干元素弄砍,shift()方法把Array的第一個元素刪掉
sort()對當(dāng)前Array進(jìn)行排序
reverse()把整個Array反轉(zhuǎn)
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()方法把當(dāng)前的Array和另一個Array連接起來音婶,并返回一個新的Array,它可以接收任意個元素和Array占贫,并且自動把Array拆開桃熄,然后全部添加到新的Array里
join()方法把當(dāng)前Array的每個元素都用指定的字符串連接起來,然后返回連接后的字符串
var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'
對象
JavaScript的對象是一組由鍵-值組成的無序集合,鍵都是字符串類型型奥,值可以是任意數(shù)據(jù)類型瞳收。
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
JavaScript的對象是動態(tài)類型,你可以自由地給一個對象添加或刪除屬性
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屬性也不會報錯
如果要檢測對象是否擁有某一屬性厢汹,包括繼承得到的螟深,可以用in操作符
要判斷一個屬性是否是自身擁有的,而不是繼承得到的烫葬,可以用hasOwnProperty()方法
var xiaoming = {
name: '小明'
};
'name' in xiaoming; // true
'toString' in xiaoming; // true
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
Map
JavaScript的對象有個問題界弧,就是鍵必須是字符串。但實際上Number或者其他數(shù)據(jù)類型作為鍵也是合理的搭综。為了解決這個問題垢箕,最新的ES6規(guī)范引入了新的數(shù)據(jù)類型Map。
Map是一組鍵值對的結(jié)構(gòu)兑巾,具有極快的查找速度条获。
var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 刪除key 'Adam'
m.get('Adam'); // undefined
Set
Set也是一組key的集合,但不存儲value蒋歌。由于key不能重復(fù)帅掘,所以,在Set中堂油,沒有重復(fù)的key修档。
重復(fù)元素在Set中自動被過濾
通過add(key)方法添加元素到Set中
通過delete(key)方法刪除元素
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}
s.add(4);// 添加元素4
s.delete(3);// 添加元素3
變量
變量本身類型不固定的語言稱之為動態(tài)語言,與之對應(yīng)的是靜態(tài)語言府框。靜態(tài)語言在定義變量時必須指定變量類型吱窝,如果賦值的時候類型不匹配,就會報錯迫靖。
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
待續(xù)...