主頁 > 企業開發 > ES6-10筆記(let&const -- Array)

ES6-10筆記(let&const -- Array)

2020-09-20 22:08:45 企業開發

大綱


scope-作用域

作用域是指程式源代碼中定義變數的區域,規定了如何查找變數,也就是確定當前執行代碼對變數的訪問權限,

JavaScript作用域共有兩種主要的作業模型——詞法作用域(靜態作用域)和動態作用域,

JavaScript默認采用詞法作用域(lexical scoping),也就是靜態作用域,

詞法作用域是由開發者在寫代碼時將變數和塊作用域寫在哪里來決定的,由此出現全域作用域,函式作用域(區域作用域),塊狀作用域

動態作用域一般由this產生

注:1.如果一個變數或者運算式不在“當前的作用域”,那么JavaScript機制會繼續沿著作用域鏈向上查找直到全域作用域(global或瀏覽器中的window)如果找不到將不判定為不可被使用,
    2.作用域也會根據代碼層次分層,作用域之間形成父子關系,嵌套關系,子作用域可以訪問父作用域,通常沿著鏈式的作用域鏈查找向上查找,而不能從父作用域參考訪問子作用域的變數和參考

全域作用域

所有在全域作用域中宣告的變數、函式都會變成window物件的屬性和方法

變數在函式或者代碼塊{}外定義,即為全域作用域,一般可以在頁面任何地方訪問

var oneName = " Volvo";
// 此處可呼叫 oneName 變數
function myFunction() {
    // 函式內可呼叫 oneName 變數
}
if(true){
	//代碼塊內可呼叫oneName變數
}

在函式或者代碼塊{}內未定義的變數也擁有全域作用域,該變數將作為global或者window的屬性存在

// 此處可呼叫 oneName 變數
function myFunction() {
     carName = "Volvo";
    // 函式內可呼叫 oneName 變數
}
if(true){
	//代碼塊內可呼叫oneName變數
}

注:在函式內部或者代碼塊中沒有定義的變數實際上是作為global/window的屬性存在,而不是全域變數,該變數是可以被delete掉,而全域變數不可以,因為通過var陳述句添加的全域變數有一個configcurable屬性,默認值為false,可以通過Object.getOwnPropertyDescriptor(window,"...")查看

window物件上的屬性在書寫時可以省略window.

函式作用域(區域作用域)

在函式內部定義的變數對外是封閉的,從外層無法直接訪問函式內部的作用域

function bar() {
  var testValue = 'https://www.cnblogs.com/xingchenhuanqi/p/inner';
}
console.log(testValue);		// 報錯:ReferenceError: testValue is not defined

如果想讀取函式內部的變數,必須借助return或者閉包

//使用return方式
function bar(value) {
  var testValue = 'https://www.cnblogs.com/xingchenhuanqi/p/inner';
  return testValue + value;
}
console.log(bar('fun'));		// "innerfun"

return 是函式對外交流的出口,而 return 可以回傳的是函式,根據作用域的規則,函式bar內部的子函式inner是可以獲取函式bar作用域內的變數result

//使用閉包方式
function bar(value) {
  var testValue = 'https://www.cnblogs.com/xingchenhuanqi/p/inner';
  var result = testValue + value;
  function innser() {
     return result;
  };
  return innser();
}
console.log(bar('fun'));	// "innerfun"

塊狀作用域

在其他編程語言中,塊狀作用域是很熟悉的概念,但是在JavaScript中不被支持,在ES6中已經有了{}塊狀作用域,

if(true){
  let a = 1
  console.log(a) //1
}
console.log(a) //a is not defined

注:事實上塊狀作用域在ES3就已經存在,只是不明顯,比如catch塊捕獲的例外僅在catch塊可見

詞法作用域(靜態作用域)與動態作用域

在javaScript采用詞法作用域,執行foo函式,先從foo函式內部查找區域變數value,如果沒有,就根據書寫的位置,查找上面一層的代碼,也就是value等于1,所以結果會列印1

var value = https://www.cnblogs.com/xingchenhuanqi/p/1;
function foo() {
    console.log(value);
}
function bar() {
    var value = 2;
    foo();
}
bar();
// 結果是1

這里 bind 已經把作用域的范圍進行了修改指向了 { a: 2 },而 this 指向的是當前作用域物件

window.a = 3
function test () {
  console.log(this.a)
}
test.bind({ a: 2 })() // 2
test() // 3

如果要開啟動態作用域請借助 bind、with、eval 等,

let&Const

let&Const是ES6之后的語法,let擁有的特性Const都擁有,在ES6之后宣告變數有6個方式var,function,let,const,import,class

var命令和function命令宣告的全域變數依然是頂層對像(window/global)的成員,但let,const,class命令宣告的全域變數,不在屬于頂層物件的成員,從ES6開始全域變數將逐步與頂層物件的屬性脫鉤,

注:let和Const宣告的變數去哪了?參考https://juejin.im/post/5c0be11b6fb9a049df23e388#heading-1

let

let宣告的變數擁有塊級作用域

{
  let a = 1
}
console.log(a); //undefined

let宣告的全域變數不是全域物件的屬性

不可以通過window變數名的方式訪問這些變數,而var宣告的全域變數是window的屬性,是可以通過window變數名的訪問

var a = 1
console.log(window.a); //1
let a = 1
console.log(window.a); // undefined

用let重定義變數會拋出一個語法錯誤,var可以重復定義,

var a = 1
var a = 2
console.log(a)  //2
let a = 1
let a = 2
// VM131:1 Uncaught SyntaxError: Identifier 'a' has already been declared
//   at <anonymous>:1:1

