ES5及ES6的新增特性

来源:https://www.cnblogs.com/toweiwei/archive/2022/08/11/16577732.html
-Advertisement-
Play Games

介紹 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完全支持es6

es5的新特性

嚴格模式(對應的相反的稱為怪異模式)

'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個

map 基於set和array之上構建的一個集合


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 課件獲取:關註公眾號“數棧研習社”,後臺私信 “ChengYing” 獲得直播課件 視頻回放:點擊這裡 ChengYing開源項目地址:github 丨 gitee 喜歡我們的項目給我們點個__ STAR!STAR!!STAR!!!(重要的事情說三遍)__ 技術交流釘釘 qun:30537511 本 ...
  • 首先nosql可以被理解為not only sql 泛指非關係型資料庫,也就是說不僅僅是sql,所以它既包含了sql的一些東西,但是又和sql不同,併在其的基礎上改變或者說擴展了一些東西。 提到nosql,首先我們就要分析一下關係型資料庫的行式存儲和非關係型資料庫的列式存儲區別在哪? 行式存儲我們都 ...
  • 原文:Jetpack Compose學習(9)——Compose中的列表控制項(LazyRow和LazyColumn) - Stars-One的雜貨小窩 經過前面的學習,大致上已掌握了compose的基本使用了,本篇繼續進行擴展,講解下載Compose中的列表控制項LazyRow和LazyColumn ...
  • 數據訂閱是運動健康類應用中很常見的功能,用戶訂閱運動記錄、健康記錄等數據,當這些數據發生變化時,用戶能夠即時在App上接收到推送通知。 例如某位用戶最近正在鍛煉身體,為自己設定了每天走1萬步,每周達成3次的目標;常規的數據訂閱可以做到每天給用戶推送當天步數,但用戶需要自己進行二次計算才能得知自己是否 ...
  • 盒模型 點擊打開視頻教程 標準盒模型、怪異盒模型(IE盒模型) 什麼是盒模型? 盒模型的作用:規定了網頁元素如何顯示以及元素間的相互關係 盒模型的概念:盒模型是css佈局的基石,它規定了網頁元素如何顯示以及元素間的相互關係。 css定義所有的元素都可以擁有像盒子一樣的外形和平面空間。即都包含內容區、 ...
  • 背景 項目中用到了vue的element-ui框架,用到了el-tree組件。由於數據量很大,使用了數據懶載入模式,即非同步樹。非同步樹採用覆選框進行結點選擇的時候,沒法自動展開,官方文檔找了半天也沒有找到好的辦法! 找不到相關的配置,或者方法可以使用。 經過調試與閱讀elment-ui源碼才發現有現成 ...
  • 有時候我們不希望組件被重新渲染影響使用體驗;或者處於性能考慮,避免多次重覆渲染降低性能。而是希望組件可以緩存下來,維持當前的狀態。這時候就需要用到keep-alive組件。 開啟keep-alive 生命周期的變化. 初次進入時: onMounted> onActivated 退出後觸發 deact ...
  • 本文是深入淺出 ahooks 源碼系列文章的第三篇,該系列已整理成文檔-地址。覺得還不錯,給個 star 支持一下哈,Thanks。 本文來探索一下 ahooks 是怎麼解決 React 的閉包問題的?。 React 的閉包問題 先來看一個例子: import React, { useState, ...
一周排行
    -Advertisement-
    Play Games
  • 周末,寫點簡單的水一下。 新版本的vs創建項目的時候可以選擇自帶一個swagger。然而這隻是基本的swagger功能。 幾個介面無所謂啦,隨著介面越來越多,就這麼丟給你,一時間也會懵逼,所以這篇文章要做的有兩個功能。 給swagger文檔添加註釋 給swagger添加切換“版本”的功能(也可以理解 ...
  • 大家好,我是沙漠盡頭的狼。 本文首發於Dotnet9,介紹使用Lib.Harmony庫攔截第三方.NET庫方法,達到不修改其源碼並能實現修改方法邏輯、預期行為的效果,並且不限於只攔截public訪問修飾的類及方法,行文目錄: 什麼是方法攔截? 示常式序攔截 非public方法怎麼攔截? 總結 1. ...
  • 問題代碼: xmal:一個按鈕+一個顯示框 1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button> 2 <TextBox x:Name="display" Width="300" Height= ...
  • 前置條件 ​ 阿裡雲伺服器一臺(可在購買伺服器時勾選安裝寶塔選項,免去後面的寶塔安裝) ​ 設置阿裡雲伺服器密碼並登陸伺服器 ​ 以下操作均在伺服器Linux中進行(使用遠程連接工具登錄) 寶塔登錄 登錄阿裡雲伺服器在Linux命令行中輸入bt,查看寶塔信息 ​ 根據寶塔信息提供的網站登陸寶塔服務( ...
  • GetTokenInformation 用於檢索進程或線程的令牌(Token)信息。Token是一個數據結構,其包含有關進程或線程的安全上下文,代表當前用戶或服務的安全標識符和許可權信息。GetTokenInformation函數也可以用來獲取這些安全信息,通常用於在運行時檢查某個進程或線程的許可權或安... ...
  • matplotlib 在1.0版本之前其實是不支持3D圖形繪製的。 後來的版本中,matplotlib加入了3D圖形的支持,不僅僅是為了使數據的展示更加生動和有趣。更重要的是,由於多了一個維度,擴展了其展示數據分佈和關係的能力,可以一次從三個維度來比較數據。 下麵介紹在matplotlib中繪製各類 ...
  • 編寫一個App就能編譯發佈到iOS、Android和Web等各大平臺的跨平臺技術,各大廠商一直都有研究和發佈對應技術產品,目前最熱門的莫過於Flutter框架了。而Dart作為其唯一的編程語言,今天我們開始來體驗一下…… ...
  • 實現基本的線程池 前提:我們要實現的線程池有如下功能: 基本的線程池模型 能提交和運行任務 能正常關閉線程池 線程的拒絕策略 線程池擴容 縮容線程池 代碼地址: 1、線程池的介紹? 線程池是什麼? 線程池是一種利用池化技術來管理線程的一種技術。 當沒有線程池的時候,我們如何創建線程? 繼承Threa ...
  • SDRAM基本信息 儲存能力計算 4X16X4=256(Mbit),註意不是MByte SDRAM控制 sdram包含兩個部分:sdram_ctrl、fifo_ctrl。 sdram_ctrl:其頂層為SDRAM的控制模塊內部實例化了5個模塊,有初始化、自刷新、寫和讀模塊,還有一個仲裁模塊對這四個不 ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 本篇概覽 欣宸正在為接下新的Java雲原生實戰系列原創做準備,既然是實戰,少不了一套雲原生環境,以下內容是必不可少的: linux操作系統 kuberne ...