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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...