1、什么是JavaScript?
JavaScript一種直譯式腳本語(yǔ)言,是一種動(dòng)態(tài)類型、弱類型、基于原型的語(yǔ)言,內(nèi)置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語(yǔ)言,最早是在HTML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用)網(wǎng)頁(yè)上使用,用來(lái)給HTML網(wǎng)頁(yè)增加動(dòng)態(tài)功能。
在1995年時(shí),由Netscape公司的Brendan Eich,在網(wǎng)景導(dǎo)航者瀏覽器上首次設(shè)計(jì)實(shí)現(xiàn)而成。因?yàn)?a target="_blank" rel="nofollow">Netscape與Sun合作,Netscape管理層希望它外觀看起來(lái)像Java,因此取名為JavaScript。但實(shí)際上它的語(yǔ)法風(fēng)格與Self及Scheme較為接近。
為了取得技術(shù)優(yōu)勢(shì),微軟推出了JScript,CEnvi推出ScriptEase,與JavaScript同樣可在瀏覽器上運(yùn)行。為了統(tǒng)一規(guī)格,因?yàn)镴avaScript兼容于ECMA標(biāo)準(zhǔn),因此也稱為ECMAScript。
以上摘自百度百科,從這段論述我們可以看出JavaScript:
- 直譯式腳本語(yǔ)言、動(dòng)態(tài)類型、弱類型、基于原型的語(yǔ)言;
- 解釋器為JavaScript引擎(瀏覽器的一部分);
- 廣泛應(yīng)用于客戶端,最早用于給HTML網(wǎng)頁(yè)增加動(dòng)態(tài)功能;
- 誕生于1995年,在網(wǎng)景導(dǎo)航者瀏覽器上設(shè)計(jì)實(shí)現(xiàn);
- 與java沒(méi)有關(guān)系,兼容ECMA標(biāo)準(zhǔn),也被稱為ECMAScript。
2、JavaScript的基本構(gòu)成
英語(yǔ)語(yǔ)法是針對(duì)英語(yǔ)語(yǔ)言進(jìn)行研究后,系統(tǒng)地總結(jié)歸納出來(lái)的一系列語(yǔ)言規(guī)則。語(yǔ)法是組詞造句的規(guī)則,是把合適的詞放進(jìn)合適位置的語(yǔ)言(句子)規(guī)則,語(yǔ)法可以分成為兩大部分:分別為詞法和句法。詞法包括各類詞的形態(tài)及其變化,句法主要講句子的種類和類型,句子成分以及遣詞造句的規(guī)律。語(yǔ)法的精髓在于掌握語(yǔ)言的使用。
以上摘自百度百科(英語(yǔ)語(yǔ)法的定義),從這段論述我們可以看出英文的語(yǔ)法實(shí)質(zhì)上:
- 是組詞和造句的一系列規(guī)則;
- 主要分為詞法和句法,實(shí)質(zhì)上英文就是由單詞和語(yǔ)句構(gòu)成。
標(biāo)示符與關(guān)鍵字
雖然自然語(yǔ)言和編程語(yǔ)言有一定差異,但我個(gè)人感覺(jué)原理上的東西應(yīng)該是想通的,JavaScript作為一門腳本語(yǔ)言,它的基本構(gòu)成部分應(yīng)該就是標(biāo)示符與語(yǔ)句。標(biāo)示符類似于英文中的單詞,而語(yǔ)言類似于英文中的短語(yǔ),當(dāng)然各自的功能是不同
- 所謂標(biāo)示符是JavaScript中定義的符號(hào)的名字,他可以是變量、函數(shù)、屬性的名字,也可以是函數(shù)的參數(shù)名等等。其命名應(yīng)該注意:
- 區(qū)分大小寫;
- 第一個(gè)字符必須是字母、下劃線(_)、或者是$;
- 后面可以是字母、數(shù)字、下劃線、$;
另外需要注意關(guān)鍵字和保留字!
關(guān)鍵字是JavaScript引擎使用的的一些字,如果標(biāo)示符使用關(guān)鍵字,那么可能會(huì)影響程序的正常運(yùn)行,以下為關(guān)鍵字:
break else new var
case finally return void
catch for switch while
continue function this with
default if throw
delete in try
do instanceof typeof保留字是JS未來(lái)在發(fā)展演變過(guò)程中可能用到的的字符,因此也不能用來(lái)做標(biāo)示符,以下為保留字:
abstract enum int short
boolean export interface static
bye extends long super
char final native synchronized
class float package throws
const goto private transient
debugger implements protected volatile
doubler import public
變量的輸出方式
輸出變量的方式主要有四種:alert(),console.log(),document.write,document.title;
語(yǔ)句(statement)
- 語(yǔ)句(statement)是為了完成某種任務(wù)而進(jìn)行的操作;
- JavaScript中語(yǔ)句以;結(jié)束,一行可以包含多條語(yǔ)句,如果省略分號(hào)不會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤,解釋器會(huì)自動(dòng)判斷語(yǔ)句結(jié)束;
3、數(shù)據(jù)類型及分類
JavaScript語(yǔ)言的每一個(gè)值,都屬于某一種數(shù)據(jù)類型。JavaScript的數(shù)據(jù)類型,共有六種。
- 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
- 字符串(string):字符組成的文本(比如"Hello World")
- 布爾值(boolean):true(真)和false(假)兩個(gè)特定值
- undefined:表示“未定義”或不存在,即此處目前沒(méi)有任何值
- null:表示空缺,即此處應(yīng)該有一個(gè)值,但目前為空
- 對(duì)象(object):各種值組成的集合
原始類型和復(fù)雜類型
數(shù)值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數(shù)據(jù)類型,不能再細(xì)分了。
將對(duì)象稱為復(fù)雜類型(complex type)的值,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類型的值的合成,可以看作是一個(gè)存放各種值的容器。對(duì)象又可以分成四個(gè)子類型:
狹義的對(duì)象(object)
數(shù)組(array)
函數(shù)(function)
正則表達(dá)式 (regexp)
至于undefined和null,一般將它們看成兩個(gè)特殊值。
null表示空值,表示該處的值現(xiàn)在為空;
undefined表示未定義,即此處的值目前是不存在的;
字符串類型
js中雙引號(hào)與單引號(hào)包裹的字符,都是字符串?dāng)?shù)據(jù)類型,但是與php不同的是,雙引號(hào)并不能夠解析變量;

