前端基礎知識ES6系列 - 01(var、let、const之間的區別)

一、var

在ES5中,頂層對象的屬性和全局變量是等價的,用var聲明的變量既是全局變量,也是頂層變量

注意:頂層對象,在瀏覽器環境指的是window對象,在?Node?指的是global對象

var a = 10;
console.log(window.a) // 10

使用var聲明的變量存在變量提升的情況

console.log(a) // undefined
var a = 20

在編譯階段,編譯器會將其變成以下執行

var a
console.log(a)
a = 20

使用var,我們能夠對一個變量進行多次聲明,后面聲明的變量會覆蓋前面的變量聲明

var a = 20 
var a = 30
console.log(a) // 30

在函數中使用使用var聲明變量時候,該變量是局部的

var a = 20
function change(){var a = 30
}
change()
console.log(a) // 20 

而如果在函數內不使用var,該變量是全局的

var a = 20
function change(){a = 30
}
change()
console.log(a) // 30 

二、let

letES6新增的命令,用來聲明變量

用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內有效

{let a = 20
}
console.log(a) // ReferenceError: a is not defined.

不存在變量提升

console.log(a) // 報錯ReferenceError
let a = 2

這表示在聲明它之前,變量a是不存在的,這時如果用到它,就會拋出一個錯誤

只要塊級作用域內存在let命令,這個區域就不再受外部影響

var a = 123
if (true) {a = 'abc' // ReferenceErrorlet a;
}

使用let聲明變量前,該變量都不可用,也就是大家常說的“暫時性死區”

最后,let不允許在相同作用域中重復聲明

let a = 20
let a = 30
// Uncaught SyntaxError: Identifier 'a' has already been declared

注意的是相同作用域,下面這種情況是不會報錯的

let a = 20
{let a = 30
}

因此,我們不能在函數內部重新聲明參數

function func(arg) {let arg;
}
func()
// Uncaught SyntaxError: Identifier 'arg' has already been declared

三、const

const聲明一個只讀的常量,一旦聲明,常量的值就不能改變

const a = 1
a = 3
// TypeError: Assignment to constant variable.

這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值

const a;
// SyntaxError: Missing initializer in const declaration

如果之前用varlet聲明過變量,再用const聲明同樣會報錯

var a = 20
let b = 20
const a = 30
const b = 30
// 都會報錯

const實際上保證的并不是變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動

對于簡單類型的數據,值就保存在變量指向的那個內存地址,因此等同于常量

對于復雜類型的數據,變量指向的內存地址,保存的只是一個指向實際數據的指針,const只能保證這個指針是固定的,并不能確保改變量的結構不變

const foo = {};// 為 foo 添加一個屬性,可以成功
foo.prop = 123;
foo.prop // 123// 將 foo 指向另一個對象,就會報錯
foo = {}; // TypeError: "foo" is read-only

其它情況,constlet一致

四、區別

varletconst三者區別可以圍繞下面五點展開:

  • 變量提升
  • 暫時性死區
  • 塊級作用域
  • 重復聲明
  • 修改聲明的變量
  • 使用

變量提升

var聲明的變量存在變量提升,即變量可以在聲明之前調用,值為undefined

letconst不存在變量提升,即它們所聲明的變量一定要在聲明后使用,否則報錯

// var
console.log(a)  // undefined
var a = 10// let 
console.log(b)  // Cannot access 'b' before initialization
let b = 10// const
console.log(c)  // Cannot access 'c' before initialization
const c = 10

暫時性死區

var不存在暫時性死區

letconst存在暫時性死區,只有等到聲明變量的那一行代碼出現,才可以獲取和使用該變量

// var
console.log(a)  // undefined
var a = 10// let
console.log(b)  // Cannot access 'b' before initialization
let b = 10// const
console.log(c)  // Cannot access 'c' before initialization
const c = 10

塊級作用域

var不存在塊級作用域

letconst存在塊級作用域

// var
{var a = 20
}
console.log(a)  // 20// let
{let b = 20
}
console.log(b)  // Uncaught ReferenceError: b is not defined// const
{const c = 20
}
console.log(c)  // Uncaught ReferenceError: c is not defined

