1.變量作用域
- Javascript的變量的scope是根據方法塊來劃分的(也就是說以function的一對大括號{ }來劃分)。切記,是function塊,而for、while、if塊并不是作用域的劃分標準。
- 當全局變量跟局部變量重名時,局部變量的scope會覆蓋掉全局變量的scope,當離開局部變量的scope后,又重回到全局變量的scope,而當全局變量遇上局部變量時,怎樣使用全局變量呢?用window.globalVariableName。
- Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量),從而確定實變量的作用域。也就是變量提升。
2.變量提升
- JavaScript的函數定義有個特點,它會先掃描整個函數體的語句,把所有申明的變量“提升”到函數頂部。
3.嚴格模式
- strict模式,在JS代碼中的首行寫上:'use strict';
- 嚴格模式下,所有變量名沒有前綴var的都會報錯。
- 非嚴格模式下,沒有var前綴下,變量會隱式得申明為全局變量。(雖然是這么說的,但是我的調試結果,有加var和沒加var的scope是一樣的。)
4.幾大類型的判斷
- string: typeof varname === "string";
- number: typeof varname==="number"(特別注意NaN)
- undefined:typeof varname==="undefined" 或varname===undefined(注意雙引號)
- function: typeof varname==="function"或varname instanceof Function
- null: varname === null
- object: 對象的比較采用的內存地址值的比較(傳說是這樣的,具體等我看完犀牛書再說。)
- NaN: isNaN(varname);
注:這邊的typeof 是一個函數,返回值是一個string字符串
5.關于IF判斷語句注意點
- if中判斷條件如果沒有特別指定,比如用==,===,<,>這樣的,一律采用Boolean轉化。
- Boolean轉化中,除了"",NaN,undefined,null,0,false這六個其他一律為ture。
注:要特別注意"null","0","NaN"這樣的值為true。
6.類型轉化的問題
- pareInt和pareFolat的轉化規則:
1. 忽略字符串前面的空白字符,找到第一個非空白字符
2. 如果第一個字符不是-或者數字返回NaN
3. 如果是繼續解析,直到非數值模式為止
4. 0開頭會當做八進制,0x開頭會當做十六進制,但是可以指定第二個參數指定基數.
例如:
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5 - "+"法操作符:
1.在兩個操作數都是數字的時候,會做加法運算
2.兩個參數都是字符串或在有一個參數是字符串的情況下會把另外一個參數轉換為字符串做字符串拼接
3.在參數有對象的情況下會調用其valueOf或toString
4.在只有一個字符串參數的時候會嘗試將其轉換為數字
5.在只有一個數字參數的時候返回其正數值```
###7."短路"取值問題###
- 一般用于函數的參數取默認值,如下(0為默認值):
var s="name"||0;//s="name"
var s=undefined||0;//s=0;```
8."=="運算判斷###
- 如果兩個值類型相同,則執行嚴格相等的運算
- 如果兩個值的類型不同
1.如果一個是null,一個是undefined,那么相等
2.如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較
3.如果一個值是true/false則將其轉為1/0比較
4.如果一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換后比較
5.其它就不相等了```
###9.其他要注意的點###
- 浮點數是不精確的(由計算機的原理導致),所以如果要用浮點數做比較,最好使用減法然后結果小于某個較小的小數。
- String中的trim()方法在IE9以下無法使用,建議自己寫一個一樣功能的函數綁定到string上。(例如:```String.prototype.fun1=function (){ console.log("successful")};```)
- 空數組和null的typeof 為"object"
- void運算符的作用是執行一個表達式,然后返回undefined。
- 逗號運算符用于對兩個表達式求值,并返回后一個表達式的值。
- switch語句進行比較的時候是全等于(===)操作,不會發生類型轉換,切條件可以是任意表達式,比如某函數返回值。
- with語句很少用到,作用是把代碼的作用域設置到一個特定對象里。
###10.ES6的新點(關于基礎的)###
- 引入新數據結構map,用法:var map=new map();
- 引入新數據結構set,用法:var set=new set();
- for ... of循環(與for in的區別只遍歷集合自身的屬性)。
- rest參數 接受函數中多余的參數,比函數中內置的arguments方便。(使用方式...rest)。
- 為了解決塊級作用域,ES6引入了新的關鍵字let,用let替代var可以申明一個塊級作用域的變量。
- ES6標準引入了新的關鍵字const來定義常量,const與let都具有塊級作用域。