JavaScript Memo (一)

簡介

JavaScript是一種運(yùn)行在瀏覽器中的解釋型的編程語言。

1995年,網(wǎng)景公司的Brendan Eich在兩周之內(nèi)設(shè)計(jì)出了JavaScript語言。

ECMAScript

因?yàn)榫W(wǎng)景開發(fā)了JavaScript,一年后微軟又模仿JavaScript開發(fā)了JScript,為了讓JavaScript成為全球標(biāo)準(zhǔn),幾個(gè)公司聯(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)的一種實(shí)現(xiàn)。

最新版ECMAScript 6標(biāo)準(zhǔn)(簡稱ES6)已經(jīng)在2015年6月正式發(fā)布了,所以,講到JavaScript的版本,實(shí)際上就是說它實(shí)現(xiàn)了ECMAScript標(biāo)準(zhǔn)的哪個(gè)版本。

基本語法

  • 語句以;結(jié)束
  • 語句塊用{...}
  • 以//開頭直到行末的字符被視為行注釋
  • 塊注釋是用/*...*/把多行字符包裹起來

數(shù)據(jù)類型

Number

JavaScript不區(qū)分整數(shù)和浮點(diǎn)數(shù),統(tǒng)一用Number表示,以下都是合法的Number類型

123; // 整數(shù)123
0.456; // 浮點(diǎn)數(shù)0.456
1.2345e3; // 科學(xué)計(jì)數(shù)法表示1.2345x1000,等同于1234.5
-99; // 負(fù)數(shù)
NaN; // NaN表示Not a Number,當(dāng)無法計(jì)算結(jié)果時(shí)用NaN表示
Infinity; // Infinity表示無限大,當(dāng)數(shù)值超過了JavaScript的Number所能表示的最大值時(shí),就表示為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####表示一個(gè)Unicode字符'\u4e2d\u6587'; // 完全等同于 '中文'

多行字符串,ES6新增用` ... `表示

`這是一個(gè)
多行
字符串`;

用+號連接字符串,ES6新增了一種模板字符串

var name = '小明';
var age = 20;
var message = '你好, ' + name + ', 你今年' + age + '歲了!';
alert(message);

ES6新模板字符串
var message = `你好, ${name}, 你今年${age}歲了!`;
alert(message);

獲取字符串某個(gè)指定位置的字符,使用類似Array的下標(biāo)操作,索引號從0開始

var s = 'Hello, world!';

s[0]; // 'H'
s[6]; // ' '
s[7]; // 'w'
s[12]; // '!'
s[13]; // undefined 超出范圍的索引不會(huì)報(bào)錯(cuò),但一律返回undefined

注意:字符串是不可變的,如果對字符串的某個(gè)索引賦值,不會(huì)有任何錯(cuò)誤,但是,也沒有任何效果

JavaScript為字符串提供了一些常用方法,調(diào)用這些方法本身不會(huì)改變原有字符串的內(nèi)容,而是返回一個(gè)新字符串

布爾值

一個(gè)布爾值只有true、false兩種值,要么是true,要么是false

true; // 這是一個(gè)true值
false; // 這是一個(gè)false值
2 > 1; // 這是一個(gè)true值
2 >= 3; // 這是一個(gè)false值

注意:JavaScript允許對任意數(shù)據(jù)類型做比較

要特別注意相等運(yùn)算符==。JavaScript在設(shè)計(jì)時(shí),有兩種比較運(yùn)算符:

第一種是==比較,它會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型再比較,很多時(shí)候,會(huì)得到非常詭異的結(jié)果;

第二種是===比較,它不會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型,如果數(shù)據(jù)類型不一致,返回false,如果一致,再比較。

由于JavaScript這個(gè)設(shè)計(jì)缺陷,不要使用==比較,始終堅(jiān)持使用===比較。

另一個(gè)例外是NaN這個(gè)特殊的Number與所有其他值都不相等,包括它自己NaN === NaN; // false

數(shù)組

JavaScript的數(shù)組可以包括任意數(shù)據(jù)類型

[1, 2, 3.14, 'Hello', null, true];
new Array(1, 2, 3);

注意,直接給Array的length賦一個(gè)新的值會(huì)導(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()來搜索一個(gè)指定的元素的位置
slice()截取Array的部分元素,然后返回一個(gè)新的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的最后一個(gè)元素刪除掉

unshift()方法往Array的頭部添加若干元素,shift()方法把Array的第一個(gè)元素刪掉

sort()對當(dāng)前Array進(jìn)行排序

reverse()把整個(gè)Array反轉(zhuǎn)

splice()方法修改Array,從指定的索引開始刪除若干元素,然后再從該位置添加若干元素

var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 從索引2開始刪除3個(gè)元素,然后再添加兩個(gè)元素:
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'); // 返回[],因?yàn)闆]有刪除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']

concat()方法把當(dāng)前的Array和另一個(gè)Array連接起來,并返回一個(gè)新的Array,它可以接收任意個(gè)元素和Array,并且自動(dòng)把Array拆開,然后全部添加到新的Array里
join()方法把當(dāng)前Array的每個(gè)元素都用指定的字符串連接起來,然后返回連接后的字符串

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的對象是動(dòng)態(tài)類型,你可以自由地給一個(gè)對象添加或刪除屬性

var xiaoming = {
    name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一個(gè)age屬性
xiaoming.age; // 18
delete xiaoming.age; // 刪除age屬性
xiaoming.age; // undefined
delete xiaoming['name']; // 刪除name屬性
xiaoming.name; // undefined
delete xiaoming.school; // 刪除一個(gè)不存在的school屬性也不會(huì)報(bào)錯(cuò)

如果要檢測對象是否擁有某一屬性,包括繼承得到的,可以用in操作符
要判斷一個(gè)屬性是否是自身擁有的,而不是繼承得到的,可以用hasOwnProperty()方法

var xiaoming = {
    name: '小明'
};
'name' in xiaoming; // true
'toString' in xiaoming; // true
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false

Map

JavaScript的對象有個(gè)問題,就是鍵必須是字符串。但實(shí)際上Number或者其他數(shù)據(jù)類型作為鍵也是合理的。為了解決這個(gè)問題,最新的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中自動(dòng)被過濾

通過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

變量

變量本身類型不固定的語言稱之為動(dòng)態(tài)語言,與之對應(yīng)的是靜態(tài)語言。靜態(tài)語言在定義變量時(shí)必須指定變量類型,如果賦值的時(shí)候類型不匹配,就會(huì)報(bào)錯(cuò)。

var a; // 申明了變量a,此時(shí)a的值為undefined
var $b = 1; // 申明了變量$b,同時(shí)給$b賦值,此時(shí)$b的值為1
var s_007 = '007'; // s_007是一個(gè)字符串
var Answer = true; // Answer是一個(gè)布爾值true
var t = null; // t的值是null

待續(xù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容