重復聲明

var允許重復聲明變量

letconst在同一作用域不允許重復聲明變量

// var
var a = 10
var a = 20 // 20// let
let b = 10
let b = 20 // Identifier 'b' has already been declared// const
const c = 10
const c = 20 // Identifier 'c' has already been declared

修改聲明的變量

varlet可以

const聲明一個只讀的常量。一旦聲明,常量的值就不能改變

// var
var a = 10
a = 20
console.log(a)  // 20//let
let b = 10
b = 20
console.log(b)  // 20// const
const c = 10
c = 20
console.log(c) // Uncaught TypeError: Assignment to constant variable

使用

能用const的情況盡量使用const,其他情況下大多數使用let,避免使用var

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83460.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python Docker 鏡像構建完整指南:從基礎到優化

Python 是一門廣泛使用的編程語言,在容器化環境中,構建和使用 Python 鏡像是非常常見的任務。本文將提供一個完整的指南,包括選擇基礎鏡像、制作流程、不同場景下的應用、安全性最佳實踐以及鏡像優化策略。 1. 選擇合適的基礎鏡像 1.1 官方 Python 鏡像 Docker Hub 提供了…

【狂飆AGI】第1課:大模型概述

目錄 (一)大模型概念解析(二)大模型發展歷程(三)大模型發展現狀(1)OpenAI(2)微軟(3)谷歌(4)Meta (…

vite ts 配置使用@ 允許js

1.vite.config.ts 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import { fileURLToPath, URL } from node:url import setup_extend from vite-plugin-vue-setup-extend// https://vite.dev/config/ export default defineConfig({plugins: …

使用Ollama+open-webui搭建本地AI模型

本地搭建AI模型 說明:1、下載Ollama2、下載模型3、pip安裝open-webui(不推薦)1、Python版本不對應2、下載wheels失敗 4、docker安裝open-webui 說明: 在windows上搭建本地AI,使用Ollamaopen-webui的方式,可…

第 87 場周賽:比較含退格的字符串、數組中的最長山脈、一手順子、訪問所有節點的最短路徑

Q1、[簡單] 比較含退格的字符串 1、題目描述 給定 s 和 t 兩個字符串,當它們分別被輸入到空白的文本編輯器后,如果兩者相等,返回 true 。# 代表退格字符。 **注意:**如果對空文本輸入退格字符,文本繼續為空。 示例 …

linux安裝阿里DataX實現數據遷移

目錄 下載datax工具包(如果下載慢,請嘗試其他國內鏡像站或其他網站下載相應資源) 解壓工具包到當前目錄里 接著進入conf配置目錄并創建一個myjob.json(臨時測試json),myjob.json內容如下,用于模擬test庫tab1表數據同…

C++ 引用介紹

很好!既然你有 C 的基礎,那么理解 C 的「引用(reference)」會容易很多。我們來一步步講清楚這個概念。 🌟 一句話總結: C 引用(reference)就是已存在變量的“別名”,它不…

學習筆記086——@PostConstruct注解和InitializingBean接口的使用

文章目錄 1、PostConstruct注解1.1 介紹1.2 用法1.3 場景 2、InitializingBean接口2.1 介紹2.2 用法 1、PostConstruct注解 1.1 介紹 PostConstruct 是 Java EE/Jakarta EE 中的一個注解,用于標記一個方法在依賴注入完成后執行初始化操作。它通常與 Spring 框架一…

考研系列—408真題操作系統篇(2015-2019)

目錄 # 2015年 1.死鎖處理 (1)預防死鎖 (2)避免死鎖 (3)死鎖檢測和解除 2.請求分頁系統的頁面置換策略、頁面置換策略 3.頁、頁框、頁表,基本分頁系統 # 2016年 1.異常、中斷 2.頁置換算法 3.進程的互斥操作 4.SPOOLing技術(從軟件方面實現設備共享) 5.一定要牢記…

argocd部署cli工具并添加k8s集群

先決條件: 1.已經有k8s集群,(網上一萬種部署方式,這里我使用的是kubekey部署的),也埋了個坑,后面說明. 2.已經部署好argocd,并驗證web已經可以訪問.參見 k8s部署argocd-CSDN博客 部署客戶端工具, 這里我是從web頁面上直接下載的對應版本的cli工具. 打開已經部署好的argoc…

打卡day52

簡單cnn 借助調參指南進一步提高精度 基礎CNN模型代碼 import tensorflow as tf from tensorflow.keras import layers, models from tensorflow.keras.datasets import cifar10 from tensorflow.keras.utils import to_categorical# 加載數據 (train_images, train_labels),…

OpenGL ES繪制3D圖形以及設置視口

文章目錄 關于 glDrawElements基本概念使用場景mode 繪制模式type 索引數據類型indices 索引緩沖區工作原理繪制正方體實例 視口透視投影(Perspective Projection)正交投影(Orthographic Projection)正交投影和透視投影對比 關于 …

【SAS求解多元回歸方程】REG多元回歸分析-多元一次回歸

多元一次回歸是一種統計方法,用于分析多個自變量(解釋變量)與一個因變量(響應變量)之間的線性關系。 目錄 【示例】 基本語法 SAS代碼 參數估計 方差分析 回歸統計量 y的擬合診斷 y的回歸變量值 【示例】 設Y…

卡通幼兒園教育通用可愛PPT模版分享

幼兒園教育通用PPT模版,教育教學PPT模版,卡通教育PPT模版,可愛卡通教學課件PPT模版,小清新動物卡通通用PPT模版,教學說課通用PPT模版,開學季PPT模版,國學頌歌PPT模版,可愛簡約風PPT模…

力扣HOT100之技巧:75. 顏色分類

這道題實際上就是讓我們不用sort()函數來實現對原數組的排序,這里我直接使用快速排序對原數組進行排序了,也是復習一下基于快慢指針的快速排序寫法。面試手撕快排的思路參考這個視頻。 用時擊敗100%,還行。下面直接貼代碼。 class Solution …

離線部署openstack 2024.1 keystone

控制節點身份服務 離線下載 apt-get install --download-only keystone python3-openstackclient apache2 libapache2-mod-wsgi-py3mkdir /controller/keystone mv /var/cache/apt/archives/*.deb /controller/keystone/ dpkg -i /controller/keystone/*.deb在一個控制節點操…

帆軟 BI 從入門到實戰全攻略(一):安裝激活與添加數據

一、帆軟 BI 產品概述? 在當今大數據時代,數據分析與可視化成為企業洞察業務、驅動決策的關鍵利器。帆軟軟件有限公司作為中國專業的大數據 BI 和分析平臺提供商,自 2006 年成立以來,憑借其在商業智能和數據分析領域的深耕細作,…

網絡協議通俗易懂詳解指南

目錄 1. 什么是網絡協議? 1.1 協議的本質 1.2 為什么需要協議? 1.3 協議分層的概念 2. TCP協議詳解 - 可靠的信使 ?? 2.1 TCP是什么? 2.2 TCP的核心特性 ?? 面向連接 ??? 可靠傳輸 ?? 流量控制 2.3 TCP三次握手 - 建立連接 2.4 TCP四次揮手 - 斷開連接…

量子加速器切入 AI 底層架構!能源焦慮時代,ORCA 正在改寫數據中心的計算邏輯

內容來源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨浪味仙 行業動向:2000字丨5分鐘閱讀 人工智能的飛速發展,令計算需求呈現爆炸式增長,也催生出專為 AI 設計的新型計算基礎設施形態——AI…

< 買了個麻煩 (二) 618 京東云--輕量服務器 > “可以為您申請全額退訂呢。“ 工單記錄:可以“全額退款“

事情進展是這樣的: 海外接聽 一分鐘 1-2 元,具體多少要問聯通。 這幾天接電話,有點兒心煩,看見來自 010-86310548 以為是 ICP 備案,結果接起來全是 VPS (輕量應用服務器)這個工單,就…