變量
由于是動(dòng)態(tài)類型語言挑格,所以變量定義了以后蜡励,可以隨意更改類型
變量聲明
常用的聲明關(guān)鍵字有var
/let
,下面來說明兩者的區(qū)別:
-
var
:聲明一個(gè)變量漱挚,沒有代碼塊作用域的束縛(函數(shù)內(nèi)部聲明則為局部變量),可重復(fù)聲明渺氧,自從ES6出了let
關(guān)鍵字以后旨涝,盡量不要用var
進(jìn)行定義 -
let
:在當(dāng)前代碼塊聲明一個(gè)變量,有作用域的概念侣背,并且不能重復(fù)聲明
舉例:
var a = 1;
var a = "sss";
// 可以隨意修改類型白华,并且可以重復(fù)聲明
let b = 2;
let b = 3;
// 這句會(huì)報(bào)錯(cuò):不能重復(fù)聲明b
注:
變量在定義時(shí)也可以不加關(guān)鍵字慨默,兩者的區(qū)別:加關(guān)鍵字代表在當(dāng)前作用域的聲明局部變量,不加關(guān)鍵字定義的話弧腥,如果變量原來存在厦取,則進(jìn)行賦值操作,如果不存在管搪,則定義一個(gè)全局變量(相當(dāng)于window.xxx = yyy;
)
常量
常量定義了以后虾攻,如果是一般數(shù)據(jù)類型(如數(shù)字/字符串等)則不能再進(jìn)行修改,而引用類型(如數(shù)組/對(duì)象等)更鲁,則可以改變內(nèi)容
聲明常量
使用 const
關(guān)鍵字聲明霎箍,舉例:
const a = {};
a.x = 1;
// 可以修改引用類型常量?jī)?nèi)容
const b = 1;
b = "sss";
// 修改基本數(shù)據(jù)類型常量會(huì)報(bào)錯(cuò)
數(shù)據(jù)類型
number
數(shù)字,包括整數(shù)澡为、小數(shù)等(基本數(shù)據(jù)類型)
string
字符串(基本數(shù)據(jù)類型)
boolean
布爾類型漂坏,true
、false
(小寫)缀壤,其中變量里的數(shù)字0
樊拓、空字符串''
、空對(duì)象(null
)和undefined
是false塘慕,其他都是true(基本數(shù)據(jù)類型)
object
對(duì)象(引用類型)筋夏,舉例:
var o = {x:1};
function
函數(shù)
undefined
就是只定義還沒賦值的變量,這個(gè)如果直接放在判斷語句中就屬于false图呢,其他類型都是true(除了bool的false和0以外)条篷,比如:
var a
if(a)
{
alert("true")
}
else
{
alert("false")
}
結(jié)果顯示為false
null
空
數(shù)據(jù)轉(zhuǎn)型
獲取數(shù)據(jù)類型
通過typeof 變量名
查看,舉例::
let a = 10
typeof a
// number
字符串轉(zhuǎn)整數(shù)
parseInt()
蛤织,該方法是從左到右取到第一個(gè)不是數(shù)字的內(nèi)容為止赴叹,所以比如:parseInt('12b34')
,結(jié)果就是:12
字符串轉(zhuǎn)小數(shù)
parseFloat()
注:
當(dāng)對(duì)不含數(shù)字的字符串強(qiáng)制轉(zhuǎn)型int時(shí)或者數(shù)字和非數(shù)字進(jìn)行操作時(shí)指蚜,會(huì)出現(xiàn)NaN
(not a number)乞巧,如果用typeof會(huì)發(fā)現(xiàn)NAN類型竟然還是number,而且NaN之間不相等摊鸡,舉例:
b = parseInt('s') //是NaN绽媒,c同樣
c = parseInt('a')
b == c
結(jié)果為:false
所以如果要判斷函數(shù)是不是NaN時(shí)不能用==
來判斷,有一個(gè)專門的isNaN()
方法判斷
eval
可以把一個(gè)變量轉(zhuǎn)成他本應(yīng)該是的類型免猾,比如:'1'+'1'
因?yàn)槭莾蓚€(gè)字符串相加是辕,所以結(jié)果是'11',而eval能把他們轉(zhuǎn)成本應(yīng)該是的number型猎提,所以eval('1')+eval('1')
結(jié)果就是2获三。
其還能做些更可怕的比如把一段本該是語句的字符串變成語句來執(zhí)行,比如下面這句:
eval('document.body.style.background = "blue"')
結(jié)果這句話就變成了語句執(zhí)行,最后背景就變藍(lán)了
運(yùn)算符
==/===
這兩種都是判斷等于疙教,主要區(qū)別在于第一種會(huì)將兩邊的值轉(zhuǎn)換成同一類型然后進(jìn)行判斷棺聊,第二種則不轉(zhuǎn)換類型直接判斷,相當(dāng)于其他語言的==贞谓,舉例:
var a = 5;
var b = '5';
a == b; //返回true躺屁,其將5轉(zhuǎn)換成string型,然后才比較
a === b; //返回false经宏,直接比較
上面兩個(gè)等于對(duì)應(yīng)的不等于分別是:!=
/!==
,即轉(zhuǎn)換后不等的和不轉(zhuǎn)換不等的
基本語法
if
if(條件)
{
語句
}
else
{
語句
}
條件?語句1:語句2
三目運(yùn)算符驯击,當(dāng)條件符合時(shí)執(zhí)行語句1烁兰,否則執(zhí)行語句2,相當(dāng)于if的簡(jiǎn)化版
while
while(條件)
{
語句
}
可選鏈
一個(gè)對(duì)象如果某些屬性不存在徊都,我們直接調(diào)用將可能出現(xiàn)問題沪斟,例如:
a = {};
// 假設(shè)a中的b如果存在則是個(gè)函數(shù),我們就會(huì)調(diào)用它暇矫,這里因?yàn)閎沒有定義主之,所以是undefined,結(jié)果就會(huì)報(bào)錯(cuò)
a.b();
所以我們就可能會(huì)先校驗(yàn)是否存在對(duì)應(yīng)屬性李根,如下:
if (a.b) {
b();
}
但如果是嵌套的情況槽奕,可能代碼就比較多了,例如下面:
if (a.b) {
if (a.b.c) {
if (a.b.c.d) {
a.b.c.d();
}
}
}
此時(shí)我們可以通過return
或者邏輯運(yùn)算符的短路方式來優(yōu)化代碼房轿,從而避免過深的嵌套粤攒,例如下面:
if (!a.b) return;
if (!a.b.c) return;
if (!a.b.c.d) return;
a.b.c.d();
但是使用可選鏈能夠更大程度地簡(jiǎn)化代碼,例如上面的代碼可以簡(jiǎn)化如下:
a?.b?.c?.d();
因?yàn)榭蛇x鏈自帶短路特性囱持,如果某一層屬性返回不存在夯接,則不會(huì)繼續(xù)往下繼續(xù)執(zhí)行
for
有幾種寫法:
- 常用寫法:
for(;;)
{
...
}
遍歷對(duì)象key寫法:
for(let k in xxx)
{
...
}
遍歷對(duì)象value寫法:
for(let v of xxx)
{
...
}
switch
switch(變量)
{
case x:
語句
case y:
語句
…
default:
語句
}
舉例:
switch(fun.arguments.length) //判斷函數(shù)fun接收的參數(shù)個(gè)數(shù)
{
case 0 : //參數(shù)個(gè)數(shù)為0
return 0
case 1 :
return 1
default :
return "error"
}
異常
try
異常,格式和java差不多
try{
可能異常語句
}
catch(Exception)
{
拋出異常
}
補(bǔ)充
可以賦值語句里再賦值
舉例:
a = window.b || (window.b = 10)
相當(dāng)于:
if (window.b) {
a = window.b;
} else {
window.b = 10;
a = window.b;
}
變量和函數(shù)提升
valueOf/toString隱式調(diào)用
https://www.cnblogs.com/tincyho/p/9582680.html
嚴(yán)格模式
嚴(yán)格模式下的代碼必須遵循一定的規(guī)范才能夠正常執(zhí)行纷妆,并且如this
在非嚴(yán)格模式下指向window
對(duì)象盔几,而嚴(yán)格模式下為undefined
定義
在開頭加上:"use strict"
注:
嚴(yán)格模式只會(huì)對(duì)其當(dāng)前作用域及其子作用域有影響,例如在函數(shù)里定義使用嚴(yán)格模式掩幢,那么函數(shù)外部不遵循也可以
分號(hào)補(bǔ)全機(jī)制
JS解釋器有一個(gè)Semicolon Insertion規(guī)則逊拍,它會(huì)按照一定規(guī)則,在適當(dāng)?shù)奈恢醚a(bǔ)充分號(hào)粒蜈,例如其中幾條自動(dòng)加分號(hào)的規(guī)則:
- 當(dāng)有換行符(包括含有換行符的多行注釋)顺献,并且下一個(gè)token沒法跟前面的語法匹配時(shí),會(huì)自動(dòng)補(bǔ)分號(hào)
- 當(dāng)有
}
時(shí)枯怖,如果缺少分號(hào)注整,會(huì)補(bǔ)分號(hào)- 程序源代碼結(jié)束時(shí),如果缺少分號(hào),會(huì)補(bǔ)分號(hào)
例如下面:
function b() {
return
{
a: 'a'
};
}
console.log(b()); // undefined
會(huì)被解析成:
function b() {
return;
{
a: 'a'
};
}
console.log(b()); // undefined