如題罚渐,讀小紅書時捏膨,說到的特殊字面量秧均、特殊返回值、特殊屬性等特殊情況太多了号涯,我這腦子能記住就見鬼了目胡。比如:
javascript 包含以下幾個部分
- 核心(ECMAScript)-- 核心功能
- 文檔對象模型(DOM)-- 與網(wǎng)頁內(nèi)容交互
- 瀏覽器對象模型 (BOM)-- 與瀏覽器交互
script元素
包含8個屬性,均是可選的链快,其中 :
-
async
和defer
兩個屬性在下載時異步誉己,在執(zhí)行時阻塞,defer
可延時執(zhí)行域蜗,僅用在外部文件巨双; -
type
默認值是text/javascript
噪猾,可以不寫; - 為避免延遲和白屏,一般放在
</body>
上面筑累;
<script>
function sayHi(){
console.log('hello world');
}
</script>
文檔模式
HTML5以前有很多文檔模式:標準模式和混雜模式袱蜡;
HTML5以后,都用一種慢宗,且每個頁面都要寫坪蚁,如下:
<!DOCTYPE html>
區(qū)分大小寫
ECMAScript中的一切都區(qū)分大小寫,不論是變量婆廊、函數(shù)名還是操作符迅细;
即:變量test和變量Test是兩個不同變量;
標識符
所謂標識符淘邻,就是變量、函數(shù)湘换、屬性或參數(shù)的名稱宾舅;
規(guī)范:
- 首字符必須是字母、下劃線(_)和美元符($)彩倚;
- 其他字符可以是字母筹我、下劃線、美元符和數(shù)字帆离,因為數(shù)字開頭會引起歧義蔬蕊;
- 命名方式是駝峰大小寫形式(不是強制的),如:
strName
哥谷、myCar
等岸夯; - 關鍵字、保留字们妥、
true
猜扮、false
和null
不能作標識符;
變量聲明
變量可以保存任何類型的數(shù)據(jù)监婶,變量聲明用:var 旅赢、let 和 const;
注意:
- var 聲明的作用域惑惶;在函數(shù)內(nèi)聲明的var煮盼,在函數(shù)執(zhí)行完后會被銷毀;函數(shù)作用域带污;
- var 聲明提升僵控,所以多處聲明會在作用域頂部自動合并;
- let 聲明的范圍是塊作用域刮刑,且不會提升喉祭;
- let 在同作用域中不允許二次聲明 會報: SyntaxError 养渴;
- let 在全局聲明的變量不會成為
window
對象的屬性,var聲明的會(window.name
)泛烙; - const 聲明時就要初始化變量理卑,且不能修改;如果聲明的是對象蔽氨,那么修改對象的屬性又是可以的藐唠;
- const 不能用來聲明迭代變量(因為迭代變量會自增)
所以,聲明風格:
- 不使用var 鹉究;用let 和 const 足夠了宇立;
- 優(yōu)先使用 const ,let 次之自赔;const強制保持變量不變妈嘹,需要變量迭代時再使用let;
數(shù)據(jù)類型
ECMAScript 的數(shù)據(jù)類型很靈活绍妨,一種數(shù)據(jù)類型可以當作多種數(shù)據(jù)類型來使用润脸,靈活反而容易糊涂;
- 六種簡單數(shù)據(jù)類型:
Undefined
他去、Null
毙驯、Boolean
、Number
灾测、String
和Symbol
(符號)爆价; - 一種復雜數(shù)據(jù)類型:
Object
(對象);
分解:
-
Undefined
類型只有一個值媳搪,就是特殊值:undefined
铭段,使用var和let 聲明了變量又沒初始化時,就是這個值蛾号;沒有聲明的變量輸出會報錯稠项,所以建議變量都要聲明; -
Null
類型也只有一個值鲜结,就是特殊值:null
展运;null值表示一個空對象指針,所以typeof(null)
返回object
精刷;undefined
由null
派生而來拗胜,所以(null == undefined)
返回true
; - undefined 和 null 都是假值怒允,
Boolean(undefined)
和Boolean(null)
都是false
埂软; -
Boolean
類型有兩個字面值:true
和false
;任何數(shù)據(jù)類型的都能調(diào)用Boolean()
,除了上面的undefined
和null
外勘畔,''(空字符串)所灸、0和NaN 調(diào)用Boolean()
時都為false
,其他都為true
炫七; -
Number
類型表示整數(shù)和浮點數(shù)爬立;3.125e7
是科學記數(shù)法;用二進制計算浮點數(shù)會不精確万哪,導致 0.1+0.2不等于 0.3侠驯;有個特殊的數(shù)值是NaN
(意思是:Not a Number,即不是數(shù)值奕巍,例如:0/0 返回NaN
吟策,而 5/0 返回Infinity
,即無窮)的止,NaN
不等于自身檩坚,即(NaN == NaN)
返回false
; - 數(shù)值轉(zhuǎn)換函數(shù)有三個:
Number()
冲杀、parseInt()
和parseFloat
效床;用法上有細微且明顯的區(qū)別; -
String
類型表示 Unicode 字符序列权谁,可用雙引號("")、單引號(‘’)和反引號(``)標示憋沿;字符串一旦創(chuàng)建就不可變旺芽,要修改變量中的字符串值,須先銷毀原始字符串辐啄,后將新值保存到該變量采章; - 字符串轉(zhuǎn)換有兩種方式:第一種是
toString()
方法 ,形如:abc.toString()
壶辜,幾乎所有值都有toString()
方法悯舟,除了null
和undefined
;第二種是String()
函數(shù)砸民,使用時抵怎,如果當前值有toString()
方法就調(diào)用該方法 ,如果沒有岭参,如null
和undefined
反惕,則返回null
和undefined
。 -
symbol
符號演侯,符號是原始值姿染,且符號實例是唯一、不可變的秒际。符號的用途是確保對象屬性使用唯一標識符悬赏,不會發(fā)生屬性沖突的危險狡汉。這個類型不太好理解。 -
Object
類型闽颇,ECMAScript 中的對象是一組數(shù)據(jù)和功能的集合(很抽象)盾戴;用new
操作符來創(chuàng)建;通過創(chuàng)建Object
類型的實例來創(chuàng)建對象进萄,然后再給對象添加屬性和方法捻脖,形如:let o= new Object();
; - Object 是派生其他對象的基類中鼠,Object類型的所有屬性和方法在派生的對象上同樣存在可婶,這些屬性和方法是:
constructor
、hasOwnProperty()
援雇、isPrototypeOf()
矛渴、propertyIsEnumerable()
、toLocalString()
惫搏、toString()
和valueOf()
具温;因為Object
是所有對象的基類,所以任何對象都有這些屬性和方法筐赔。
操作符
可用于操作數(shù)據(jù)值的操作符铣猩,包括數(shù)學操作符、位操作符茴丰、關系操作符和相等操作符达皿;
操作符可用于各種值,包括:字符串贿肩、數(shù)值峦椰、布爾值甚至是對象;
在應用給對象時汰规,操作符會調(diào)用valueOf()
和toString()
方法來取得可以計算的值汤功;
分解:
- 一元操作符:前綴,++num 溜哮、--num滔金;后綴,num++ 茬射、num--鹦蠕;后綴在混合計算時的遞增(或遞減)會先計算后遞增(或遞減);
- 一元加和減:
+
還有拼接的意思在抛;-
取負值钟病;運算非數(shù)值時會先轉(zhuǎn)換數(shù)據(jù)類型; - 位操作符:按位非(
~
)、按位與(&
)肠阱、按位或(|
)票唆、按位異或(^
)、左移(<<
)和右移(>>
屹徘、>>>
)走趋; - 布爾運算符:邏輯非(
!
)、邏輯與(&&
)噪伊、邏輯或(||
)簿煌,優(yōu)先級!
>&&
>||
;有短路操作的情形鉴吹; - 乘性操作符:乘法操作符(
*
)姨伟、除法操作符(/
)、取模操作符(%
)和指數(shù)操作符(**
)豆励; - 關系操作符:大于(
>
)夺荒、小于(<
)、小于等于(<=
)良蒸、大于等于(>=
)這些操作符返回布爾值技扼; - 相等操作符:等于(
==
)、不等于(!=
)嫩痰、全等(===
)和不全等(!==
)剿吻; - 條件操作符:(
?:
),如:let max = (num1 > num2) ? num1 : num2;
串纺; - 賦值操作符:賦值號
=
和橙、+=
、-=
造垛、*=
、/=
晰搀、%=
等等五辽; - 逗號操作符:
let num1 = 1, num2 = 2, num3 = 3;
;
操作符的優(yōu)先級
運算優(yōu)先級從上往下外恕,其中邏輯運算符
!
的優(yōu)先級更高杆逗,且&&
優(yōu)先級高于||
:
- 1,
()
優(yōu)先級最高鳞疲; - 2罪郊,一元運算符:
++
,--
尚洽,!
; - 3悔橄,算數(shù)運算符:先
*
,/
,%
癣疟,后+
挣柬,-
; - 4睛挚,關系運算符:
>
邪蛔,<
,>=
扎狱,<=
侧到; - 5,相等運算符:
==
淤击,===
匠抗,!=
,!==
遭贸; - 6戈咳,邏輯運算符:先
&&
,后||
壕吹; - 7著蛙,賦值運算符:
=
;
if 語句: if -- else if -- else
只有一行代碼也要用語句塊耳贬;
if (i > 25) {
console.log("Greater than 25.");
} else if (i < 0) {
console.log("Less than 0.");
} else {
console.log("Between 0 and 25, inclusive.");
}
do while 語句
是一種后測試循環(huán)語句(至少執(zhí)行一次)踏堡,即循環(huán)體中的代碼執(zhí)行后才會對退出條件進行求值;
let i = 0;
do{
i+=2;
}while(i<10)
while 語句
是先測試循環(huán)語句咒劲,即先檢測退出條件顷蟆,再執(zhí)行循環(huán)內(nèi)的代碼;
let i = 0;
while(i<10){
i+=2;
}
for 語句
先測試語句腐魂,增加了進入循環(huán)之前的初始化代碼帐偎,和循環(huán)執(zhí)行后要執(zhí)行的表達式;
const count = 10;
for(let i=0; i<count; i++){
console.log(i);
}
無法通過while實現(xiàn)的邏輯蛔屹,也無法使用for實現(xiàn)削樊;
for - in
用于枚舉對象中的非符號鍵屬性;
for(const propName in window){
console.log(propName); // 多達224個
}
- ECMAScript 中對象的屬性是無序的兔毒,所有可枚舉的屬性都返回一次漫贞,但順序因瀏覽器而異;
- 循環(huán)要迭代的變量是
null
或undefined
,則不執(zhí)行循環(huán)體;
for - of
用于遍歷可迭代對象的元素罐栈;
for (const el of [1,2,3,4]){
console.log(el); // 1,2,3,4
}
上面例子,顯示當前數(shù)組所有元素谴蔑,for-of循環(huán)會按照可迭代對象的 next()
方法產(chǎn)生值的順序迭代元素豌骏。
break 和 continue 語句
break
立即退出循環(huán),強制執(zhí)行循環(huán)后的下一條語句树碱;
continue
立即退出循環(huán)肯适,但會再次從循環(huán)頂部開始執(zhí)行;
先看break實例
let num = 0;
for (let i = 1; i < 10; i++) {
if (i % 5 == 0) {
break;
}
num++
}
console.log(num); // 4
再看continue實例
let num = 0;
for (let i = 1; i < 10; i++) {
if (i % 5 == 0) {
continue;
}
num++
}
console.log(num); // 8
switch語句
case 控制分支條件成榜,break跳出switch語句框舔;如果沒有break,代碼會繼續(xù)匹配下一個條件赎婚;default 關鍵字是在條件都不滿足時指定默認執(zhí)行的語句刘绣。
swicth(i){
case 25:
console.log('25');
break;
case 35:
console.log('35');
break;
case 45:
console.log('45');
break;
defalut:
cosole.log('other');
}
注意
- 最好給每個條件后加 break語句,否則會連續(xù)匹配多個條件挣输,除非確實需要這樣纬凤;
- switch 條件的值,可以不是數(shù)值撩嚼,可以是所有數(shù)據(jù)類型停士,如:字符串甚至對象;
- switch 語句在比較條件時使用全等操作符完丽,因此不會強制轉(zhuǎn)換數(shù)據(jù)類型恋技;
函數(shù)
可以封裝語句,可在任何地方逻族、任何時間執(zhí)行蜻底;
function sayHi(name,msg){
console.log('hello' + name + ',' + msg);
}
sayHi('Jack','How r u today?')
function sum(num1,num2){
return num1 + num2;
}
const res = sum(5,10); // 15
注意
- 碰到
return
語句,函數(shù)會立即停止執(zhí)行并退出聘鳞,因此return
語句后面的代碼不會執(zhí)行薄辅; - 最佳實踐是要么有返回值,要么沒有返回值抠璃,在某個條件下返回值的函數(shù)會帶來麻煩站楚;
- 不返回值的函數(shù),實際上會返回特殊值: undefined;