- 上圖可以看出,雙引號(hào)并不能夠解析變量
undefined數(shù)據(jù)類型
使用var聲明變量但是未對(duì)其進(jìn)行初始化時(shí),該變量的值就是undefined;

也就是說(shuō)變量聲明了,但是未初始化,此時(shí)變量默認(rèn)的值就是undefined;
- 值得注意的是未初始化的變量和尚未定義的變量有一定的區(qū)別:雖然使用typeof操作符來(lái)進(jìn)行數(shù)據(jù)類型判斷的時(shí)候,都是返回的是undefined;
Null數(shù)據(jù)類型
從邏輯角度來(lái)看,null值表示一個(gè)空對(duì)象指針,因此使用typeof操作符檢測(cè)的null的時(shí)候,返回的都是object;

如果定義的變量準(zhǔn)備在將來(lái)保存對(duì)象,則最好將該變量初始化為null而 不是其他值;
布爾類型(boolean)
布爾值代表“真”和“假”兩個(gè)狀態(tài)?!罢妗庇藐P(guān)鍵字true表示,“假”用關(guān)鍵字false表示。布爾值只有這兩個(gè)值;
- 要注意的是:
true和false是區(qū)分大小寫的,也就是說(shuō)False和True都不是布爾值,只是標(biāo)識(shí)符 ;
下列運(yùn)算符會(huì)返回布爾值:
- 兩元邏輯運(yùn)算符: && (And),|| (Or)
- 前置邏輯運(yùn)算符: ! (Not)
- 相等運(yùn)算符:===,!==,==,!=
- 比較運(yùn)算符:>,>=,<,<=
在這里需要注意的是:如果JavaScript預(yù)期某個(gè)位置應(yīng)該是布爾值,會(huì)將該位置上現(xiàn)有的值自動(dòng)轉(zhuǎn)為布爾值。轉(zhuǎn)換規(guī)則是除了下面六個(gè)值被轉(zhuǎn)為false,其他值都視為true:
- undefined
- null
- false
- 0
- NaN
- ""(空字符串)

