第一章
前端三大語(yǔ)言:HTML(專(zhuān)門(mén)編寫(xiě)網(wǎng)頁(yè)內(nèi)容)、CSS(編寫(xiě)網(wǎng)頁(yè)樣式)、JS(專(zhuān)門(mén)編寫(xiě)網(wǎng)頁(yè)交互行為)
能簡(jiǎn)寫(xiě)盡量簡(jiǎn)寫(xiě)
交互(IPO): ①用戶(hù)輸入;②執(zhí)行: 程序接受、處理、響應(yīng)數(shù)據(jù);③輸出處理結(jié)果
原生JS:不需要下載任何第三方文件,僅依靠瀏覽器就可直接執(zhí)行的js代碼
學(xué)習(xí)版本:ES6(2015)
現(xiàn)版本:ES7
中文亂碼問(wèn)題:引入的 .js 文件要與HTML文件一樣是UTF-8模式,否則要在script中加?charset="gbk",但兩個(gè)不能同時(shí)使用
API(Application Programming Interface,應(yīng)用程序編程接口)是一套用來(lái)控制Windows的各個(gè)部件的外觀和行為的一套預(yù)先定義的Windows函數(shù)
如果回調(diào)函數(shù)無(wú)法取名,可以在回調(diào)函數(shù)中調(diào)用定義的另一個(gè)有名的函數(shù),以此來(lái)達(dá)到目的
判斷數(shù)據(jù)是否為null、0、""、NaN、null、undefined一律可以省略等號(hào)后的值,只判斷是否為false
js的事件監(jiān)聽(tīng)跟css不一樣,css只要設(shè)定好了樣式,不論是原來(lái)就有的還是新添加的,都有一樣的表現(xiàn),而事件監(jiān)聽(tīng)不同,只能給已經(jīng)加載好的元素綁定事件
_______________________________________________________________________________________________
typeof null返回object
最初,JavaScript使用標(biāo)記位來(lái)區(qū)分對(duì)象類(lèi)型和原始類(lèi)型:對(duì)象值使用0來(lái)標(biāo)識(shí),原始值使用1,因此,導(dǎo)致全為0的null被識(shí)別為object
JavaScript可以通過(guò)typeof ...來(lái)判斷原始數(shù)據(jù)類(lèi)型,但不能夠準(zhǔn)確判斷引用類(lèi)型,但可以用Object的toString方法來(lái)判斷:?console.log(Object.prototype.toString.call(要判斷的數(shù)據(jù)))
一元運(yùn)算符: 有些運(yùn)算符兩邊有2個(gè)操作數(shù),比如2+3、6%5等,這些叫做二元運(yùn)算符
? ? ? ? ? ? 只有一個(gè)操作數(shù)的叫做一元運(yùn)算符,它們的優(yōu)先級(jí)高于二元運(yùn)算符
? ? ? ? ? ? 一元運(yùn)算符包括: ++(自加)、--(自減)、!(邏輯非)
JS的運(yùn)算規(guī)則: 優(yōu)先級(jí)相同的運(yùn)算符從左向右計(jì)算(賦值運(yùn)算符相反)
var a=1;b=++a+a++; 表示 b=2+2;
var a={n:1};
var b=a;
a.x=a={n:2}; ? ?//從左往右讀(取出來(lái)),從右往左執(zhí)行
? ? ? ? ? ? ? ? //先執(zhí)行a.x={n:2},再執(zhí)行a={n:2}
console.log(a.x);? ? //undefined
console.log(b.x);? ? //{n:2}
console.log(a);? ? ? //{n:2}
console.log(b);? ? ? //{n:1, x:{n:2}}
_______________________________________________________________________________________________
1、Javascript概述
Javascript運(yùn)行于Javascript 【解釋器/引擎】中的解釋性腳本語(yǔ)言
Javascript運(yùn)行環(huán)境:1、Javascript解釋器 :NodeJS
? ? ? ? ? ? ? ? ? ? 2、嵌入在瀏覽器中的內(nèi)核(引擎)
? 解釋型:無(wú)需編譯,直接運(yùn)行,出錯(cuò)就停止
? 腳本語(yǔ)言:純文本語(yǔ)言
? JS解釋器和JS引擎:1、獨(dú)立安裝的JS解釋器:NodeJS
? ? ? ? ? ? ? ? ? ? 2、嵌入在瀏覽器內(nèi)核中的JS解釋器:只要有瀏覽器,就能運(yùn)行JS
2、Javascript 發(fā)展
? ①1992年 Nombas公司開(kāi)發(fā)了一款腳本語(yǔ)言 ScriptEase ,可以嵌入在網(wǎng)頁(yè)中
? ②1995年 Netscape(網(wǎng)景)公司為Navigator2.0瀏覽器開(kāi)發(fā)了一款腳本語(yǔ)言 LiveScript,為了蹭熱點(diǎn)將其命名為 Javascript,其實(shí)Javascript與Java沒(méi)有一點(diǎn)關(guān)系
? ③1996年,Microsoft ,為了IE3.0,發(fā)布了一個(gè)Javascript克隆版本 JScript
? ④1997年 Javascript1.1 作為草案提交給了ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))→ECMA-262標(biāo)準(zhǔn)→ECMAScript(ECMA制定的JavaScript語(yǔ)言國(guó)際標(biāo)準(zhǔn),規(guī)定了JS語(yǔ)言的核心語(yǔ)法)
3、Javascript (原生JS)的組成
??① 核心(ECMAScript,簡(jiǎn)稱(chēng)ES,ECMA制定的JavaScript語(yǔ)言國(guó)際標(biāo)準(zhǔn),規(guī)定JS語(yǔ)言的核心語(yǔ)法)
? ② 文檔對(duì)象模型(DOM---Document Object Model)允許讓JS和HTML元素進(jìn)行對(duì)話
?專(zhuān)門(mén)操作網(wǎng)頁(yè)內(nèi)容的API
? ③ 瀏覽器對(duì)象模型(BOM—Browser Object Model)允許讓JS和瀏覽器進(jìn)行對(duì)話和操作
?專(zhuān)門(mén)操作瀏覽器窗口的API
4、Javascript特點(diǎn):
? ①任何編輯工具(例如:記事本)都可以編寫(xiě)Javascript,語(yǔ)法類(lèi)似于Java,C,...
? ②無(wú)需編譯,由JS解釋器運(yùn)行(自上向下邊讀邊解釋邊執(zhí)行,后解釋的相同內(nèi)容會(huì)覆蓋先解釋的)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?賦值:?從左往右讀(取出來(lái)待執(zhí)行),從右往左執(zhí)行(賦值)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?運(yùn)算:從左往右計(jì)算
? ③弱類(lèi)型語(yǔ)言:聲明變量時(shí),不必提前規(guī)定變量的數(shù)據(jù)類(lèi)型,先后可保存不同類(lèi)型的數(shù)據(jù),由值來(lái)自動(dòng)隱式轉(zhuǎn)換數(shù)據(jù)類(lèi)型
? ④基于對(duì)象的編程語(yǔ)言———萬(wàn)物皆對(duì)象
5、 Javascript的用途
? ①客戶(hù)端Javascript:瀏覽器中運(yùn)行
? ? 1、客戶(hù)端數(shù)據(jù)計(jì)算
? ? 2、客戶(hù)端表單輸入驗(yàn)證
? ? 3、瀏覽器事件的觸發(fā)和處理
? ? 4、客戶(hù)端動(dòng)畫(huà)效果特效制作
? ? 5、服務(wù)器的異步數(shù)據(jù)提交(ajax)
? ②服務(wù)器端Javascript:1、分布式運(yùn)算????2、實(shí)時(shí)服務(wù)器????3、窗口應(yīng)用????4、網(wǎng)絡(luò)應(yīng)用
_______________________________________________________________________________________________
Javascript基礎(chǔ)語(yǔ)法
1、JS運(yùn)行在腳本解釋引擎:專(zhuān)門(mén)解析JS語(yǔ)言,并執(zhí)行js程序的小軟件
瀏覽器內(nèi)核:負(fù)責(zé)頁(yè)面內(nèi)容的渲染,由兩部分組成:
? ①內(nèi)容排版引擎:解析 HTML 和 CSS,并顯示網(wǎng)頁(yè)內(nèi)容和樣式的小軟件,效率高
? ②腳本解釋引擎:解析并執(zhí)行 Javascript 程序的小軟件,效率略低
全球僅有四個(gè)獨(dú)立的瀏覽器內(nèi)核
? ? ? ? 瀏覽器 ? ? ? ? ? ?內(nèi)核 ? ?內(nèi)容引擎 ? ?腳本引擎
? ? Microsoft IE ? ? ? ?Trident? ? -- ? ? ? ? Chakra
? ? Mozilla Firefox ? ? ?Gecko? ?? -- ? ? ? ?Monkey系列
? ? Apple Safari ? ? ?? Webkit ? ?Webcore ? ? ?Nitro
? ? Google Chrome ? ? ?Webkit? ?Webcore ? ? ? V8
? ? Opera ? ? ? ? ? ? ?Presto? ? ?-- ? ? ?? Carakan
? ? Opera(2013 -) ? ? ? Webkit ? ?Webcore ? ? ? V8
2、Javascript運(yùn)行環(huán)境
運(yùn)行環(huán)境:
? ①安裝獨(dú)立的Javascript解釋器—Node.js
? ? 步驟:1、安裝NodeJS
? ? ? ? ? 2、運(yùn)行JS腳本:console.log ("輸出的內(nèi)容");
? ②瀏覽器內(nèi)核嵌入的JS解釋器:在console中輸入腳本運(yùn)行,將JS腳本嵌入在HTML網(wǎng)頁(yè)中執(zhí)行
_______________________________________________________________________________________________
輸出位置(3個(gè))
①向頁(yè)面添加內(nèi)容:<script>document.write("html代碼段");</script>? /*document:當(dāng)前網(wǎng)頁(yè)(不推薦)*/
②彈出對(duì)話框:彈出對(duì)話框顯示消息:alert("提示消息");? ?? /*彈出瀏覽器預(yù)定好的樣式,不可修改*/
③向控制臺(tái)中輸出內(nèi)容:F12→console.log("xx");? ? /*控制臺(tái)專(zhuān)門(mén)用于調(diào)試程序,臨時(shí)顯示調(diào)試結(jié)果*/
書(shū)寫(xiě)位置(2處)
①頁(yè)面的<script type="text/javascript"></script>標(biāo)簽中嵌入腳本
? EX:?<script>document.write("xxx");</script>
? ? ? document.write:網(wǎng)頁(yè)中打印輸出一句話!里面的內(nèi)容是交給內(nèi)容排版引擎解析的
? EX:docume.write("<h1>第一個(gè)JS</h1>");
一旦進(jìn)入script標(biāo)簽內(nèi),就要使用js的語(yǔ)法
問(wèn)題: 不符合內(nèi)容與行為分離的原則,不便于維護(hù)和共用
②將腳本嵌入在外部的腳本文件中
? 1、創(chuàng)建腳本文件并編寫(xiě)JS腳本:創(chuàng)建一個(gè)**.JS文件;直接編寫(xiě)JS腳本
? 2、使用網(wǎng)頁(yè)中進(jìn)行引入:<script src="url"></script>
? ? ?注意:必須成對(duì)出現(xiàn),兩個(gè)script標(biāo)簽之間不允許出現(xiàn)其他內(nèi)容
? ? ?放在<head></head>中,瀏覽器解析head部分時(shí)就會(huì)執(zhí)行這個(gè)代碼,然后才會(huì)解析頁(yè)面其它部分
? ? ?放在<body></body>中,瀏覽器讀取到該語(yǔ)句時(shí)才會(huì)執(zhí)行(一般使用此方法)
3、JS基本調(diào)試
? JS運(yùn)行過(guò)程中,如果出現(xiàn)錯(cuò)誤,則終止本塊的執(zhí)行,但不影響后續(xù)代碼塊執(zhí)行
? <script></script>:代碼塊
4、基本語(yǔ)法規(guī)范
? ①代碼的基本組成:語(yǔ)句
? ? 語(yǔ)句:允許被JS引擎所解釋的代碼,由表達(dá)式,關(guān)鍵字,運(yùn)行符所組成
? ? 注意:嚴(yán)格區(qū)分大小寫(xiě)
? ? ? ? ?所有的標(biāo)點(diǎn),全部都是英文的
? ? ? ? ? 字符串可以用" "或' '
? ? ? ? ?語(yǔ)句都是以;表示結(jié)束
? ②JS中的注釋?zhuān)簡(jiǎn)涡凶⑨專(zhuān)?/ ? ? ? ? ? ? ? ? ? ? ?多行注釋?zhuān)?**/
_______________________________________________________________________________________________
輸出臺(tái)操作(F12):
①Shift+Enter: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*僅換行暫不執(zhí)行,用于多行輸出*/
②console.log("Hello World!"); ? ? ? ? ? ? ? /*每寫(xiě)log一次,都自動(dòng)換行*/
③左上角圓形叉號(hào):Clear console ? ? ? ? ? ? ? /*清空控制臺(tái)*/
④調(diào)出剛寫(xiě)過(guò)的代碼段:上下鍵切換
調(diào)試程序:2種
斷點(diǎn)調(diào)試:debugger; ? ?/*加在console.log 之前,在開(kāi)著F12的情況下才有效*/
console.log(" , , "); /*在控制臺(tái)輸出(""中的+會(huì)將這兩個(gè)變量視為字符串,最后一個(gè)不能加,)*/
啟用嚴(yán)格模式:在script頂部插入:"use strict"; ? ? ? ? ? ? /*解決靜默失敗*/
嚴(yán)格模式下: 不用var定義變量是非法的,會(huì)導(dǎo)致錯(cuò)誤;調(diào)用函數(shù)中的this值是undefined
非嚴(yán)格模式下: 不用var定義變量是全局變量;調(diào)用函數(shù)中的this值是全局對(duì)象
輸入: prompt("輸入提示") ? ? ? ? /*輸入框: 專(zhuān)門(mén)請(qǐng)用戶(hù)輸入一個(gè)數(shù)據(jù)的對(duì)話框*/
_______________________________________________________________________________________________
變量和常量
變量
1、什么是變量:內(nèi)存中存儲(chǔ)一個(gè)數(shù)據(jù)的存儲(chǔ)空間,再起一個(gè)名字,為了重用
? ?量:數(shù)據(jù)
? ?變量:變化的數(shù)據(jù)
? ?內(nèi)存:保存程序在運(yùn)行過(guò)程中所需要用到的數(shù)據(jù)
?? 變量:內(nèi)存中的一段存儲(chǔ)空間,用于保存數(shù)據(jù)
?? 值:變量中所保存的數(shù)據(jù)
?? 變量名:內(nèi)存地址的別名即保存數(shù)據(jù)的空間的名稱(chēng)
2、變量的聲明
①聲明變量:在內(nèi)存中,創(chuàng)建一個(gè)存儲(chǔ)空間,再起一個(gè)名字
var 變量名;
默認(rèn)值:undefined:專(zhuān)門(mén)表示一個(gè)從未使用過(guò)的變量
②為變量賦值:將數(shù)據(jù)保存在變量中(盡量不要讓變量空著,賦初值)
變量名=值;
注意:只有等號(hào)才能改變變量中的值;等號(hào)會(huì)覆蓋變量中的原值;變量賦值前必須先聲明(給未聲明過(guò)的變量賦值,普通情況下自動(dòng)創(chuàng)建新變量并保存值;ES5模式規(guī)定禁止給未聲明的變量賦值)
取用:取出變量中的值做運(yùn)算,只要使用變量值,等效于直接使用變量中的值
? ? ? 不加引號(hào)的都會(huì)當(dāng)做變量
③聲明變量并賦值
var 變量名=值; ? ? ? ? ? ? ? ?/*只有等號(hào)才能賦值*/
注意:如果變量的值時(shí)非數(shù)字類(lèi)型的話,要使用''或""括起來(lái)
? ? ? 聲明時(shí)可以省略var關(guān)鍵字,省略后成為了全局變量,推薦不要省略var關(guān)鍵字
④推薦:?一條語(yǔ)句聲明多個(gè)變量,用,分隔(每個(gè)變量必須要用=才能賦值)(建議多個(gè)變量換行寫(xiě))
? ? 例:var 名1="xxx",名2="xxx",名3="xxx";
3、變量名的命名規(guī)范
? ①不允許是JS的關(guān)鍵字或保留關(guān)鍵字
? ②可以包含字母,數(shù)字,下劃線(_),$
? ③不能以數(shù)字開(kāi)頭
? ④盡量見(jiàn)名知義
? ⑤可以采用“匈牙利命名法”,“駝峰命名法”,“下劃線命名法”
? ? 駝峰命名法:變量名稱(chēng),如果只有一個(gè)單詞組成,采用全小寫(xiě)模式 ? 例:var age
? ? 如果變量名由多個(gè)單詞組成,第一個(gè)單詞全小寫(xiě),其余的每個(gè)單詞的首字母,變大寫(xiě)
4、變量的使用
①變量定義后,未賦過(guò)值而直接使用
? EX:var userName;
? ? ? console.log (userName); ? ? 結(jié)果為:undefined,表示沒(méi)有值
②對(duì)變量進(jìn)行存取操作
? 1、獲取變量的值-GET操作
? ?? 例:var userAge=18;--------存值
? ? ? ?? console.log(userAge);------------取值
? ? ? ? ?document.write(userAge);----------取值
? ? ? ?? user-----存值操作 ? 18------取值操作
輸出從未聲明的變量時(shí)會(huì)返回:ReferenceError ? ? ? 沒(méi)有找到對(duì)象
? 總結(jié):只要變量沒(méi)有出現(xiàn)在=左邊,一律是取值
? 2、設(shè)置變量的值 – SET操作
? ? ?例:var userAge=15;
? ? ? ?? var newAge=userAge
? ? ? ?? userAge---取值 ? newAge---存值
? ? ? ?? newAge=newAge+15;
? ? ? ? ?console.log(newAge);--------30
? 總結(jié):只要變量出現(xiàn)在=左邊,一律是存值操作
筆試題: var a,b=2; ?→ ?a:undefined? b:2
? ? ? ? var a=b=2; ?→ ?a:2 ?b:2 (在函數(shù)中時(shí),a是局部變量,b是全局變量)
_______________________________________________________________________________________________
常量
1、什么是常量
一經(jīng)聲明定義后,就不允許被修改的數(shù)據(jù)成為常量
目的:保證數(shù)據(jù)的準(zhǔn)確性
適合用常量表示的數(shù)據(jù):EX:1、圓周率:兀=3.1415926; ?2、一周有7天
2、語(yǔ)法
const 常量名=值;
注意:①常量不允許賦值,否則會(huì)靜默失敗,ES5嚴(yán)格模式會(huì)報(bào)錯(cuò)
? ? ? ②聲明變量時(shí),必須初始化其值
? ? ? ③習(xí)慣上,常量名采用純大寫(xiě)形式
取值:和變量用法一樣
var 變量=prompt("提示")? /*請(qǐng)用戶(hù)輸入變量的值,并保存在變量中,不能在node里使用prompt*/
_______________________________________________________________________________________________
數(shù)據(jù)類(lèi)型(掌握)
1、什么是數(shù)據(jù)類(lèi)型
?? 保存在內(nèi)存中數(shù)據(jù)的真實(shí)類(lèi)型,約束了數(shù)據(jù)在內(nèi)存所占的空間大小,存儲(chǔ)結(jié)構(gòu)
?? 不同的數(shù)據(jù)類(lèi)型,擅長(zhǎng)執(zhí)行的操作不一樣,就需要配套合適的存儲(chǔ)結(jié)構(gòu),給操作提供便利
2、數(shù)據(jù)類(lèi)型分類(lèi)
原始類(lèi)型(基本數(shù)據(jù)類(lèi)型: 值直接保存在變量本地的數(shù)據(jù)類(lèi)型)
? 包括5個(gè): number、string、boolean、null、undefined
引用類(lèi)型: 值無(wú)法直接保存在變量本地的復(fù)雜數(shù)據(jù)類(lèi)型
? 包括: Array、Function、Date、RegExp、Error、Object、String、Number、Boolean、Math、Window
數(shù)組是引用類(lèi)型的對(duì)象,對(duì)象的本質(zhì)就是關(guān)聯(lián)數(shù)組,只不過(guò)用法更簡(jiǎn)單
函數(shù)名其實(shí)僅是一個(gè)普通的變量 ,函數(shù)其實(shí)是保存代碼段的引用類(lèi)型的對(duì)象
? ①number類(lèi)型:
專(zhuān)門(mén)用于存儲(chǔ)數(shù)字,表示32(8位一個(gè)字節(jié))位的"整數(shù)",也可以標(biāo)識(shí)64位的"浮點(diǎn)數(shù)",采用二進(jìn)制存儲(chǔ)(),凡是不加引號(hào)的數(shù)字直接量,默認(rèn)都是number類(lèi)型
何時(shí): 如果一個(gè)數(shù)值可能需要比較大小和進(jìn)行數(shù)學(xué)計(jì)算時(shí)
存儲(chǔ)空間: 整數(shù)占4個(gè)字節(jié),浮點(diǎn)數(shù)占8個(gè)字節(jié),數(shù)值大小和存儲(chǔ)空間無(wú)關(guān)(1字節(jié)=8位二進(jìn)制)
特殊:舍入誤差:計(jì)算機(jī)中也有計(jì)算不盡的數(shù)值
原因:number類(lèi)型底層都是二進(jìn)制存儲(chǔ)
解決:四舍五入
n.toFixed(n)//四舍五入,保留n位小數(shù),返回字符串類(lèi)型,傳入數(shù)字,可Number(x).toFixed(2)
typeof x / typeof(x) ? ? ? ? ? /*返回變量x中存儲(chǔ)的數(shù)據(jù)類(lèi)型*/
var m=n.toString(2) ? ? ? ? ?? /*把n中的數(shù)值(先轉(zhuǎn)為Unicode)轉(zhuǎn)換為內(nèi)存中的二進(jìn)制形式*/
? ②string類(lèi)型
什么是: 凡是加引號(hào)的一串字符直接量都是字符串類(lèi)型,EX:姓名,性別,住址,身份證號(hào),不用做計(jì)算和比較大小,都用""或''包裹
何時(shí): 記錄一串文字
js中一切文字都是由Unicode字符、數(shù)字、標(biāo)點(diǎn)符號(hào)的序列組成的
Unicode 是編碼(對(duì)全球主要語(yǔ)言的每個(gè)字編一個(gè)號(hào))的一種,Unicode下所有的字符,每個(gè)字符均占2字節(jié),而且每個(gè)字符都有一個(gè)獨(dú)一無(wú)二的Unicode碼
字母和數(shù)字占1個(gè)字節(jié),漢字占2個(gè)字節(jié)
string類(lèi)型的數(shù)據(jù)在使用過(guò)程中,要用""或''引起來(lái)
特殊字符需要轉(zhuǎn)義,稱(chēng)為轉(zhuǎn)義字符(字符串中具有特殊功能的字符)
如果在字符串中包含了和js語(yǔ)法沖突的','等,都要用\轉(zhuǎn)義為普通字符
? 轉(zhuǎn)義字符 ? ? ? ? ?表現(xiàn)(輸出)形式
? ?\n ? ? ? ? ? ? ?? 一個(gè)換行
? ? \t ? ? ? ? ?? ? ? 制表符
? ? \\ ? ? ? ? ? ? ? ? ? \
? ? \" ? ? ? ? ? ? ? ? ? ''
? ? \' ? ? ? ? ? ? ? ? ? '
例:var str= '你\n好';
? ? 路徑:所有操作系統(tǒng)都支持/斜線,所以保存路徑時(shí)要將\換成/:
var n=str.charCodeAt(i);? //查看字符串str中下標(biāo)i位置字符的unicode號(hào)
String.fromCharCode(unicode號(hào))? ? //將unicode號(hào),反向轉(zhuǎn)回文字,一次只能轉(zhuǎn)一個(gè)字,要用循環(huán)
var m=n.toString(2);? ?? //將n中的數(shù)值轉(zhuǎn)換為二進(jìn)制形式
parseInt(10000000000,2);??//把二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制
var str=x.toString();? ? //將 x 轉(zhuǎn)為字符串類(lèi)型,不改變?cè)祒。x為數(shù)組時(shí),結(jié)果str用,分隔
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x不能是null或undefined ———?不是萬(wàn)能
var str=String(x);? ? ? ? //將x轉(zhuǎn)為字符串類(lèi)型———萬(wàn)能(首選)
? ③boolean類(lèi)型
作為條件的結(jié)果,來(lái)表示肯定(真)或否定(假)
何時(shí): 只要作為判斷條件的結(jié)論時(shí),就用boolean類(lèi)型
取值:true:真(肯定)
? ? ? false:假 (否定)
例:var xxx=true;
該類(lèi)型數(shù)據(jù)可以參與到數(shù)字的運(yùn)算中:true = 1 ??false = 0
? ④undefined /⑤null
undefined:空,由程序自動(dòng)為一個(gè)變量初始化之用;表示一個(gè)聲明后未賦值的變量、沒(méi)有返回值的函數(shù)
null:空,讓程序員用于手動(dòng)清空一個(gè)變量之用,表示一個(gè)空地址
第二章*****************************************************************************************
x:任何數(shù)據(jù)
str:字符串
num:數(shù)字
數(shù)據(jù)類(lèi)型轉(zhuǎn)換:(凡是從頁(yè)面上獲得的都是字符串)
作用:將不需要的數(shù)據(jù)類(lèi)型,轉(zhuǎn)化為需要的數(shù)據(jù)類(lèi)型
js四大特點(diǎn):弱類(lèi)型的3大特點(diǎn):
?????1. 聲明變量時(shí),不需要提前規(guī)定變量中存儲(chǔ)的數(shù)據(jù)類(lèi)型
?????2. 同一個(gè)變量先后可保存不同類(lèi)型的數(shù)據(jù)
?????3. js會(huì)根據(jù)自身的需要,隱式轉(zhuǎn)換數(shù)據(jù)的類(lèi)型
何時(shí):只要給定的數(shù)據(jù)類(lèi)型不是想要的,都要轉(zhuǎn)換
方法有2種:
1、隱式轉(zhuǎn)換: 不需要程序員干預(yù),由js自動(dòng)完成的數(shù)據(jù)類(lèi)型轉(zhuǎn)換
??? 何時(shí): 只要給定的數(shù)據(jù)類(lèi)型和js運(yùn)算要求的類(lèi)型不相符,js都會(huì)自動(dòng)轉(zhuǎn)化數(shù)據(jù)類(lèi)型,再運(yùn)行
? ? 如何:每種運(yùn)算中都自帶隱式轉(zhuǎn)換
? ? ? ? ? 比如: 算數(shù)計(jì)算中
規(guī)則:
? ? ①默認(rèn):一切都轉(zhuǎn)為number類(lèi)型,再做計(jì)算
? ? 為什么: 因?yàn)閚umber類(lèi)型最適合計(jì)算
? ? ? ? bool: true->1 ? ? ?false->0
? ? ②特殊:+運(yùn)算中,只要碰到一個(gè)字符串,一切都轉(zhuǎn)為字符串,+運(yùn)算變?yōu)樽址唇?/p>
若字符串左邊有變量,先計(jì)算變量,從左到右依次計(jì)算(按優(yōu)先級(jí)),到字符串的位置后,都轉(zhuǎn)化為字符串
2. 強(qiáng)制轉(zhuǎn)換:程序員主動(dòng)調(diào)用轉(zhuǎn)換函數(shù)實(shí)現(xiàn)的類(lèi)型轉(zhuǎn)換(3種情況)
??? 何時(shí): 只要給定的數(shù)據(jù)類(lèi)型不是想要的,且自動(dòng)轉(zhuǎn)換的結(jié)果也不是想要的,就要強(qiáng)制轉(zhuǎn)換
console.log(typeof x); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*輸出str的數(shù)據(jù)類(lèi)型*/
_______________________________________________________________________________________________
其他類(lèi)型轉(zhuǎn)number: 2種:
1. Number(x): 將純數(shù)字x字符串或bool轉(zhuǎn)為number類(lèi)型(不直接修改原變量的值,而是返回新值)
x=Number(x); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /*用于隱式轉(zhuǎn)換中自動(dòng)調(diào)用*/
? ? 何時(shí): 都是隱式轉(zhuǎn)換,其實(shí)相當(dāng)于自動(dòng)調(diào)用Number(x),很少主動(dòng)使用
? ? 問(wèn)題: 只能轉(zhuǎn)換純數(shù)字組成的字符串和bool類(lèi)型
? ? 如果轉(zhuǎn)不了: 就返回NaN
? ?NaN: 代表一切不是一個(gè)數(shù)字的任何值:Not a Number
? ? NaN參與任何運(yùn)算結(jié)果只能是NaN
2. parseFloat/parseInt(str):?將字符串str轉(zhuǎn)為number類(lèi)型,可去除結(jié)尾非數(shù)字字符,但不去掉開(kāi)頭的,因?yàn)楸磉_(dá)式從左到右依次執(zhí)行,所以可以在計(jì)算后直接加個(gè)單位(首選parseFloat)
? ? parseFloat可保留小數(shù)部分
? ? parseInt? 去掉小數(shù)部分(向下取整)? ? ?? //當(dāng)使用e作為計(jì)數(shù)符號(hào)時(shí),也會(huì)去掉e符號(hào)
? ? 何時(shí): 只要將字符串轉(zhuǎn)number,首選parseFloat(),Number()太局限
? ? ? ? ? 如果確實(shí)需要去掉小數(shù),才選parseInt
? ? ? ? ? 如果轉(zhuǎn)不了,也返回NaN
強(qiáng)調(diào): 參數(shù)應(yīng)該是string類(lèi)型,如果給定的值不是string類(lèi)型,則先執(zhí)行隱式轉(zhuǎn)換,轉(zhuǎn)為string類(lèi)型,再轉(zhuǎn)number
? ? ? Number/parseFloat/parseInt 都會(huì)自動(dòng)去掉空格
特殊:
parseFloat("true") ?->NaN
Number(true) ?->1
Number("") ?->0
Number(null) ->0
Number(undefined) ->NaN
其他類(lèi)型轉(zhuǎn)string: 2種:
1.var str=x.toString() ?將 x 轉(zhuǎn)為字符串類(lèi)型,并返回結(jié)果。x為數(shù)組時(shí),用,分隔
? ? x不能是null或undefined ———?不是萬(wàn)能
2.var str=String(x)?將x轉(zhuǎn)為字符串類(lèi)型——萬(wàn)能(首選)
? ? 其實(shí),隱式轉(zhuǎn)為string時(shí),都是程序自動(dòng)調(diào)用String
其他類(lèi)型轉(zhuǎn)Boolean類(lèi)型: 1種
Boolean(x)
? ? 規(guī)則: 只有5個(gè)值會(huì)被轉(zhuǎn)為false:0? ""? NaN? null? undefined
? ? ? ? ? 其余都轉(zhuǎn)為true
? ? 其實(shí), 隱式轉(zhuǎn)為bool時(shí),都是程序自動(dòng)調(diào)用Boolean(x)
_______________________________________________________________________________________________
運(yùn)算符和表達(dá)式
程序: 人的想法在計(jì)算機(jī)中的執(zhí)行
運(yùn)算符: 程序中模擬人的想法的特殊符號(hào)
表達(dá)式: 由數(shù)據(jù),變量和運(yùn)算符組成的完成一項(xiàng)單一任務(wù)的語(yǔ)句
算數(shù)運(yùn)算: + , - , * , / , %
%: 模運(yùn)算/取余數(shù): 被除數(shù)/除數(shù),不要商,要除不盡的余數(shù)部分(取零頭)
? 何時(shí): 1. 取余數(shù),可限制一個(gè)結(jié)果不超過(guò)指定的最大值
? ? ? ? 2. 判斷能否整除
? ? ? ? ?? 判斷偶數(shù): 能被2整除 n%2==0
? ? ? ? ?? 判斷奇數(shù): 不能被2整除 n%2!=0
隱式轉(zhuǎn)換
默認(rèn):都轉(zhuǎn)number
特殊:+運(yùn)算中,碰到字符串,都轉(zhuǎn)字符串,+運(yùn)算變?yōu)樽址唇樱ㄔ谕饷嫣滓粋€(gè)parseFloat)
? ? ?字符串左邊的變量會(huì)先進(jìn)行計(jì)算,遇到字符串全部轉(zhuǎn)為字符串(按優(yōu)先級(jí),從左到右)
? ? ?true在計(jì)算中為1,false為0;在字符串中為true/false
舍入誤差: 計(jì)算機(jī)中,也有計(jì)算不盡的數(shù)值(如0.3-0.1, 0.1*3),一般是浮點(diǎn)型
解決:
1. 按指定位數(shù)四舍五入: n.toFixed(2)
?? 今后幾乎所有顯示金錢(qián)數(shù)的地方都要toFixed(2)
2. 存儲(chǔ): 保存很長(zhǎng)位數(shù)的小數(shù): 0.39999999
關(guān)系運(yùn)算: 用兩個(gè)值做比較,做判斷(若試圖比較未定義的變量,會(huì)報(bào)錯(cuò))
包括:>? <? >=? <=? ==? !=
返回值: bool 類(lèi)型的true/fasle
隱式轉(zhuǎn)換:默認(rèn)都轉(zhuǎn)為 number
特殊:1. 兩個(gè)值都是字符串, 則不再轉(zhuǎn)數(shù)字,而是依次比較兩個(gè)字符串的每個(gè)字符unicode號(hào)
? ? ? ? 一個(gè)是字符串,一個(gè)是number,會(huì)進(jìn)行隱式轉(zhuǎn)換
? ?? 2. 判斷NaN:NaN和任何值做> < >= <= ==5種比較時(shí),永遠(yuǎn)false
? ? ? ? ? ? ? ? ?NaN和任何值做!=比較時(shí),永遠(yuǎn)是true
? ? ?? 問(wèn)題:NaN==NaN ?=>false 用普通的==無(wú)法判斷NaN
? ? ?? 解決:isNaN(num) 專(zhuān)門(mén)代替==,用來(lái)判斷num是不是NaN
? ? ?? 何時(shí): 只要判斷是不是NaN,都用isNaN(num)函數(shù)
? ? ?? 反用: 判斷一個(gè)值是不是數(shù)字:!isNaN(num),若是數(shù)字,則返回true
? ? ? ?注意:?空字符串、純數(shù)字的字符串返回false(不是NaN)
? ?? 3. 區(qū)分null和undefined
?????? 問(wèn)題:==比較時(shí),會(huì)自動(dòng)將undefined隱式轉(zhuǎn)為null
? ? ? ? ? ?? null==undefined ? ?=> null=null
?????? 解決:=== 全等: 類(lèi)型必須先相同,值再相等(!==,不全等同理)
? ? ? ? ? ? ?其實(shí)===就是不帶隱式轉(zhuǎn)換的==
總結(jié):
= 賦值,只有=可以改變變量中的值
== 自帶隱式轉(zhuǎn)換作比較
=== 不帶隱式轉(zhuǎn)換作比較
注意: 兩個(gè)對(duì)象作比較,不做任何轉(zhuǎn)換,直接比較兩個(gè)對(duì)象的地址值(判斷兩個(gè)變量是否引用同一個(gè)對(duì)象)
邏輯運(yùn)算: 將多個(gè)關(guān)系運(yùn)算,綜合起來(lái)得到最終結(jié)論
何時(shí): 只要根據(jù)多個(gè)條件,綜合得出最終結(jié)論時(shí)
包括:&&與(而且) ? ||或(要么) ? !非(沒(méi)有)
條件1&&條件2...:
? ? 要求所有條件都為true,結(jié)果為true
? ? 只要一個(gè)條件為false,結(jié)果為false
條件1||條件2...:
? ? 只要一個(gè)條件為true,結(jié)果為true
? ? 除非所有條件都為false,結(jié)果才為false
!條件: 顛倒 條件的 判斷結(jié)果
隱式轉(zhuǎn)換: 默認(rèn)將每個(gè)條件都轉(zhuǎn)為bool類(lèi)型
短路邏輯: 如果前一個(gè)條件已經(jīng)可以得出最終結(jié)論,則后續(xù)條件不再執(zhí)行
???? &&: 只有前一個(gè)條件為false時(shí),后續(xù)條件才不執(zhí)行
???? ||: 只要前一個(gè)條件為true時(shí),后續(xù)條件不再執(zhí)行
利用短路:①簡(jiǎn)單分支結(jié)構(gòu): 1個(gè)條件,1件事,只有滿(mǎn)足才做
? ? ? ? ? ? 如何: 條件&&(操作) ? (最簡(jiǎn)單的條件判斷語(yǔ)句,注意加())
? ? ? ? ? ②利用||選擇默認(rèn)值,如果給定的值有效,則使用給定的值,否則使用默認(rèn)值代替
? ? ? ? ? ? 如何:給定值||默認(rèn)值
? ? ? ? ? ? 無(wú)效:只要給定的值為0 "" NaN null undefined
注意:如果邏輯運(yùn)算最后執(zhí)行的是一個(gè)關(guān)系運(yùn)算,則返回bool
? ??如果邏輯運(yùn)算最后執(zhí)行的是一個(gè)值,則返回值,而不返回bool
_______________________________________________________________________________________________
位運(yùn)算: 了解
用二進(jìn)制簡(jiǎn)化普通十進(jìn)制的計(jì)算或操作
1. 左移/右移:
m<<n ?m左移n位,相當(dāng)于m*2的n次方
m>>n ?m右移n位,相當(dāng)于m/2的n次方
? ? 1<<3=1*23=8
? ? 2<<3=2*23=16
? ? 8>>3=8/23=1
2. 取整:
? ? n^0?? n|0?? n>>>0 ? ? ? ? 代替/簡(jiǎn)化Math.floor(n),用來(lái)把n向下取整(^ 按位異或)
3. 交換兩變量的值:
? ? var a=3,b=5;
? ?? 方法一: var t=b; b=a; a=t;
? ?? 方法二:a+=b; b=a-b; a-=b;
? ?? 方法三:a^=b; b^=a; a^=b;(二、三只能交換number類(lèi)型的數(shù)據(jù))
? ? ?方法四:?a=a+b; b=a-b; a=a-b;
賦值運(yùn)算:
?????擴(kuò)展賦值運(yùn)算: 對(duì)特殊賦值運(yùn)算的簡(jiǎn)化
? ? ?何時(shí):只要取出變量中的值,計(jì)算后,再存回原變量中
? ? ?a=a+b 將a的值+b的值,再存回a中
?????將b的值累加到a上:可簡(jiǎn)寫(xiě)為a+=b
? ? a=a+b ?-> ?a+=b;
??? a=a-b ?-> ?a-=b;
??? a=a*b ?-> ?a*=b;
??? a=a/b ?-> ?a/=b;
??? a=a%b ?-> ?a%=b;
? 更簡(jiǎn)化: 遞增遞減運(yùn)算: 如果每次累加1/累減1
??? a+=1? ->? a++
??? a-=1? ->? a--
前++和后++
1. 如果單獨(dú)使用, 前后都一樣
2. 如果參與到其他表達(dá)式中時(shí):
?? 相同:變量中的值一定都會(huì)變化,+1
?? 不同: 前++,使用返回+1后的 新值去運(yùn)算
? ? ? ? ?后++,使用返回+1前的 舊值去運(yùn)算
注意:所有表達(dá)式都從左到右依次執(zhí)行;先執(zhí)行的操作會(huì)影響后續(xù)操作
函數(shù)中: return i++; ? ?返回+1前的 舊值去運(yùn)算
注意: ++a并不總和a=a+1完全一樣,++運(yùn)算符不會(huì)進(jìn)行字符串連接操作,它會(huì)先將操作數(shù)轉(zhuǎn)換為數(shù)字并增1
比如: var a="1"; ? ?++a為2, ?a+1為字符串"11"
第三章*****************************************************************************************
一、函數(shù)類(lèi)型
定義: 內(nèi)存中封裝一項(xiàng)任務(wù)步驟清單的代碼段,再起一個(gè)名字
為什么:代碼重用、劃分功能
何時(shí): 只要一段代碼,可能被反復(fù)使用,就都要先封裝在函數(shù)中,再反復(fù)調(diào)用函數(shù)
如何: 分2步
1、聲明(兩種方法)
①function函數(shù)名(參數(shù)變量列表){ ? ? /*形參*/ /*function創(chuàng)建函數(shù)*/
? ? ?函數(shù)體(代碼段);
? ? ?return 返回值; ? ? ? ? ? ? ? ? /*返回值要接住,再輸出才能顯示*/
? ?}
② 函數(shù)名=function(參數(shù)變量列表){
? ? ?函數(shù)體(代碼段);
? ? ?return 返回值;
? ?}
參數(shù): 函數(shù)運(yùn)行時(shí),接收傳入函數(shù)的數(shù)據(jù)的變量。參數(shù)用法和普通變量完全一樣,只不過(guò)不用var聲明
參數(shù)列表: 多個(gè)參數(shù)間用逗號(hào)分隔(參數(shù)變量1,參數(shù)變量2...)
? 何時(shí):若一項(xiàng)任務(wù)必須某些數(shù)據(jù)才能正常執(zhí)行時(shí),就必須定義參數(shù)
? 作用:①提醒調(diào)用者正確使用函數(shù);②讓函數(shù)變得更靈活
? 返回值: 函數(shù)執(zhí)行的結(jié)果(由是否需要返回結(jié)果決定是否返回值)
? ? ? ?何時(shí): 如果函數(shù)的調(diào)用者需要獲得函數(shù)執(zhí)行結(jié)果
? ? ? ?如何返回: return 返回值;
? ? ? ?作用:①return可單獨(dú)使用: 退出函數(shù);②退出函數(shù)時(shí),順便返回結(jié)果
? ? ? ?如果沒(méi)有返回值的函數(shù),就會(huì)默認(rèn)返回undefined
2、調(diào)用: 讓引擎按照函數(shù)的步驟清單,執(zhí)行任務(wù)
var 返回值=函數(shù)名(參數(shù)值列表);
或 ?函數(shù)名(參數(shù)值列表); ? ? ? ? ? ? ? ? ? /*實(shí)參*/
何時(shí): 函數(shù)只有調(diào)用才執(zhí)行,不調(diào)用不執(zhí)行
參數(shù)值列表: 傳入函數(shù)的執(zhí)行時(shí)必須的數(shù)據(jù)列表
? 只要函數(shù)定義時(shí)規(guī)定了參數(shù)變量,調(diào)用時(shí)都要傳入?yún)?shù)值,且順序和個(gè)數(shù)保持一致
? 每個(gè)參數(shù)值之間用逗號(hào)分隔
_______________________________________________________________________________________________
作用域scope: 一個(gè)變量的可用范圍
為什么:避免不同范圍的變量之間互相污染(注意執(zhí)行順序)
包括: 2種:
1.全局作用域: window(保存著全局變量)
什么是: 程序中的任何位置都可以訪問(wèn)的范圍
? ? ?全局變量: 保存在全局作用域中,程序任何位置都可使用的變量
? ? ? 特點(diǎn):隨處可用,可反復(fù)使用
? ? ? 何時(shí): 如果一個(gè)變量需要反復(fù)使用,或跨函數(shù)隨處可用時(shí),只要不屬于任何函數(shù)的變量,都是全局的
? ? ? 用法:console.log(變量名);
2.函數(shù)作用域:(保存著局部變量)
什么是: 僅函數(shù)內(nèi)可用的范圍
? ? ?局部變量: 保存在函數(shù)作用域中,僅函數(shù)內(nèi)可用的變量
? ? ? 特點(diǎn):僅在函數(shù)內(nèi)可用,不可重用
? ? ? 何時(shí): 如果只限于當(dāng)前函數(shù)內(nèi)使用,函數(shù)外不可用時(shí)
? ? ? 如何:1.函數(shù)的參數(shù)變量
? ? ? ? ? ? 2.在函數(shù)內(nèi)用 var 聲明的變量
總結(jié): 優(yōu)先定義并使用局部變量
? ? ? 盡量少使用全局變量——避免被污染
變量的使用順序:優(yōu)先使用函數(shù)內(nèi)的局部變量,局部沒(méi)有才去全局找
聲明提前(hoist,提起):
什么是: 在開(kāi)始執(zhí)行程序前,引擎會(huì)將var聲明的變量和function聲明的函數(shù),提前到"當(dāng)前作用域"頂部集中優(yōu)先創(chuàng)建,再開(kāi)始執(zhí)行程序 ? ? ? ? ?? /*但是賦值留在原地?*/
筆試: 如果先使用,后聲明,一定在考聲明提前,就要將所有var和function提前到當(dāng)前作用域的頂部,先創(chuàng)建,再判斷程序的輸出
問(wèn)題: 破壞了程序默認(rèn)的執(zhí)行順序
解決: ①傳統(tǒng): 強(qiáng)烈建議將所有的聲明都集中在當(dāng)前作用域頂部
? ? ? ②ES6: let代替var聲明變量
? ? ? ? ? ? ? let禁止在聲明之前,提前使用該變量,強(qiáng)制將聲明集中在當(dāng)前作用域頂部創(chuàng)建
? ? ? ? ? ? ? 限制:不能用let反復(fù)創(chuàng)建相同名稱(chēng)的變量
函數(shù)聲明:
?var/let 函數(shù)名=function(參數(shù)變量列表){...}?? /*用這種方式創(chuàng)建的函數(shù)不會(huì)被聲明提前*/
? 本質(zhì): 函數(shù)名其實(shí)僅是一個(gè)普通的變量
? ? ? ? 函數(shù)其實(shí)是保存代碼段的引用類(lèi)型的對(duì)象
? ? ? ? 函數(shù)名通過(guò)函數(shù)對(duì)象的地址引用著函數(shù)對(duì)象
按值傳遞:
什么是:兩變量間賦值,或?qū)⒆兞總魅牒瘮?shù)作為參數(shù)時(shí),其實(shí)只是將原變量中的值復(fù)制一個(gè)副本給對(duì)方
結(jié)果:原始類(lèi)型的值會(huì) 修改新變量,不影響原變量的值
_______________________________________________________________________________________________
2. 全局函數(shù)(了解)
什么是: ES標(biāo)準(zhǔn)中規(guī)定的,瀏覽器已經(jīng)實(shí)現(xiàn)的,不需要任何對(duì)象(前綴.)就可直接調(diào)用的函數(shù)
比如: String()/Number()/Boolean()
? ? ? parseInt/parseFloat()
? ? ? isNaN()/encodeURI/decodeURI
反例(省略了前綴,屬于BOM): alert()/prompt()...
編碼解碼: 特指對(duì)地址欄中的url內(nèi)容進(jìn)行編碼和解碼
什么是編碼: 將url中多字節(jié)字符或保留字符編碼為單字節(jié)字符
? 為什么: url中不允許出現(xiàn)多字節(jié)字符以及和保留字符沖突的字符,否則會(huì)亂碼
? 何時(shí): 只要url中可能包含多字節(jié)字符以及和保留字沖突的字符時(shí),都要先編碼為單字節(jié)
什么是解碼:將編碼后的單字節(jié)字符串解碼回多字節(jié)原文
何時(shí):只要收到的是編碼后的字符串,都要先解碼再使用
如何:編碼: var code=encodeURI(url);
? ? ?解碼: var url=decodeURI(code);
問(wèn)題: 不能對(duì)保留字符編碼解碼,比如: ?: ?/
解決:編碼: var code=encodeURIComponent(url);
? ? ?解碼: var url=decodeURIComponent(code);
注意: 不會(huì)對(duì)ASCII字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)ASCII標(biāo)點(diǎn)符號(hào)進(jìn)行編碼:? - _ . ! ~ * ' ( ) 。
其他字符(比如: ;/?:@&=+$,# 這些用于分隔URI組件的標(biāo)點(diǎn)符號(hào)),都是由一個(gè)或多個(gè)十六進(jìn)制的轉(zhuǎn)義序列替換的
eval函數(shù): 執(zhí)行一段字符串格式的js表達(dá)式
eval()的作用
把字符串參數(shù)解析成js代碼并運(yùn)行,并返回執(zhí)行的結(jié)果
eval的作用域:
作用域在它所有的范圍內(nèi)有效,但是IE8及以下指向window(全局)
解決方法:
functiona(){
? if(window.execScript){ ? ? ?? // 支持IE8及以下的版本
? ? window.execScript("var x=1");
? }else{?window.eval("var x=1"); }? ? ? ?//常用的瀏覽器都支持
? ? console.log(x);
? }
? a();
? console.log(x);
execScript與eval區(qū)別:
相同點(diǎn):
execScript與eval都可以接收一個(gè)字符串,若該字符串是表達(dá)式(expression),則執(zhí)行時(shí)將求得該表達(dá)式的值并返回;若該字符串是一個(gè)或多個(gè)語(yǔ)句(statements),則執(zhí)行時(shí)將運(yùn)行這些語(yǔ)句
不同點(diǎn):
① execScript是IE瀏覽器獨(dú)有;eval則是所有瀏覽器都支持
② execScript無(wú)論是在什么作用域(global/local)內(nèi)被調(diào)用,它所接受到的表達(dá)式(expression)或語(yǔ)句(statements)字符串都將在全局作用域內(nèi)執(zhí)行(global);eval則是在它被調(diào)用時(shí)所在的作用域內(nèi)運(yùn)行它所接受到的表達(dá)式(expression)或語(yǔ)句(statements)字符串
在不支持execScript函數(shù)的瀏覽器下實(shí)現(xiàn)在全局作用內(nèi)執(zhí)行字符串
function globalEval(data){
? if(data){
? ?(window.execScript || function(data){?window["eval"].call(window, data);?})(data);
? }
}
_______________________________________________________________________________________________
程序三大結(jié)構(gòu): 順序(判斷,不循環(huán)),分支和循環(huán)
1、分支結(jié)構(gòu)
什么是: 讓程序根據(jù)不同的條件執(zhí)行不同的操作
何時(shí): 只要讓程序根據(jù)不同的條件執(zhí)行不同的操作
如何:
1. 一個(gè)條件,一件事,滿(mǎn)足就執(zhí)行,不滿(mǎn)足就不執(zhí)行
? 如果操作簡(jiǎn)單: 短路:條件&&(操作1,操作2,操作3...)
? 如果操作復(fù)雜:?
if(條件){
? 操作1;
? 操作2;
? ...
}
2. 一個(gè)條件,二件事,二選一執(zhí)行:
? 如果僅兩個(gè)值二選一:
條件?值1:值2
? 如果操作簡(jiǎn)單: 三目運(yùn)算/三元運(yùn)算/條件運(yùn)算(三目運(yùn)算符的優(yōu)先級(jí)低于+)
條件?操作1:操作2 ? ? ? ? ?/*滿(mǎn)足條件執(zhí)行并返回操作1的值,不滿(mǎn)足則執(zhí)行并返回操作2的值*/
? 如果操作復(fù)雜:
if(條件){
? 操作1; ? ? ? ? ? ? ? ? ? ? ? /*滿(mǎn)足條件執(zhí)行*/
}else{
? 操作2; ? ? ? ? ? ? ? ? ? ? ?/*不滿(mǎn)足條件執(zhí)行*/
}
3. 多個(gè)條件,多件事,多選一執(zhí)行(嵌套)
如果多個(gè)值,多選一: 三目運(yùn)算(一般對(duì)齊)
? ? 條件1?值1:
? ? 條件2?值2:
? ? ? ...?... :
? ? 默認(rèn)值 ? ? ? ? ? ? ? ? ? ? ? ? ? /*強(qiáng)調(diào): 默認(rèn)值不能省略*/
如果操作簡(jiǎn)單: 三目運(yùn)算
? ? 條件1?操作1:
? ? 條件2?操作2:
? ? ? ...?... :
? ? 默認(rèn)操作? ? ? ? ? ? ? ? ? ? ?? /*強(qiáng)調(diào):默認(rèn)操作不能省略*/
如果操作復(fù)雜:if...else if結(jié)構(gòu)
if(條件1){
? ? 操作1 ? ? ? ? ? ? ? ? ? ?? /*如果當(dāng)前條件滿(mǎn)足,則不再向后執(zhí)行*/
}else if(條件2){ ? ? ? ? ? ? ? ?/*如果進(jìn)入條件2,暗示條件1不滿(mǎn)足*/
? ? 操作2
}else if(...){
? ? ...
}else{ ? ? ? ? ? ? ? ? ? ? /*如果沒(méi)有默認(rèn)操作,則else可省略,即什么也不做*/
? ? 默認(rèn)操作
}
簡(jiǎn)寫(xiě):如果if(...)一句話 ? ?else(...)一句話 ? ?后面只有一句話,可省略{}(if、else仍然要寫(xiě))
特殊: 如果所有條件都是等于比較,可簡(jiǎn)寫(xiě)為
switch(表達(dá)式){ ? ? ? ? /*先計(jì)算表達(dá)式的值,用表達(dá)式的值和每個(gè)case后的值做"全等==="比較*/
? case 值1: ? ? ? ? ? ? /*如果表達(dá)式的值全等于case后的值1*/
? 操作1; ? ? ? ? ? ? ? /*就執(zhí)行操作1*/
? case 值2:
? 操作2;
? ...
? default: ? ? ? ? ? ? ?/*如果所有case的值都不等于表達(dá)式的值*/
? 默認(rèn)操作; ? ? ? ? ?? /*則執(zhí)行默認(rèn)操作*/
} ? ? ? ? ? ? ? ? ? ? ? /*強(qiáng)調(diào): 最后一個(gè)default可省略*/
問(wèn)題: 只要前一個(gè)case滿(mǎn)足條件,則后續(xù)所有case都被執(zhí)行(而不會(huì)再判斷)
原因: switch是入口
解決: break;可終止當(dāng)前結(jié)構(gòu)繼續(xù)向后執(zhí)行,并退出switch
如何:每個(gè)case之間,都要加break;
判斷一個(gè)值是否為空可以直接用if(值){ },不加等號(hào),判斷是否為true
第四章*****************************************************************************************
2、循環(huán)loop
什么是: 讓程序反復(fù)執(zhí)行相同的代碼段
何時(shí): 只要讓程序反復(fù)執(zhí)行同一段代碼
如何: 三要素:
? 1. 循環(huán)條件: 讓循環(huán)可以繼續(xù)執(zhí)行的條件(只要條件滿(mǎn)足就反復(fù)執(zhí)行循環(huán),直到不滿(mǎn)足時(shí)退出循環(huán))
? 2. 循環(huán)變量: 在循環(huán)條件中用作比較和判斷的變量
????? 從幾開(kāi)始, 每次遞增/遞減幾,到幾結(jié)束
? 3. 循環(huán)體: 循環(huán)要反復(fù)執(zhí)行的代碼段
????? 幾乎都要修改循環(huán)變量,直到不滿(mǎn)足條件;若循環(huán)條件始終為true,則循環(huán)永遠(yuǎn)無(wú)法退出---死循環(huán)
包括: 3種:
while:
var 循環(huán)變量=初始值; ? ? ? ? ? ? /*聲明并初始化循環(huán)變量*/
while(循環(huán)條件){ ? ? ? ? ? ? ? ? ?/*當(dāng)滿(mǎn)足循環(huán)條件時(shí)*/
? 循環(huán)體;
? 修改循環(huán)變量;
}
? 何時(shí): 必須先滿(mǎn)足循環(huán)條件,才能執(zhí)行循環(huán)體時(shí)
do...while:
var 循環(huán)變量=初始值;
do{
? 循環(huán)體;
? 修改循環(huán)變量;
}while(循環(huán)條件); ? ? ? ? ? ? ? ?/*當(dāng)滿(mǎn)足循環(huán)條件時(shí)*/
? 何時(shí): 即使條件不滿(mǎn)足,也至少可以執(zhí)行一次時(shí)(先執(zhí)行,再判斷)
while VS do...while
如果第一次循環(huán)都滿(mǎn)足,兩者的輸出是完全一樣的
? while: 先驗(yàn)證條件后執(zhí)行
? do...while: 先執(zhí)行一次,再驗(yàn)證條件
如果第一次條件不滿(mǎn)足,則while是一次都不執(zhí)行,do while至少執(zhí)行一次
for:
for(var 循環(huán)變量=初始值;循環(huán)條件;修改循環(huán)變量){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? //循環(huán)條件中有,時(shí)(逗號(hào)表達(dá)式),以最后一個(gè)為準(zhǔn)
? 循環(huán)體; ? ? ? ? ? ? ? ? ? ? ? ? ? ?/*先執(zhí)行循環(huán)體,再修改循環(huán)變量*/
}
for循環(huán)和while循環(huán)的原理是完全一樣的(就是while循環(huán)的簡(jiǎn)化)
for vs while: 如果循環(huán)變量的變化有規(guī)律: 首先f(wàn)or
? ? ? ? ? ? ? 如果循環(huán)變量的變化沒(méi)有規(guī)律: 首先while
強(qiáng)調(diào):JavaScript中沒(méi)有塊級(jí)作用域
放在if/else if/else/for/while中的變量,出了塊(結(jié)構(gòu)),依然可用
c、c++、java等所有{}都認(rèn)為是塊級(jí)作用域,塊中的變量出了塊,不能使用
解決: 讓循環(huán)中的變量不要泄露到循環(huán)外
? ? ? 用let代替var: let聲明的變量?jī)H能在{}內(nèi)使用
簡(jiǎn)寫(xiě):var 可同時(shí)聲明并初始化多個(gè)變量,用,分隔
? ? ? 如果for循環(huán)下只有一句語(yǔ)句,可省略{}—————不建議,容易出歧義
? ? ? 如果for循環(huán)體中只有一句話,且很簡(jiǎn)單時(shí),for循環(huán)的修改循環(huán)變量中可先后執(zhí)行多個(gè)短小的操作,每個(gè)操作之間用逗號(hào)(,)分隔,省略循環(huán)體并加分號(hào)(;)結(jié)束——但不能改變?cè)瓉?lái)的執(zhí)行順序
_______________________________________________________________________________________________
break(中斷)?VS?continue(跳過(guò)):
break: 中斷并退出當(dāng)前循環(huán)
?? 何時(shí): 當(dāng)判斷條件非常復(fù)雜時(shí),就可用死循環(huán)+break的方式靈活控制循環(huán)退出——降低循環(huán)編寫(xiě)的難度
continue: 跳過(guò)本輪循環(huán),繼續(xù)執(zhí)行下一輪
?? 只要顛倒判斷條件,就可避免使用continue
強(qiáng)調(diào):break不能參與到任何簡(jiǎn)寫(xiě)中,必須獨(dú)立一句
嵌套循環(huán): 循環(huán)內(nèi),又執(zhí)行了另一個(gè)循環(huán)
步驟: 1. 截取片段找規(guī)律
? ? ? 2. 用外層循環(huán)反復(fù)調(diào)用規(guī)律的公式
_______________________________________________________________________________________________
二、數(shù)組類(lèi)型
什么是: 內(nèi)存中連續(xù)存儲(chǔ)多個(gè)數(shù)據(jù)的一塊存儲(chǔ)空間,再起一個(gè)名字
為什么: 便于維護(hù)和查找
? ? 程序=數(shù)據(jù)結(jié)構(gòu)+算法
??? 數(shù)據(jù)結(jié)構(gòu): 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)結(jié)構(gòu)
??? 算法: 解決問(wèn)題的步驟
??? 好的數(shù)據(jù)結(jié)構(gòu)可極大提高程序的執(zhí)行效率
何時(shí): 今后只要保存多個(gè)同一類(lèi)型的數(shù)據(jù)時(shí),都必須用數(shù)組
如何: 3件事(創(chuàng)建、賦值、取值)
創(chuàng)建: 3種:
1.創(chuàng)建空數(shù)組2種:
?? 何時(shí): 創(chuàng)建數(shù)組時(shí),暫時(shí)不知道數(shù)組內(nèi)容
? ? ? ? var arr=[]; ? ? ? ? ? ? ? ? /*[]創(chuàng)建數(shù)組*/
? ? ? ?var arr=new Array();
2. 創(chuàng)建數(shù)組同時(shí)初始化數(shù)組內(nèi)容:
?? 何時(shí): 創(chuàng)建數(shù)組時(shí)已知數(shù)組的內(nèi)容
???????var arr=[值1,值2,...];
? ? ? ?var arr=new Array(值1,值2,...);
3. 創(chuàng)建n個(gè)空元素的數(shù)組(只有一種):
?? 何時(shí): 創(chuàng)建數(shù)組時(shí),只知道數(shù)組元素個(gè)數(shù),暫時(shí)不知道數(shù)據(jù)的內(nèi)容
? ? ?? var arr=new Array(n);?? //()里若只有一個(gè)數(shù)字,創(chuàng)建空數(shù)組,否則設(shè)置其為數(shù)組的內(nèi)容
訪問(wèn):
? 元素:數(shù)據(jù)中每個(gè)數(shù)據(jù),都稱(chēng)為元素
? 下標(biāo)(index): 每個(gè)元素的存儲(chǔ)位置的序號(hào)。默認(rèn)都是數(shù)字,從0開(kāi)始,連續(xù)不重復(fù)
賦值: 將數(shù)據(jù)保存到數(shù)組的某個(gè)元素中
? ? ?arr[i]=新值; ? ? ? ? ? ? ? ?/*i:下標(biāo)index*/
取值: 數(shù)組中每個(gè)元素的用法和普通的變量完全一樣
? ? ? 數(shù)組也稱(chēng)為一組變量的集合,起一個(gè)統(tǒng)一的變量名
? ? ?arr[i]
console.log(arr[i]); ? ? ? /*輸出數(shù)組下標(biāo)為i的元素*/
console.dir(arr); ? ? ? ? /*查看內(nèi)存中arr的結(jié)構(gòu)和內(nèi)容*/
dir問(wèn)題:不會(huì)立刻輸出結(jié)果
? 只有手動(dòng)點(diǎn)擊三角時(shí),才動(dòng)態(tài)查找內(nèi)存中對(duì)象的最終結(jié)構(gòu),會(huì)打亂程序的輸出結(jié)果順序
解決: 如果想查看數(shù)組中間狀態(tài)的內(nèi)容:
console.log(String(arr)); ? ? ? ? /*對(duì)數(shù)組拍照*/
js的數(shù)組三個(gè)不限制:
? 1. 不限制元素的數(shù)據(jù)類(lèi)型
? 2. 不限制下標(biāo)越界:
? ?? 賦值時(shí)越界: 不會(huì)報(bào)錯(cuò)!在指定的新位置自動(dòng)創(chuàng)建新元素保存新值(添加后,數(shù)組的元素下標(biāo)不連續(xù)則稱(chēng)為稀疏數(shù)組)
? ?? 取值時(shí)越界: 不會(huì)報(bào)錯(cuò)! 僅返回undefined
? 3. 不限制元素個(gè)數(shù):?在任何時(shí)候,在任何位置添加新元素
.length屬性: 記錄數(shù)組中理論上的元素個(gè)數(shù)(不一定和實(shí)際元素個(gè)數(shù)相符)
特點(diǎn):.length 永遠(yuǎn)等于最后一個(gè)數(shù)字下標(biāo)+1(自動(dòng)維護(hù),不需要手動(dòng)修改)
? ? ? .length 永遠(yuǎn)指向最后一個(gè)元素的下一個(gè)新位置
.length可修改數(shù)組大小——縮容(如使arr.length=5,可獲取數(shù)組的前5個(gè)值)
用法注意:arr.length ? ? ? ? ? ? ? ? ?/*.length屬性屬于數(shù)組,不能脫離數(shù)組單獨(dú)使用*/
固定套路: 1. 獲取數(shù)組最后一個(gè)元素:arr[arr.length-1]
? ? ? ? ? 2. 獲得倒數(shù)第n個(gè)元素:arr[arr.length-n]
? ? ? ? ? 3. 末尾追加一個(gè)新元素:arr[arr.length]=新元素
? ? ? ? ? 4. 刪除數(shù)組最后一個(gè)元素(改小length) :arr.length-=1;
? ? ? ? ? 5. 刪除數(shù)組末尾倒數(shù)n個(gè)元素(改小length):arr.length-=n;
_______________________________________________________________________________________________
數(shù)組是引用類(lèi)型的對(duì)象
原始類(lèi)型的值: 修改新變量,不影響原變量—————按值傳遞
原始類(lèi)型:基本數(shù)據(jù)類(lèi)型:值直接保存在變量本地的數(shù)據(jù)類(lèi)型,Number/String/Boolean/Undefined/null
? ? 原因:將原變量中的實(shí)際值復(fù)制一個(gè)副本給對(duì)方
引用類(lèi)型的對(duì)象: 用新變量修改對(duì)象,等效于直接修改原對(duì)象。新舊變量都受影響(arr2=arr1)
引用類(lèi)型:值無(wú)法直接保存在變量本地的復(fù)雜數(shù)據(jù)類(lèi)型
? ? 原因:僅將原變量中的地址值復(fù)制給新變量,導(dǎo)致兩個(gè)對(duì)象共用同一個(gè)對(duì)象
? ? ? ? ? 新舊變量使用相同的地址值,引用同一個(gè)對(duì)象(地址值相同)
遍歷:
什么是: 依次對(duì)數(shù)組中每個(gè)元素執(zhí)行相同的操作
何時(shí): 只要對(duì)數(shù)組中每個(gè)元素執(zhí)行相同的操作時(shí)
如何:循環(huán)
for(var i=0;i<arr.length;i++){
? ? arr[i]? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/*當(dāng)前元素*/
}
var i=0,len=arr.length; i<len; i++? ? ?//可使用緩存代替arr.length,減少延遲,提高性能