不信三門問題,自己寫個程式驗證一下,我C
1 var 和 let const
var a = 2; var 變數提升。var是全域性作用域
let a = 10; let 宣告變數,沒有變數提升。
let 是一個塊級別作用域。
let不能重複宣告。(可以被修改)
const 有以上特徵,宣告常量,無法修改。開發一般預設是const,除非有明顯的變數,宣告為let。
const 可以宣告物件常量,物件不能被修改,物件的屬性可以被修改。
let使用場景:1for迴圈,2 不會汙染全域性變數。
const arr = []
for (var i = 0; i<10; i++) {
arr[i] =function (){
return i
}
}
console.log(arr[5]())
let RegExp =10;
console.log(RegExp)
console.log(window.RegExp)
2 模組字串
const o = document.querySelector('.box');
let id =1,name='caomei';
o.innerHTML="<ul><li><p+id= "+id+">"+name+"<p><li><ul>"
如今寫法:
let htmlStr = ` <ul>
<li> <p id=${id}>${name}></p>
</li>
</ul>`
變數名用$+{變數名}進行代替;美元符號+{變數名}
o.innerHTML= htmlStr;
3 函式預設值,剩餘引數,
函式預設值書寫:
function add(a,b) {
a = a|| 10;
b = b|| 20;
return a+b;
}
console.log(add())
function add1(a,b =20) {
return a+b;
}
function add2(a=20,b =20) {
return a+b;
}
函式預設引數 是個 函式:
//預設的表示式也是個引數。
function add3(a,b=getVal(5)){
return a+b;
}
function getVal(val) {
return val +5
}
console.log(add3(10));
函式的剩餘引數:
function pick(obj) {
let res = Object.create(null);
for(let i = 1;i<arguments.length;i++) {
res[arguments[i]] = obj[arguments[i]]
}
}
let book ={
title:'es6',
author:'caomei',
yaer:2019
}
let bookDate = pick(book,'author','year');
console.log(bookDate)
function pick2(obj,...keys) {
let res = Object.create(null);
for(let i = 1;i<arguments.length;i++) {
res[keys[i]] = obj[keys[i]]
}
return res
}
4 函式擴充套件運算子,箭頭函式。
剩餘運算子: 把多個獨立的引數 合併到一個數組裡面。
擴充套件運算子:吧一個數組分割,並且各個項作為分離的引數傳給函式。
處理陣列中的最大值,使用apply:
const arr = [1,2,3,5]
console.log(Math.max.apply(null,arr))
console.log(Math.max(...arr));
箭頭函式: =>定義。 function() {} 變成了 ()=》 {} 非常多非常多。
let add =function(a,b){return a+b}
let add =(a,b)= >{ return a+b}; //function變成了=》
let add = val => val+5;
let add2 = (val1,val2)=>val1+val2;
返回物件的時候必須加()
let getObj = id=>({id:id,name:'caomei'})
let obj = getObj(1);
let fn = (()=>{return ()=>{
console.log('hello');}
})();
es6的this指向。 沒有this繫結!
es5之前 ,this是會被改變的。取決於呼叫函式的上下文物件。
let p ={
id :123,
init: function(){ document.addEventListener('click',function(event) {
this.doSomeThigs(event.type)}}//這個this值得是document物件。
}
bind 把this指向進行改變。 {}.bind(this)。不好理解
document.addEventListener('click',(event)=>{this.doSomeThings(event.type)},fasle)
給方法指向的時候,不要使用箭頭函式,使用原來的,會是箭頭函式this指向window。
一但使用箭頭函式,當前就沒有作用域連。箭頭函式沒有this指向,箭頭函式內部this只能查詢作用域連的方法。
注意事項1:箭頭函式 不能使用new關鍵字來例項化物件。
2: function 函式是一個物件,箭頭函式不是一個物件,內部沒有arguments,其實就是一個語法糖。
5 解構賦值。
是對賦值運算子的一種擴充套件。
它對陣列和物件進行的操作。
有點: 程式碼上簡潔。
let ndoe ={ type:'iden',name:'foo'}
let type1 = node.type
let name1= node.name
物件的結構賦值。完全解構
let {type1,name1} = node ; 名稱必須和node裡面一樣!
console.log(type,name)
let obj = {a:{},b:[],c:"hellowolrd"}
let {a } = obj;
不完全解構,可以忽略。
let {a,...res} = obj;
//預設值:
let {a,b=20} = {a:20}
//對陣列的完全解構:
let arr= [1,2,3]
let [a,b,c] =arr;
對陣列的不完全解構。
[1,[2],3]
6 擴充套件物件。
const name ='小米',age =20;
const person = { //des直接寫入變數和函式,最為物件的屬性和方法。
name, //相當於name:name
age,
sayName(){}
}
functio fn(x,y){return {x,y}}//
console.log(fn(10,20));
letcart ={ whel:4,set(newVal{},get(){return this.whell}}
const obj = {};
obj.isShow = true;
const name = 'a';
obj[name+'bc'] = 123;
obj ['f'+'bc'= function(){consoel.log(this};
//物件的方法 is() ===比較兩個值是否嚴格相等。
console.log(NaN === NaN)//解決NaN的特殊性。
// assign(); 物件的合併。!!!!使用的比較多。
Object.assign(target,obj1,obj2...)
Object.assign({},{a:1},{b:2})//返回合併之後的新物件,淺拷貝。
7symbol
資料型別Symbol,表示的是獨一無二的值。用的比較少!
const name = Symbol('name')
const name2 = Symbol('name')地址不一樣。
最大的用途定義物件的私有變數!
let s1 =Symbol('s1);
obj[s1] = 'xiaocaomei'
(obj[s1])
let obj2= {[s1]:'xiaocao'}//如果吧[]去掉就是錯的、
obj.s1錯誤!!!
8 set 集合。表示無重複值的有序列表。
let set = new Set();
set.add(2)
set.deletet(2)
set.has('4) //檢查
set.size
set.forEach( (val,key)=>{
console.log(val);console.log(key);// key和val一樣的。
}
將set轉化為陣列!使用擴充套件運算子。
let arr = [...s2]
//set中物件引用無法被釋放。
obj= null;//釋放一個物件。
9map
鍵值對有序列表,鍵和值都是任意型別、
map.set('name','caomei')
map.get('name');//獲取
map.has('name') //true校驗
map.delete('name');
map.clear();
let m =new Map();
let m = new Map(['a',1], ['c',2])
10 陣列擴充套件
陣列方法from() of();
from()將偽陣列轉化為真陣列:
[].slice.call(argments):es5轉化。
Array.from(arguments):
應用 lis =querySelectorAll('li');
Array.from(lis)
([...lis]) 擴充套件運算子,將偽陣列轉化為真正的陣列!
from()可以接受第二個引數,對每個元素進行處理。
let liContents = Array.from(lis,ele=>ele.textContent);
of將一組的資料轉化為轉化為陣列。
Array.of(3,11,20,{id:1},[20])
copywithin;複製,【】陣列內部指定位置的元素複製到其他的位置。
[1,2,3,8,9,10].copyWithin(0,3); 3之後的替換到3之前的【8,9,10,8,9,10】
find() findIndex():()裡面的寫的是條件
find():找出第一個符合條件的陣列成員
findIndex():找出第一個符合條件的陣列成員下表
// entries(),keys(),value()返回一個遍歷器,使用for ...of進行遍歷
// keys() 對鍵名進行遍歷,value對值遍歷,entries鍵值對
for(let index of ['a','b',].keys()){
console.log(index}
for (let let of ['a','b',].values()){
console.log(index}
for (let [index,ele] of ['a','b'].entries()){
console.log(index,ele)
}
let letter = ['a','b','c']
it = letter.entries();
it.next().value();
includes()返回一個布林值,表示陣列是否包含給定的值。
[1,2,3].includes(2) 返回true
[1,2,3].include('4') 不包含返回false
[1,2,3].indexof('2') 包含返回下標,不包含返回下標。
陣列方法:
A.isArray(A)是否是一個,返回布林值
A.forEach(函式)讓陣列的每一個元素遍歷 一次myFcuntion函式。陣列改變。
A.map(函式):讓陣列每個元素執行函式,並且返回新陣列。原陣列不變。
A.filter(函式):讓陣列每個元素執行相同的函式,合成一個新陣列
A.reducer(函式):對陣列每一個元素,執行函式,返回綜合。
A.erery(函式):對陣列每一個元素是否複合條件,中間一個不符合返回false。
A.some():所有元素進行判斷範湖一個布林,存在元素都滿足,返回true。都不滿足返回fasle
A.pop(),刪除最後一個。返回新的陣列
A.push()新增新的。
A.shift()刪除第一個。返回新的陣列
A.unshitf(x)新增第一個。返回新的陣列的長度。
多個數組拼接:A.concat()
A.toString():轉為字串。
A.join(',').A.('##'):轉為字串,設定元素間隔
A.splice(開始位置,刪除個數,元素):萬能的方法,可以實現增刪改。
11 Interator
12 Promise
13