需要特別注意的是,空數(shù)組([])和空對(duì)象({})以及字符串"0"對(duì)應(yīng)的布爾值,都是true。
Object
對(duì)象,就是一種無(wú)序的數(shù)據(jù)集合,由若干個(gè)“鍵值對(duì)”(key-value)構(gòu)成。key我們稱為對(duì)象的屬性,value可以是任何JavaScript類型,甚至可以是對(duì)象.
對(duì)象可以這么寫:
var o = new object(); o.name = 'wuyanwen'; o.age = '24 ;'
但是更加常用 的寫法是這樣的
var o ={ name: ' wuyanwen'; age: '24 '; }
key可以使用引號(hào)包裹,也可以直接寫,對(duì)象有一個(gè)默認(rèn)的方法toString,用來(lái)返回對(duì)象的字符串表示,如下所示:
4、運(yùn)算符
-
算術(shù)運(yùn)算符
-
賦值運(yùn)算符
賦值運(yùn)算符用于給變量賦值,最常見(jiàn)的賦值運(yùn)算符,當(dāng)然就是等號(hào),表達(dá)式x=y表示將y賦值給x。除此之外,JavaScript還提供其他11個(gè)賦值運(yùn)算符。
-
比較運(yùn)算符
比較運(yùn)算符比較兩個(gè)值,然后返回一個(gè)布爾值,表示是否滿足比較條件。JavaScript提供了8個(gè)比較運(yùn)算符。
-
布爾運(yùn)算符
-
小括號(hào)
在JavaScript中,圓括號(hào)是一種運(yùn)算符,它有兩種用法:
如果把表達(dá)式放在圓括號(hào)之中,作用是求值;
如果跟在函數(shù)的后面,作用是調(diào)用函數(shù)。
把表達(dá)式放在圓括號(hào)之中,將返回表達(dá)式的值。-
void
void運(yùn)算符的作用是執(zhí)行一個(gè)表達(dá)式,然后返回undefined。
-
逗號(hào)運(yùn)算符
逗號(hào)運(yùn)算符用于對(duì)兩個(gè)表達(dá)式求值,并返回后一個(gè)表達(dá)式的值。
5、運(yùn)算符優(yōu)先級(jí)和結(jié)合性
有的運(yùn)算符左結(jié)合,有的運(yùn)算符右結(jié)合。
1.typeof的優(yōu)先級(jí)非常高,比加減乘除的優(yōu)先級(jí)都要高,因此我們?cè)谶M(jìn)行復(fù)雜運(yùn)算的時(shí)候,應(yīng)該注意加括號(hào);
2.++、--是右結(jié)合的操作符(優(yōu)先級(jí)最高的幾個(gè)都是右結(jié)合),而且比加減乘除優(yōu)先級(jí)高。同時(shí)自增、自減運(yùn)算符的運(yùn)算數(shù)得是左值(可以放在賦值符號(hào)左邊的值),而不能是常數(shù);
- 賦值運(yùn)算符的優(yōu)先級(jí)非常的低;
4.邏輯非!也在優(yōu)先級(jí)隊(duì)列的前端,比加減乘除高,但邏輯與、邏輯或優(yōu)先級(jí)很低,不如加減乘除
復(fù)習(xí)部分:
1、JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
JavaScript定義了6種數(shù)據(jù)類型,其中number、string、boolean為原始類型,而對(duì)象(Object)是復(fù)雜類型,原始類型和復(fù)雜類型的區(qū)別主要在于原始類型不可以再進(jìn)行數(shù)據(jù)類型的分類,而復(fù)雜類型比如說(shuō)對(duì)象(Object)一般是幾個(gè)原始類型值的組合。
2、typeof和instanceof的作用和區(qū)別?
JavaScript有三種方法可以確定一個(gè)值到底是什么數(shù)據(jù)類型:
- typeof運(yùn)算符;
- instanceof運(yùn)算符;
- Object.prototype.toString方法;

- 1、typeof運(yùn)算符對(duì)于原始類型number、string、boolean分別返回number 、string、以及boolean;

- 2、typeof運(yùn)算符對(duì)于undefined類型,返回undefined,利用這一點(diǎn)可以利用typeof運(yùn)算符來(lái)檢查一個(gè)沒(méi)有聲明的變量,而不報(bào)錯(cuò);
- 3、typeof運(yùn)算符對(duì)于函數(shù) 返回function;
- 4、除了以上幾種情況,其他情況情況一般返回為object(對(duì)象);
instanceof運(yùn)算符:
instanceof用于判斷一個(gè)變量是否某個(gè)對(duì)象的實(shí)例,運(yùn)算符返回一個(gè)布爾值。instanceof只能用來(lái)判斷對(duì)象和函數(shù),不能用來(lái)判斷字符串和數(shù)字等。(這部分留待后續(xù)進(jìn)行深入的研究)
3、如何判斷一個(gè)變量是否是數(shù)字、字符串、布爾、函數(shù)?
我們可以利用typeof運(yùn)算符來(lái)判斷一個(gè)變量的數(shù)據(jù)類型。
4、NaN是什么? 有什么特別之處?
NaN即為Not a Number,表示是一個(gè)非數(shù)字,NaN與任何值都不相等,包括它自己。NaN是屬于數(shù)字類型的。
5、如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
有三個(gè)函數(shù)可以將非數(shù)值轉(zhuǎn)換為數(shù)值:

