let和const

發布自Kindem的博客,歡迎大家轉載,但是要注意注明出處。另外,該文章收納在Kindem的個人的 IT 知識整理倉庫,歡迎 Star、Fork、投稿

let

let是在ES6加入的新的變量聲明方法,let聲明變量的方法和var類似:

let a = 'hello';
var b = 'hello';
復制代碼

let的功能是聲明一個作用域被限制在塊級的變量,而var聲明的變量的作用域只能是全局的或者整個函數塊的

function varTest() {var x = 1;if (true) {var x = 2;// 2console.log(x);}// 2console.log(x);
}function letTest() {let x = 1;if (true) {let x = 2;// 2console.log(x);}// 1console.log(x);
}
復制代碼

再舉一個例子:

var a = 1;
var b = 2;if (a === 1) {var a = 11;let b = 22;// 11console.log(a);// 22console.log(b);
}// 11
console.log(a);
// 2
console.log(b);
復制代碼

另外,如果作用域位于程序的頂層,var會掛載到window上,而let不會:

var a = 'a';
let b = 'b';// this -> window
// a
console.log(this.a);
// undefined
console.log(this.b);
// a
console.log(window.a);
// undefined
console.log(window.b);
復制代碼

在相同的函數或塊作用域內重新聲明同一個變量會引發一個重復定義的SyntaxError

if (x) {let foo;// SyntaxErrorlet foo;
}
復制代碼

letvar都會在聲明所在的作用域頂部被創建,這被稱為變量提升,但是不同的是var的創建會伴隨著一個undefined值,在賦值之后才會改變,而let沒有被賦值之前是不會被初始化的,如果在這期間引用let聲明的變量,會導致一個ReferenceError,直到初始化之前,該變量都處于暫存死區:

function test() {// undefinedconsole.log(bar);// ReferenceErrorconsole.log(foo);var bar = 1;let foo = 2;
}
test();
復制代碼

兩個復雜一點的例子:

function test(){var foo = 33;if (true) {// ReferenceErrorlet foo = (foo + 55);}
}
test();
復制代碼
function go(n) {// Object {a: [1,2,3]}console.log(n);// ReferenceErrorfor (let n of n.a) {console.log(n);}
}
go({a: [1, 2, 3]});
復制代碼

const

const的基本作用是聲明一個作用域被限制在塊級的常量,其作用域和let一樣,基本使用也和let類似,但是const的特點是const聲明的值一經創建無法被改變

使用const會創建一個值的只讀引用,這意味著const聲明的對象本省的引用是無法被改變的,但是其屬性是可以被改變的,因為改變其屬性并不會引起其引用的變化

下面給出const的一些特性的例子:

基本使用:

const a = 'abc';
復制代碼

無法被重復定義:

const a = 'abc';
// SyntaxError: Identifier 'a' has already been declared
const a = 'abc';
復制代碼

聲明時就必須賦值:

// SyntaxError: Missing initializer in const declaration
const a;
復制代碼

無法被修改:

const a = 'a';
// TypeError: Assignment to constant variable
a = 'b';
復制代碼

塊級作用域:

if (true) {var a = 'a';const b = 'b';// aconsole.log(a);// bconsole.log(b);
}
// a
console.log(a);
// ReferenceError: not defined
console.log(b);
復制代碼

作用域在程序頂層時不會掛在window對象上:

var a = 'a';
const b = 'b';// this -> window
// a
console.log(this.a);
// undefined
console.log(this.b);
// a
console.log(window.a);
// undefined
console.log(window.b);
復制代碼

轉載于:https://juejin.im/post/5b991742f265da0abe26e4bd

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

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

相關文章

GIT 操作筆記

設置不用每次都輸入 賬號密碼 git config --global credential.helper store然后,下次再輸入一次 賬號密碼 就可以了。刪除github上的文件$ git pull origin master 將遠程倉庫里面的項目拉下來$ dir 查看有哪些文件夾$ git rm -r --cached target 刪除target文件…

[book]道法自然

前不久讀了王詠剛的〈凌波微步〉和〈凌波微步II〉,感覺不錯。今天把他老人家的《道法自然》也買了下來。在dearbook看到關于這本書的長篇大評,也一塊copy了下來:http://www.dearbook.com.cn/book/viewbook.aspx?pnoTS0023954認真的作者&…

c語言編手機藍牙軟件的代碼,51單片機C語言的簡易藍牙鎖代碼

#include#define uint unsigned int#define uchar unsigned charuchar r_buf; //藍牙接收到的字符存儲緩沖區sbit PWMAP2^0; //電機驅動模塊接口sbit IN1P2^2;sbit IN2P2^1;sbit STBYP2^3;sbit LED1P0^0; //LED燈接口sbit LED2P0^1;sbit LED3P0^2;sbit key1P1^0;…

列表嵌套字典,根據字典某一key排序

在返回列表嵌套字典時候,往往需要對數據進行一定的處理:按照字典中某一個key排序 In [87]: a [{"name": "牛郎", "age": 23},{"name":"許仙", "age": 20},{"name":"董永&q…

display: inline-block 布局

三個元素display: inline-block; 布局 ,其中一個元素中存在其他元素也用了display: inline-block; 無法垂直居中,將這個元素設置為display: inline; 轉載于:https://www.cnblogs.com/Running00/p/11163751.html

GCC精彩之旅

在為Linux開發應用程序時,絕大多數情況下使用的都是C語言,因此幾乎每一位Linux程序員面臨的首要問題都是如何靈活運用C編譯器。目前 Linux下最常用的C語言編譯器是GCC(GNU Compiler Collection),它是GNU項目中符合ANSI…

寫出C語言中5種數據類型的名稱及其關鍵字,求C語言中的32個關鍵字及其意思?...

關鍵字如下:一、數據類型關鍵字(12個):(1) char :聲明字符型變量或函數(2) double :聲明雙精度變量或函數(3) enum :聲明枚舉類型(4) float:聲明浮點型變量或函數(5) int: 聲明整型變量或函數(6…

想要設計自己的微服務?看這篇文章就對了

歡迎大家前往騰訊云社區,獲取更多騰訊海量技術實踐干貨哦~ 本文由我就靜靜地看 發表于云社區專欄 本文通過使用Spring Boot,Spring Cloud和Docker構建的概念驗證應用程序的示例,為了解常見的微服務架構模式提供了一個起點。 該代碼在Github上…

函數的嵌套調用

在函數的內部調用其他的函數 def index(): func() print("index") def func(): index() # def index():# func()# print("index")## def func():# print("func")# index()#def my_max(x,y): #這個函數的作用就是比大小誰大打印出…

mysql 開發進階篇系列 41 mysql日志之慢查詢日志

一.概述 慢查詢日志記錄了所有的超過sql語句( 超時參數long_query_time單位 秒),獲得表鎖定的時間不算作執行時間。慢日志默認寫入到參數datadir(數據目錄)指定的路徑下。默認文件名是[hostname]_slow.log,默認超時是10秒,默認不開…

分數相同名次排名規則C語言,如何給數據排名(相同分數相同名次)-excel篇

使用Rank函數來做數據排名該函數是返回一個數值在一個數字列表中的排名。語法:RANK(number,ref,order)RANK(對象,范圍,參數)number(必填參數):是特定單位格中的數據,需要在整個數字列表中排名的單個對象。ref(必填參數):是指需要排名的整體數列。即范圍&…

子窗體列表在菜單中的實現

想在菜單中加入子窗體的列表,上網找了半天,都很麻煩,后來看看了菜單的屬性,發現里面有個MdiList屬性,設置成true,搞定,暈。 轉載于:https://www.cnblogs.com/catzhou/articles/258450.html

MySql的連接查詢

若一個查詢同時涉及到兩個或者兩個以上的表,則稱之為連接查詢。常見的包括:等值連接查詢,自然連接查詢,非等值連接查詢,自身連接查詢,外連接查詢(左右連接)。 1.等值與非等值連接查詢…

linux下ssh通過公鑰登錄服務器

經常會通過ssh登錄遠程服務器,一種是通過密碼方式登錄,一種是通過公鑰登錄。 如何設置通過公鑰登錄服務器 1. 首先生成自己的公鑰和私鑰 ssh-keygen 命令用來生成公鑰和私鑰-t 用來指定密鑰類型(dsa | ecdsa | ed25519 | rsa | rsa1&#xff…

qt運行C語言后無顯示,qt designer啟動后不顯示界面問題的原因與解決辦法-站長資訊中心...

Qt 5.6.1無論是在vs里雙擊ui文件還是直接啟動designer.exe都一直無法顯示界面,但任務管理器中可以看到該進程是存在的。前幾天還正常的,但昨天加了一塊NVIDIA的顯卡(機器自帶核顯),可能與此有關。幸好還可以通過QtCreator打開ui文件進行編輯。…

OpenSolaris北京用戶組的第一次活動

OpenSolaris北京用戶組的第一次活動作者: BadcoffeeEmail: blog.olivergmail.comBlog: http://blog.csdn.net/yayong2005年10月10月15號,OpenSolaris北京用戶組在北京西郊賓館會議廳組織了成立以來的第一次活動。盡管OpenSolaris早在2005年6月14日就正式開放源代碼&…

. SQL多條件查詢存儲過程

編輯器加SQL多條件查詢存儲過程 2010-05-13 17:06:29| 分類: SQL | 標簽: |字號大中小 訂閱 . 例一、 ALTER proc SelectProduct ProdID varchar(10), ProdName nvarchar(30), CategoryID varchar(5), MinPrice decimal(10,2), MaxPrice decimal(10,2) a…

矩陣轉置c語言的思路,矩陣轉置 (C語言代碼)

解題思路:注意事項:參考代碼:#includeint main(){int n,s[100][100];void transposition(int(*p)[100], int n);scanf("%d", &n);for (int i 0; i < n; i){for (int j 0; j < n; j)scanf("%d", *(s i) j);}transposition(s, n);return 0;}vo…

Android PermissionUtils:運行時權限工具類及申請權限的正確姿勢

Android PermissionUtils&#xff1a;運行時權限工具類及申請權限的正確姿勢 ifadai 關注 2017.06.16 16:22* 字數 318 閱讀 3637評論 1喜歡 6PermissionUtil 經常寫Android運行時權限申請代碼&#xff0c;每次都是復制過來之后&#xff0c;改一下權限字符串就用&#xff0c;把…

實現帶下拉菜單的工具欄按鈕

在工具欄中使用真彩色圖標 實現帶下拉菜單的工具欄按鈕 20050916轉載于:https://www.cnblogs.com/henryzc/archive/2005/11/08/271346.html