變量聲明(var const let)
var
-
聲明范圍是 函數(shù)作用域,變量聲明會 “提升”,范圍內(nèi)重復(fù)變量的聲明會在代碼執(zhí)行的一開始被合并成一個聲明
var a = 1; var a; console.log(a); // 1 全局聲明時會成為window對象的屬性
for循環(huán)定義的迭代變量會滲透到循環(huán)外,引用始終為初始聲明的變量
let、const
- 聲明范圍是 代碼塊,范圍內(nèi)無法重復(fù)聲明
- 暫時性死區(qū):無聲明“提升”,聲明前引用會報錯(嚴(yán)格來講也會提升,但由于暫時性死區(qū),實際不能在聲明之前使用,因此從寫代碼角度來說,兩種提升不一樣)
- for循環(huán)時,每次循環(huán)js引擎會在后臺為每個迭代聲明一個新的迭代變量
- const聲明時必須初始化變量,且變量引用不可修改
數(shù)據(jù)類型
- 六種基礎(chǔ)數(shù)據(jù)類型:String、Number、Boolean、Null、Undefined、Symbol
- 一種復(fù)雜數(shù)據(jù)類型:Object
typeof 操作符
- 用于判斷變量的數(shù)據(jù)類型
- 返回值有:string、number、boolean、undefined、symbol、object、function
- null 被認(rèn)為是空對象的引用,因此
typeof null === 'object' - 函數(shù)嚴(yán)格來講也是 Object,但函數(shù)也有自己特殊的屬性,因此需要用typeof區(qū)分函數(shù)與一般Object
Undefined
- 任何聲明未賦值的變量值都是undefined
- undefined值主要用于比較及明確區(qū)分于null
Null
- 建議用null來初始化對象變量,方便使用時判斷是否已經(jīng)重新賦值
- undefined由null派生而來,因此
null == undefined
Boolean
- falsy值:false,空字符串,0,NaN,undefin,null
Number
- 轉(zhuǎn)換正整數(shù)優(yōu)先使用
parseInt(),parseInt()更關(guān)注字符串是否含數(shù)值,Number()函數(shù)轉(zhuǎn)換字符串規(guī)則相對復(fù)雜且有點反常規(guī)
String
- 轉(zhuǎn)換字符串優(yōu)先使用
String(),String()會先嘗試調(diào)用入?yún)⒌?code>toString() 方法,由于null和undefined沒有toString()方法,String()方法會返回他們本身
Symbol
Symbol(符號) 實例是唯一且不可變更得的,用于是作為對象屬性的唯一標(biāo)識符,不會出現(xiàn)屬性沖突-
通過直接調(diào)用
Symbol()函數(shù)創(chuàng)建Symbol實例(為了避免創(chuàng)建符號包裝對象,不支持new創(chuàng)建),可以傳入一個字符串作為符號描述,但這個字符串與符號的定義或標(biāo)識完全無關(guān)const symbolA1 = Symbol('a') const symbolA2 = Symbol('a') console.log(symbolA1 === symbolA2) // false -
需要復(fù)用符號時,可通過
Symbol.for()在全局符號注冊表中創(chuàng)建或復(fù)用符號Symbol.for('foo') // 該方法調(diào)用時,若全局符號注冊表已存在該符號,則引用,否則新建 const symbolA1 = Symbol.for('a') const symbolA2 = Symbol.for('a') console.log(symbolA1 === symbolA2) // true // 注意,Symbol()直接定義的符號并不在全局符號注冊表中 const symbolA3 = Symbol('a') console.log(symbolA1 === symbolA3) // false -
ES6中有一批內(nèi)置符號,它們以Symbol工廠函數(shù)字符串屬性的形式存在,例如
for of會在相關(guān)對象上使用Symbol.iterator屬性,我們可以重新定義該屬性以改變默認(rèn)行為;在ECMAScript規(guī)范中,這類符號的名稱前綴為
@@,Symbol.iterator等同于@@iterator
Object
- ECMAScript中其他類的基類,每個Object實例都有以下方法
- constructor 構(gòu)造函數(shù) 用于創(chuàng)建對象實例
-
hasOwnProperty(propertyName)用于判斷屬性是否在實例上 -
isPrototypeOf(obj)判斷一個對象是否是另一個對象原型 - toString 返回對象字符串表示
- toLocaleString 返回對象本地化字符串表示
- valueOf 返回對象字符串/數(shù)值/布爾值表示
-
propertyIsEnumerate(propertyName)判斷給定的屬性是否可用(for - in) 枚舉
操作符
-
++ -- + -一元操作符都可以用于類型轉(zhuǎn)換,先轉(zhuǎn)換,后計數(shù) - 位操作符
~ 非;& 與;| 或;<< 有符號左移;>> 有符號右移;<<< 無符號左移;>>> 無符號右移 - 布爾操作符
! 非&& 與|| 或注意短路運算 -
* 乘;/ 除有余數(shù);% 取模只取余數(shù); -
** 指數(shù)運算3 ** 2 === 9
語句
-
for in遍歷對象的非Symbol鍵屬性 -
for of遍歷可迭代對象的元素 (值) -
break退出循環(huán) 執(zhí)行循環(huán)后的語句 -
continue退出本輪循環(huán) 從頂部開始執(zhí)行下一輪循環(huán)