- 1、Number()
- 2、parseInt()
- 3、parseFloat()
6、==與===有什么區(qū)別?
== 叫做相等運(yùn)算符;
=== 叫做嚴(yán)格運(yùn)算符;
嚴(yán)格運(yùn)算符(===)的運(yùn)算規(guī)則如下:
(1)不同類型值
如果兩個(gè)值的類型不同,直接返回false;(2)同一類型的原始類型值
同一類型的原始類型值(數(shù)值,布爾值,字符串)比較時(shí),值相同就返回true,值不同返回false;(3)同一類型的復(fù)雜類型值
兩個(gè)復(fù)合類型(對(duì)象、數(shù)組、函數(shù)等)數(shù)據(jù)比較時(shí),不是比較他們的值是否相等,而是比較他們是否指向同一個(gè)對(duì)象;(4)undefined和null
undefined 和 null 與自身嚴(yán)格相等。
相等運(yùn)算符(==)在比較相同類型的數(shù)據(jù)時(shí),與嚴(yán)格相等運(yùn)算符完全一樣;
在比較不同類型的數(shù)據(jù)時(shí),相等運(yùn)算符會(huì)先將數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換,然后再用嚴(yán)格相當(dāng)呢個(gè)運(yùn)算符比較。
(1)、原始類型的值
原始類型的數(shù)據(jù)會(huì)轉(zhuǎn)換成數(shù)值類型再進(jìn)行比較,字符串和布爾值會(huì)轉(zhuǎn)換成數(shù)值,然后再進(jìn)行比較;(2)、對(duì)象和原始類型值的比較
對(duì)象(指廣義的對(duì)象,包括數(shù)值和函數(shù)等)與原始類型的值比較時(shí),對(duì)象轉(zhuǎn)換為原始類型的值,再進(jìn)行比較;(3)、undefined和null
undefined和null與其他類型的值比較時(shí),結(jié)果都為false,他們互相比較時(shí)結(jié)果是true;(4)、在這里要注意一些相等運(yùn)算符的的缺點(diǎn)
相等運(yùn)算符隱藏的類型轉(zhuǎn)換,會(huì)帶來(lái)一些違反直覺(jué)的結(jié)果。
建議使用嚴(yán)格相等符(===),這樣能夠減少代碼的其他異常問(wèn)題。
7、break與continue有什么區(qū)別
break與continue兩個(gè)英文意思一個(gè)是破壞,一個(gè)是持續(xù),兩者區(qū)別可以這樣理解:
假如工廠存在一條循環(huán)回用流水線,當(dāng)執(zhí)行到某工段的時(shí)候break了,整條循環(huán)回用生產(chǎn)線直接全線停產(chǎn),執(zhí)行后續(xù)生產(chǎn)線的的工作內(nèi)容,(相當(dāng)于跳出了這個(gè)循環(huán));
而continue則是執(zhí)行到某工段后,滿足了某個(gè)特定條件 ,直接略過(guò)循環(huán)生產(chǎn)線的后續(xù)工作內(nèi)容,再次從頭開(kāi)始.
這么說(shuō)可能太抽象了,還是舉兩個(gè)例子吧!
for(var i = 1; i< 10; i++){ if(i % 4 === 0){ break; } console.log(i); }
for(var i = 1; i< 10; i++){ if(i % 4 === 0){ continue; } console.log(i); } console.log("continue略過(guò)了i===4的階段,執(zhí)行后續(xù)的循環(huán),循環(huán)結(jié)束后,執(zhí)行循環(huán)體后操作")

8.void 0 和 undefined在使用場(chǎng)景上有什么區(qū)別?
void 0 的值永遠(yuǎn)都是undefined,而undefined在某些時(shí)候可以被賦值,如果需要判斷一個(gè)變量的值是否為undefined,用void 0 比較有保證
9.

10.

11.

12.

13.

14.1

14.2

14.3

14.4
