介紹 es表示ECMASCript ,他是從es3,es5,es6,es5是2009.12月發佈的,es6是2015.6月發佈的。vue2完全支持es5的(vue3完全支持es6的),react完全支持es6 es5的新特性 嚴格模式(對應的相反的稱為怪異模式) 'use strict' //一般用 ...
介紹
es表示ECMASCript ,他是從es3,es5,es6,es5是2009.12月發佈的,es6是2015.6月發佈的。vue2完全支持es5的(vue3完全支持es6的),react完全支持es6es5的新特性
嚴格模式(對應的相反的稱為怪異模式)
'use strict' //一般用於相關的設計 上面書寫一個嚴格模式底下的代碼就需要按照嚴格模式執行
嚴格模式的特性
變數必須要帶修飾符
"use strict"; a = 10 console.log(a); //a is not defined
函數裡面this不能指向window
function sayHello(){ console.log(this); //undefined } sayHello()
- 不允許在非函數的代碼塊內聲明函數
- 禁止八進位方法
- 函數的arguments數組形參和實參不同步
對於數組和字元串都進行了加強
數組的高階函數(以函數做的參數的函數 稱為高階函數)
forEach 遍歷的
var arr = [1,2,3,4,5] //forEach 遍歷的 value表示裡面的值 index表示裡面的下標 array表示當前遍歷的數組 var forEachObj = arr.forEach(function(value,index,array){ console.log(value); //列印裡面的值 1,2,3,4,5 console.log(index) // 列印下標 0,1,2,3,4 console.log(array) //當前遍歷的數組 [1,2,3,4,5] })
map 遍歷
//map 遍歷的 value表示裡面的值 index表示下標 array表示當前的遍歷的數組 var mapObj = arr.map(function(value,index,array){ console.log(value); //列印裡面的值 1,2,3,4,5 console.log(index) // 列印下標 0,1,2,3,4 console.log(array) //當前遍歷的數組 [1,2,3,4,5] return value+1 })
forEach和map的區別
- forEach沒有返回值 裡面沒有return
- map有返回值 所以裡面可以使用return關鍵詞他的返回值是一個數組
forEach和map的底層實現
//forEach方法實現 function forEach(fn){ //遍歷這個arr for(var i=0;i<arr.length;i++){ fn(arr[i],i,arr) } } // map方法實現 function map(fn){ var res = [] //遍歷這個arr for(var i=0;i<arr.length;i++){ res.push(fn(arr[i],i,arr)) } return res }
reduce 從左到右計算的 reduceRight(從右到左計算)
//pre 前一個值 current 當前值 index 下標 array 數組 //reduce函數 利用前一個和後面值進行運算的操作 得出對應的值 var sum = arr.reduce(function(pre,current,index,arr){ return pre+current }) console.log(sum);
reduce底層實現
// 底層實現reduce function reduce(fn){ //如果只有一個直接返回 if(arr.length==1) return arr[0] var res = arr[0] //如果有多個的情況 for(var i=1;i<arr.length;i++){ res = fn(res,arr[i],i,arr) } return res }
filter 過濾的
//filter返回的是一個數組 value index arr var filterArr = arr.filter(function(value,index,arr){ return value>3 }) console.log(filterArr);
filter的底層實現
//實現filter函數 function filter(fn){ var res = [] //遍曆數組 for(var i=0;i<arr.length;i++){ if(fn(arr[i],i,arr)){ res.push(arr[i]) } } return res }
some 有一些滿足就返回true 否則返回false
//some 一些 every 每一個 var value = arr.some(function(value,index,arr){ return value>4 }) console.log(value);//true
every 每一個滿足就返回true 否則返回false
var value = arr.every(function(value,index,arr){ return value>4 }) console.log(value);//false
底層實現
//底層實現 some function some(fn){ var isTrue = false for(var i=0;i<arr.length;i++){ if(fn(arr[i],i,arr)){ isTrue = true break } } return isTrue } //底層實現 some function every(fn){ var isTrue = true for(var i=0;i<arr.length;i++){ if(!fn(arr[i],i,arr)){ isTrue = false break }
indexOf 返回對應的下標
lastIndexOf 返回對應的下標
console.log(arr.indexOf(1,2));//從下標開始找 找這個1這個數字第一次出現的位置(左到右) console.log(arr.lastIndexOf(1,5));//從下標5開始找 找1第一個次出現的位置(右到左)
字元串加強 (模板字元串 )
var a ='hello' console.log(`${a} world`) //hello world
es5新增的改變this指向的方法
bind (不會自動執行)
function say(){ console.log(this) //指向window } say() //列印window //通過函數調用 var obj = { username:"jack" } say.bind(obj)()//列印的this指向obj
call (自動調用函數)
// call 將this指向和某個內容聯繫在一塊 自動調用 傳參一個個用,隔開 say.call(obj,'tom','456')
apply (自動調用函數)
//apply 將this指向重新指向給對應的某個內容 自動調用 數組傳遞 say.apply(obj,['劉德華','123'])
call和apply的區別
- call傳遞的參數是一個個的內容,使用,隔開
- apply傳遞的參數是一個整個數組
es6的新特性
概述:es6對應數組 字元串 對象及函數以及迴圈,值類型,修飾符等都有加強(es6以後的內容都稱為es6的內容)
數組的增強
find 查找
findIndex 查找下標
var li = Array.from(lis).find(function(li){ return li.innerText == '5' }) //找到對應匹配的元素 console.log(li); //findIndex 查找對應的元素的下標 返回第一個找到的元素下標 var index = Array.from(lis).findIndex(function(li,index,arr){ return li.innerText == '5' }) console.log(index);
靜態方法(使用類名.)
Array.of() 將一組數據轉為數組
Array.from() 將偽數組轉為數組
var array = Array.of(1,2,3,4,5) console.log(array); //具備某些數組的特性的對象稱為偽數組 arguments NodeList HTMLCollection等 var lis = document.querySelectorAll('li') // 偽數組是不具備數組的函數的 Array.from(lis).forEach(function(li){ console.log(li.innerText); })
字元的增強
includes 是否包含 (包含返回true 不包含返回false)
startsWith 是否以這個字元串開頭 (是返回true 不是返回false)
endsWith 是否以這個字元串結尾 (是返回true 不是返回false)
repeat 重覆多次的去平鋪對應的字元串
// indexOf的基礎上增強 //是否包含 includes console.log('abc'.includes('a')); //true //endsWith 是否以這個字元串結尾 console.log('abc'.endsWith('abc'));//true console.log('abc'.endsWith('c'));//true //startsWith 是否以這個字元串開頭 console.log('abc'.startsWith('a'));//true console.log('abc'.startsWith('abc'));//true //平鋪 repeat 平鋪的次數 重覆多次的寫個字元串 console.log('abc'.repeat(3));//將abc寫3次
變數修飾符(增強)
var 關鍵詞修飾的變數是偽全局變數(進行變數提升)
let 關鍵詞 塊狀作用域 (變數名不能重覆聲明 避免變數名污染)
const 關鍵詞 常量(常量不可變 也不能重覆聲明 聲明一定要賦值(不能二次賦值))
var btns = document.querySelectorAll('button') // var 關鍵詞聲明的偽全局作用域 for(var i=0;i<btns.length;i++){ btns[i].onclick = function(){ //當前的事件是非同步操作 console.log(i); //3 非同步比同步晚執行 var關鍵詞修飾的變數是偽全局變數 } } // let 塊級作用域 只在當前的代碼塊內有用 for(let i=0;i<btns.length;i++){ btns[i].onclick = function(){ //當前的事件是非同步操作 console.log(i); //3 非同步比同步晚執行 var關鍵詞修飾的變數是偽全局變數 } } // let 在同一作用域優點不能重覆命名 let a = 10 // let a = 20 報錯 不能重覆聲明 // 當你省略了對應的修飾符 預設就是以var關鍵詞修飾 // const關鍵詞 聲明常量 他同樣具備塊級作用域 const定義的變數的不能重新賦值 // 聲明的時候 必須要賦值 const a = 10 // a = 20 錯誤的 因為const修飾的變數不允許更改 // const b 錯誤的 必須要賦值 // es6 不是所有瀏覽器都可以直接解析的 不建議寫源碼的時候用let const (babel.js 解析es高版本 的內容 把變成低版本的)
新增的值類型
舊有值類型
number , String , boolean , null , undefined
新增的類型
symbol 獨一無二的值 bigInt 大的整型
//如果去聲明一個Symbol var v = Symbol() //獨一無二的值 var s = Symbol('這個值很重要') //裡面的參數是一個說明 var s1 = Symbol('這個值很重要') //裡面的參數是一個說明 console.log(v); console.log(s == s1); console.log(s.description);//獲取裡面的詳情信息 也可以設置 當前這個詳情是一個只讀屬性 description v.description = 'hello' //沒用 他是個只讀屬性 //key是獨一無二 當作對象的key值 var obj = {v:'hello'} console.log(obj.v); //bigInt 大的整型(存儲number存不了的數據) 實現的方式 字元串傳入實現 // 傳入字元串 var str = '123456789123456789' console.log( Number(str)); var bigNumber = BigInt(str) console.log(bigNumber);
對象的增強
靜態方法
is方法 Object.is() 判斷倆個對象是否是一個(true或者false)
// NaN console.log(NaN == NaN);//false //Object.is 主要解決NaN和NaN的問題 console.log(Object.is(NaN,NaN));//true NaN是值類型(常量) console.log(Object.is({},{}));//false {}對象
Object.assign 將後面對象合併當前前面 返回的是合併的對象
var obj = {sex:'男'} //assign 目標對象 來源對象 將後面的合併到前面 返回一個對象 會影響之前的對象 var res = Object.assign(obj,{name:'張三',age:18}) console.log(obj); console.log(res); console.log(Object.is(obj,res));//true 淺拷貝( Object.assign)
函數增強
箭頭函數
// //箭頭函數一般都是匿名函數 // var hello = function(){ //之前的寫法 // } //箭頭函數的寫法 ()形參 {}代碼塊 把function省略了 加了個=> var hello = ()=>{ console.log('hello') } //調用 hello()
箭頭函數的簡化
- 如果只有一個參數 可以省略()
// 簡化 如果只有一個參數可以省略() var say = username => { console.log(username); } say('jack')
- 如果只有一句代碼的話 可以省略{}
//當你只有一句代碼的時候 {} 可以省略 var world = username => console.log(username) world('hello')
- 如果只有一句代碼 且你需要返回數據情況下 可以省略對應的 retrun
//當你只有一句代碼的時候 且你需要返回值 那麼return可以被省略 var getUserName = username => username+'hello' var value = getUserName('張三') console.log(value); //張三hello //數組的forEach方法 [1,2,3].forEach(value=>console.log(value)) // 數組的reduce方法 var sum = [1,2,3].reduce((pre,current)=>pre+current) console.log(sum);
箭頭函數的特性
- 箭頭函數裡面沒有this(根據作用域鏈向上查找對應的this)
// this誰調用 this指向誰 是在對應的普通函數的情況下 // document.querySelector('button').onclick = function(){ // console.log(this);//指向當前按鈕 // } //箭頭函數 document.querySelector('button').onclick = ()=>{ console.log(this); //箭頭函數裡面沒有this 根據作用域鏈的情況 向上找 window } var hello = ()=>{ console.log(this); } hello.call({age:18}) // window
預設參數
function fn(agr1=value,arg2=value2){ } // 初始化一個對象 預設值 function initObj(name,age=18,sex='男'){ return { name,age,sex } } console.log(initObj('jack'));//沒有傳參會使用預設值 console.log(initObj('jack',19,'女'));//傳了參會覆蓋預設值
對象裡面內容的簡化
屬性的簡化
當你的屬性值是一個變數的情況下,以及你向使用你的變數作為key的名,這個時候可以省略key
var age = 18 var username = ' jack' //簡化 使用變數做鍵的名 {age:age,username:username} var obj = {age,username}
函數的簡寫
var obj = { say:function(){ console.log('hello') } } obj.say() //簡寫 省略:和function var obj = { say(){ console.log('hello') } } obj.say()
迴圈的加強
- for in 是用於遍歷對象的 遍歷的是對象的裡面key 他也可以遍曆數組(數組也是對象)
- for of 是用於遍曆數組的 遍歷的是數組裡面的value 他不可以遍歷對象(只有實現了迭代器的對象才可以被遍歷 必須具備length或者size屬性)
如果要使用對應的for of來遍歷對象的話 怎麼辦!!
Object的幾個方法(靜態方法) 可以用來實現對應的遍歷
keys 拿到所有的key
values 拿到所有的值
entries 拿到所有的鍵值對
var obj = {age:18,name:'jack',sex:'男'} //keys 獲取所有的key 作為一個迭代對象 var k = Object.keys(obj) console.log(k); //values 獲取所有的value var v = Object.values(obj) //entries 獲取所有的key-value對 var e = Object.entries(obj)
新增的對應的迭代器類型(實現了迭代器)
set 元素不重覆的一個集合(去重)
set聲明
無參
var set = new Set() //空的集合
將數組作為參數傳遞
var arr = [1,1,2,2,3,3] var set = new Set(arr) //傳入數組 console.log(set) //1 2 3
相關的方法(增刪改查)
- add 添加
- delete 刪除
- clear 清空
- keys 獲取key
- values 獲取值
- entries 獲取鍵值對象
- forEach 遍歷(三個參數分別是value,key,set)
- has 判斷是否存在 (返回的是boolean類型)
屬性
size 獲取對應的長度
//無參的形式 var set = new Set() //添加 add append push... set.add(1) set.add(2) set.add(1) //獲取對應的set的長度 size console.log(set.size);//2 //刪除方法 delete remove set.delete(1) //刪除1這個value值 //刪除所有 清空 // set.clear() //獲取元素 var key = set.keys() //獲取所有key 值既是key 又是值 var value = set.values() //獲取所有的值 var kv = set.entries() //獲取所有的鍵值對 console.log(kv); console.log(key); console.log(value); //set裡面有一個forEach方法 // 第一個是值 第二個key 第三個是遍歷的set set.forEach((v,k,set)=>{ console.log(v); }) //has 判斷是否存在 返回true和false console.log(set.has(2));//true
WeakSet 內容存儲對應的set(只能存儲對象 但並不能完成去重)
var weakset = new WeakSet() weakset.add({username:"張三"}) weakset.add({username:"張三"}) weakset.add({username:"張三"}) console.log(weakset);//裡面還是存在3個