1. 程式人生 >實用技巧 >其它 >不信三門問題,自己寫個程式驗證一下,我C

不信三門問題,自己寫個程式驗證一下,我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