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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...