一、基礎(chǔ)概念
1.原始類型:boolean、null、undefined、number、string、symbol
2.字面量:一般固定值稱為字面量,如 3.14。
- 數(shù)字(Number)字面量有整數(shù)字面量,浮點數(shù)字面量,Infinity,NaN
- 字符串(String)字面量 可以使用單引號或雙引號
- 表達式字面量
- 數(shù)組(Array)字面量
- 對象(Object)字面量
- 函數(shù)(Function)字面量
3.JavaScript 語句標識符
| 語句 | 描述 |
|---|---|
| break | 用于跳出循環(huán)。 |
| catch | 語句塊,在 try 語句塊執(zhí)行出錯時執(zhí)行 catch 語句塊。 |
| continue | 跳過循環(huán)中的一個迭代。 |
| do ... while | 執(zhí)行一個語句塊,在條件語句為 true 時繼續(xù)執(zhí)行該語句塊。 |
| for | 在條件語句為 true 時,可以將代碼塊執(zhí)行指定的次數(shù)。 |
| for ... in | 用于遍歷數(shù)組或者對象的屬性(對數(shù)組或者對象的屬性進行循環(huán)操作)。 |
| function | 定義一個函數(shù) |
| if ... else | 用于基于不同的條件來執(zhí)行不同的動作。 |
| return | 退出函數(shù) |
| switch | 用于基于不同的條件來執(zhí)行不同的動作。 |
| throw | 拋出(生成)錯誤 。 |
| try | 實現(xiàn)錯誤處理,與 catch 一同使用。 |
| var | 聲明一個變量。 |
| while | 當條件語句為 true 時,執(zhí)行語句塊。 |
4.變量提升:函數(shù)聲明和變量聲明總是會被解釋器悄悄地被"提升"到方法體的最頂部。也就是說,變量可以先使用后聲明。
注意:JavaScript 只有聲明的變量會提升,初始化的不會。
5.閉包:閉包是一種保護私有變量的機制,在函數(shù)執(zhí)行時形成私有的作用域,保護里面的私有變量不受外界干擾。直觀的說就是形成一個不銷毀的棧環(huán)境。
通俗的講,在函數(shù)A里,聲明了變量a,函數(shù)A內(nèi)嵌了一個函數(shù)B,函數(shù)B訪問了變量a,最后返回函數(shù)B,函數(shù)B就是一個閉包。
示例1:
function A(){
var a="hello world"
function B(){
console.log(a);
}
return B;
}
var c = A();
c();//hello world
閉包有3個特性:
①函數(shù)嵌套函數(shù)
②函數(shù)內(nèi)部可以引用函數(shù)外部的參數(shù)和變量
③參數(shù)和變量不會被垃圾回收機制回收
示例2:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
// 計數(shù)器為 3
6.深淺拷貝:
示例:
let a={name:'hello'}
let b=a
a.name="world"
console.log(b.name) // world
上述例子中,將a拷貝到b其實是拷貝了地址,一旦對象a的name屬性發(fā)生改變,對象b的name屬性也會改變,為了解決以上問題,引出了淺拷貝和深拷貝。
如何實現(xiàn)深淺拷貝
- 淺拷貝:
Object.assign({}, a)
展開運算符... - 深拷貝:
JSON.parse(JSON.stringify(obj))
7.立即執(zhí)行函數(shù)
見閉包的示例2代碼。
二、常用的方法使用示例
1.indexOf :返回某個指定的字符串值在字符串中首次出現(xiàn)的位置。如果要檢索的字符串值沒有出現(xiàn),則該方法返回 -1。
stringObject.indexOf(searchvalue,fromindex)
2.lastIndexOf:返回一個指定的字符串值最后出現(xiàn)的位置,在一個字符串中的指定位置從后向前搜索。如果要檢索的字符串值沒有出現(xiàn),則該方法返回 -1。
stringObject.lastIndexOf(searchvalue,fromindex)
3.splice:從數(shù)組中添加/刪除項目,然后返回被刪除的項目。
arrayObject.splice(index,howmany,item1,.....,itemX)。
示例:
<!doctype html>
<html>
<body>
<script >
let arr1 = [1,2,3,4]
let arr2 = [1,2,3,4]
arr1.splice(2,0,"88")
document.write(arr1 + "<br />")
arr2.splice(2,1,"88")
document.write(arr2 + "<br />")
</script>
</body>
</html>
輸出結(jié)果:
1,2,88,3,4
1,2,88,4
4.slice:從已有的數(shù)組中返回選定的元素。該方法并不會修改數(shù)組,而是返回一個子數(shù)組。
arrayObject.slice(start,end)
5.split:用于把一個字符串分割成字符串數(shù)組。
stringObject.split(separator,howmany)
示例:
<script >
var str="1,2,3,4,5"
document.write(str.split(",") + "<br />")
document.write(str.split(",",3))
</script>
輸出結(jié)果:
1,2,3,4,5
1,2,3
6.replace:用于在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。
stringObject.replace(regexp/substr,replacement)
示例:
<script >
var str="hello world!hello,123"
document.write(str.replace(/hello/g, "你好"))
</script>
輸出結(jié)果:
你好 world!你好,123
More
7.substr:在字符串中抽取從 start 下標開始的指定數(shù)目的字符。
stringObject.substr(start,length)
8.substring:用于提取字符串中介于兩個指定下標之間的字符。
stringObject.substring(start,stop)
注意:與 slice() 和 substr() 方法不同的是,substring() 不接受負的參數(shù)
9.toLocaleLowerCase();toLowerCase()轉(zhuǎn)小寫
10.toLocaleUpperCase();toUpperCase()轉(zhuǎn)大寫
11.trim:用于刪除字符串的頭尾空格。
string.trim()
12.map、filter、reduce
- map:生成一個新數(shù)組,遍歷原數(shù)組,將每個元素拿出來做一些變換然后放入到新的數(shù)組中。另外 map 的回調(diào)函數(shù)接受三個參數(shù),分別是當前索引元素,索引,原數(shù)組
[1, 2, 3].map(v => v + 1) // -> [2, 3, 4]
- filter:生成一個新數(shù)組,在遍歷數(shù)組的時候?qū)⒎祷刂禐?true 的元素放入新數(shù)組,我們可以利用這個函數(shù)刪除一些不需要的元素。
let array = [1, 2, 4, 6]
let newArray = array.filter(item => item !== 6)
console.log(newArray) // [1, 2, 4]
- reduce:可以將數(shù)組中的元素通過回調(diào)函數(shù)最終轉(zhuǎn)換為一個值。它接受兩個參數(shù),分別是回調(diào)函數(shù)和初始值。
const arr = [1, 2, 3]
const sum = arr.reduce((acc, current) => acc + current, 0)
console.log(sum)
13.reverse:reverse() 方法用于顛倒數(shù)組中元素的順序
arrayObject.reverse()
14、every、some、join
- every:用于檢測數(shù)組所有元素是否都符合指定條件。
every() 方法使用指定函數(shù)檢測數(shù)組中的所有元素:
如果數(shù)組中檢測到有一個元素不滿足,則整個表達式返回 false ,且剩余的元素不會再進行檢測。
如果所有元素都滿足條件,則返回 true。
語法:array.every(function(currentValue,index,arr), thisValue)
var ages = [32, 33, 12, 40];
function checkAge(age) {
return age >= 18;
}
function myFunction() {
ages.every(checkAge);
}
- some:測試數(shù)組中是不是至少有1個元素通過了被提供的函數(shù)測試。它返回的是一個Boolean類型的值。
Array.some()
const array = [1, 2, 3, 4, 5];
const even = (element) => element%2===0;
console.log(array.some(even));
//true
- join:用于把數(shù)組中的所有元素放入一個字符串。元素是通過指定的分隔符進行分隔的。
arrayObject.join(separator)
<script type="text/javascript">
var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
document.write(arr.join())
</script>
//George,John,Thomas
15.Math
- Math.floor() 返回小于或等于一個給定數(shù)字的最大整數(shù)
Math.floor( 45.95); // 45
- Math.round()把一個數(shù)字舍入為最接近的整數(shù)
<script type="text/javascript">
document.write(Math.round(0.60) + "<br />")
document.write(Math.round(0.50) + "<br />")
document.write(Math.round(0.49) + "<br />")
document.write(Math.round(-4.40) + "<br />")
document.write(Math.round(-4.60))
</script>
//output
1
1
0
-4
-5
16.正則表達式:使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串搜索模式。
三、其他
1.==和===的區(qū)別
== ,如果對比的數(shù)據(jù)類型不相同,先進行類型轉(zhuǎn)換,再進行比較;
===,判斷兩者類型和值是否相同。
2.在條件判斷時,除了 undefined, null, false, NaN, ' ', 0, -0,其他所有值都轉(zhuǎn)為 true。
類型轉(zhuǎn)換
3.理解this
JavaScript this 關(guān)鍵字
JavaScript中this詳解