let宣告的變數不會進行變數提升,存在暫時性死區(TDZ),在死區結束前變數不會初始化,在這個區間即使是使用typeof()也會報錯

function test () {
  console.log(a)
  var a = 1
}
test() //undefined
function test () {//TDZ開始
  console.log(a)// Cannot access 'a' before initialization
  typeof(a)// Cannot access 'a' before initialization
  ...
  ...
  let a = 1 //TDZ結束
}
test()
// Uncaught ReferenceError: Cannot access 'a' before initialization

const

Const除了具有let的塊級作用域和不會變數,并且它定義的常量,在用const定義變數后,就不能修改,對其修改會拋出例外

const PI = 3.1415;
console.log(PI);
PI = 22;
console.log(PI);
// Uncaught TypeError: Assignment to constant variable.

const宣告的變數必須進行初始化,否則會拋出例外Uncaught SyntaxError: Missing initializer in const declaration

const PI
PI = 3.1415
// Uncaught SyntaxError: Missing initializer in const declaration

Array

ES6新增了一些實用的原生API,方便開發者對Array的操控性更強,

ES5操作陣列的方法 concat、join、push、pop、shift、unshift、slice、splice、substring 和 substr 、sort、 reverse、indexOf 和 lastIndexOf 、every、some、filter、map、forEach、reduce

ES6新增操作陣列的方法 find、findIndex、fill、copyWithin、Array.from、Array.of、entries、values、key、includes

圍繞陣列產生的動作無非是遍歷,轉換,生成,查找,,,,,,(資料庫增刪改查一樣一樣的)

陣列遍歷的方法有很多例如for回圈,forEach,every,for...in,for...of等等

陣列的遍歷

舉幾個例子

for回圈

for (var i = 0; i < array.length; i++) {
  console.log(array[i]);
}

forEach

forEach ( ) 方法,等同于for,不支持break;continue,會拋出例外

forEach()對于空陣列是不會執行回呼函式的

array.forEach(function(i){
  console.log(i);
})
[1,2,3,4,5].forEach(function(i){
    if(i===2){
    	return;
    }else{
    	console.log(i) //1,3,4,5
    }
})

every

every()方法遍歷可以達到break效果,

every的代碼塊種仍然不能使用break,continue,會拋出例外

[1,2,3,4,5].every(function(i){
  if(i===2){
    return false; //return false等同于break
  }else{
    console.log(i)
    return true  // return true 等同于continue
  }
})

for...in

for... in 的目的是用來遍歷物件,而陣列剛好是可遍歷物件,,,

for (var index in array) {
	//index是索引值,是字串
  console.log(array[index]);
}

for...of

for…of是支持 break、continue的,所以在功能上非常貼近原生的 for,

for…of 遍歷的是一切可遍歷的元素(陣列、物件、集合)等,ES6 中允許開發者自定義遍歷

for (variable of iterable) {}

variable:每個迭代的屬性值被分配給該變數

iterable:一個具有可列舉屬性并且可以迭代的物件

陣列轉換功能

偽陣列 具有length屬性; 按索引方式存盤資料; 不能呼叫陣列的方法

ES5偽陣列轉換為陣列

let args = [].slice.call(arguments)

let imgs= [].slice.call(document.querySelectorAll('img'))//NodeList

ES6偽陣列轉換為陣列

let args = Array.from(arguments)

let imgs = Array.from(document.querySelectorAll('img'))

Array.from(arrayLike,mapFn,thisArg)
//arrayLike 必選  想要轉換成陣列的偽陣列物件或可迭代物件
//mapFn  可選  新陣列中的每個元素會執行該回呼函式
//thisArg 可選 執行回呼函式 mapFn 時 this 物件

陣列的生成

ES5初始化一個長度為5的陣列,每個陣列元素有默認值

Array.from({ length: 5 }, function () { return 1 })

ES6初始化一個長度為5的陣列,每個陣列元素有默認值

Array.prototype.from()方法

Array.from({ length: 5 }, function () { return 1 })

Array.prototype.of()方法

Array.of(element0[, element1[, ...[, elementN]]])  
elementN  任意個引數,將按順序成為回傳陣列中的元素,
Array.of(7);       // [7] 
Array.of(1, 2, 3); // [1, 2, 3]

Array(7);          // [ , , , , , , ]
Array(1, 2, 3);    // [1, 2, 3]

Array.prototype.fill()方法

fill() 方法用一個固定值填充一個陣列中從起始索引到終止索引內的全部元素,不包括終止索引,

let array = [1, 2, 3, 4]
array.fill(0, 1, 2)
// [1,0,3,4]

arr.fill(value[, start[, end]])
value 必選 用來填充陣列元素的值
start 可選 起始索引,默認值為0
end 可選 終止索引,默認值為this.length

陣列的查找

ES6新增查找方法find(),findIndex()

Array.prototype.find()方法

find() 方法回傳陣列中滿足提供的測驗函式的第一個元素的值,否則回傳 undefined,

let array = [5, 12, 8, 130, 44];
let found = array.find(function(element) {
  return element > 10;
});
console.log(found);// 12
array.find(function(currentValue, index, arr),thisValue)
//function(currentValue, index, arr) 在陣列每一項上執行的函式
//currentValue 當前遍歷到的元素
//index 當前遍歷到的索引
//array 陣列本身
//thisArg 執行回呼時用作this的物件

Array.prototype.findIndex()方法
findIndex()方法回傳陣列中滿足提供的測驗函式的第一個元素的索引,否則回傳-1,其實這個和 find() 是成對的,不同的是它回傳的是索引而不是值

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/92056.html

標籤:JavaScript

上一篇:當 JS 工程師遇到了 TypeScript 會發生什么?

下一篇:js 獲取視頻的總時長

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more