- N +

js中const用法?var let const

大家好,關于js中const用法很多朋友都還不太明白,今天小編就來為大家分享關于var let const的知識,希望對各位有所幫助!

JS怎么使用單個let或者const關鍵字同時給多個變量賦相同的值

您好!很高興回答您的問題!

一、使用var聲明變量

1、使用方法

通過var關鍵字可以一次聲明一個變量或者多個變量,同時可以為聲明的變量賦初始值。但是變量的聲明和初始值并不是在同一時間執行的,在執行初始值之前這些聲明的變量的值為undefined。

'usestrict';

varx=12,

y=x;

2、聲明變量與非聲明變量區別

變量聲明定義的時候無論出現在代碼的什么位置,都會在執行代碼之前,將聲明的變量添加到當前執行環境的作用域(上下文)中,該變量與undefined綁定在一起除非到了執行變量初始化語句或者除非之前已經聲明了這個變量,添加帶作用域中的變量是不可配置的,這就是變量提升。在使用該變量的時候,會解析執行表達式,返回值,這個值可能是沒有經過執行初始化的undefined。返回undefined也很好的提醒程序員該變量沒有初始化。

非變量聲明不會再執行之前處理,永遠是在執行的時候進行處理。也就是說,當在執行代碼的時候,遇到了一個未經聲明的標識符,經過解析執行創建這個標識符,在嚴格模式下會直接返回引用類型錯誤,非嚴格模式下,會在全局對象中添加這個標識符和對應的值這個變量是可以配置的。在使用這個變量的時候,如果在創建之前使用,無論是否在嚴格模式下都會拋出異常。

以下是詳細描述:

(1)聲明變量在執行代碼之前解析創建,所以變量提升;非聲明變量在執行時候解析創建,不存在變量提升。

console.log(x,y);//xundefinedy拋出異常

varx=12;

y=34;

console.log(x,y);//1234

因為在執行之前進行的變量定義初始化,所以x,但是執行的時候由于沒有執行x=12所以x為undefined;但是對于y來說是在執行的時候才會創建的,所以在創建之前使用只能拋出異常。當執行完x=12,執行y=34.會發現y沒有創建,所以會盡可能的去創建它,由于在非嚴格模式下,所以得逞了。之后再使用x,y都會被賦值了。

(2)聲明變量是被創建在當前執行環境的詞法作用域中,非聲明變量在嚴格模式下不會創建拋出異常,在非嚴格模式下會作為屬性創建在全局對象中。

functionf(){

f=12;

varz=2;

}

f();

z=-1;

console.log(f,z);//12-1

函數中f變量是非聲明變量,所以在非嚴格模式下降添加到全局對象中作為一個屬性而存在,但是函數中的z則添加帶f函數所創建的執行環境中,所以在函數外部無法訪問到。值得注意的是,雖然在函數外部也定義了一個z=-1但是這個z不是通過聲明變量定義的,所以也會添加到全局對象中。

(3)聲明變量所在的詞法環境是不可配置的,而非聲明變量所在的全局對象是可以配置的。所謂的配置就是指可以刪除該屬性,或者修改該屬性的特性。

varx=12;

z=-1;

console.log(x,z);//12-1

deletex;

deletez;

console.log(x,z);//zisnotdefined證明z刪除了但是x沒有刪除

(4)沒有執行初始化的聲明變量typeof為undefined,但是非聲明變量也為undefined

console.log(typeofx);//undefined

console.log(typeofz);//undefined

varx=12;

z=-1;

3、注意事項

(1)盡可能的使用聲明變量方式進行變量聲明,摒棄非聲明變量的方式,只有這樣才能不會將變量添加到全局中去污染全局變量屬性,以便發生意想不到的效果,并且還可以提高性能。

(2)通過使用嚴格模式可以限制上述問題之外,還可以提醒程序員使用變量聲明,防止使用未經聲明的變量。

(3)不能依賴于變量提升。

(4)應該避免重復聲明相同的變量,最多使用賦值語句對變量值的修改。

(5)由于javascript是一個弱類型的語言,所以在覆蓋變量值得時候盡可能不要更改一個變量的類型。

(6)注意的是typeof檢測一個變量的類型,如果為undefined的話,除了這個變量聲明了但是沒有初始化的意思之外,很可能該變量使用過非聲明變量方式創建的,或者這個變量就是不存在。

所以總結一句就是在嚴格模式下使用var聲明變量,不能依賴于變量提升、js弱類型、typeof檢測undefined、不能重復聲明變量。

可以看出ES5標準中的var存在的問題是不少的,但是最重要的一個問題就是沒有塊作用域這一概念,這完全取決于之前的設計,因為在ES5標準中僅僅說對全局、函數、eval、catch塊才會創建詞法環境,對于for等語法塊是不創建的,導致不存在塊級作用域從而使用很耗性能的閉包代替。在ES6中出現了let關鍵字聲明變量,這個可以解決一些問題。

二、使用let聲明變量

1、詳細介紹

在執行之前,只要進入一個塊級作用域比如全局、函數、{}等。不會和var一樣對let進行所謂的變量提升,而是將通過let聲明的變量標識符保存起來,以便于判斷接下來是否含有命名沖突,也服務于‘暫存死區’,直到開始執行代碼。到執行到聲明語句的時候,才會正式的創建,如果沒有初始化則賦值為undefined,否則初始化標識符。(對于為什么賦值為undefined而不是null或者其他,前面文章中有介紹)

對于全局變量中的let不會添加到全局對象中去。這是和全局中的var的區別之一,對于全局中的var,在執行代碼之前會將標識符添加到與這個執行環境綁定的詞法環境中去,但是又因為這個詞法環境與全局對象是綁定在一起的,所以會將全局的變量聲明都作為全局對象的屬性存在。Let聲明的變量和var不一樣,他并不會去破壞全局對象,而是當執行到let語句的時候創建一個塊詞法作用域,而將let聲明的變量添加到這個詞法作用域中去。

varx='global';

lety='global';

console.log(this.x);//"global"

console.log(this.y);//undefined

在全局中使用let,避免了將全局屬性添加到全局對象中,減少了對全局對象的污染。

在執行代碼之前,定義綁定初始化的時候,在處理let聲明表達式的時候,如果該表達式在當前處理的詞法環境中存在則拋出異常。在E5標準中,如果對同一個變量進行了兩次聲明是不會報錯的只不過后一個聲明僅僅當做賦值表達式在使用,這個會產生一些問題,比如發生了命名沖突還不知道,導致代碼邏輯錯誤,從而只能依托程序員提高警惕避免重復命名。E6中的let很好的避免了這種重復聲明的問題,只要在let聲明之前無論什么方式創建的變量,只要與let聲明語句位于同一個塊中,同名就會拋出異常。

if(x){

letfoo;

letfoo;//沖突

}

switch(x){

case0:

letfoo;

break;

case1:

letfoo;//沖突

break;

}

這個switch中所有的case都處于同一個塊作用域中的,這個要注意了。

functionf(foo){

letfoo;//與參數沖突

}

f(12);

varx=12;

letx=-1;//與var聲明的變量沖突

functionf(){

varx=12;

if(true){

letx=-1;//不在同一個塊作用域不沖突

console.log(x);//-1

}

console.log(x);//12

}

f();

在開始執行的時候,在還沒有執行到let變量聲明初始化的位置之前對let變量進行引用,引用將會拋出異常,因為這個變量還處于封鎖狀態也就是‘==暫存死區==’狀態。這個概念解決了E5中使用var導致變量提升的弊端,是的在聲明之前不能提前使用了,一點使用將拋出異常。

“`

functiondo_something(){

console.log(foo);//ReferenceError

letfoo=2;

}

```

vartmp=123;

if(true){

tmp='abc';//ReferenceError

lettmp;

//不報錯

varx=x;

//報錯

letx=x;

//ReferenceError:xisnotdefined

只要一進入{}或者全局,就會單獨創建一個塊級作用域,只不過這個作用域僅僅維護let變量的。在創建的時候除了添加let聲明和初始化值之外,還記錄了父級塊級作用域中let變量執行都該位置的時候值得副本(可能這個副本的記錄瀏覽器引擎優化了),如果子塊中存在與父塊中相同的變量,則忽略父級塊級作用域中的值。

functionletTest(){

letx=1;

if(true){

letx=2;//不同的變量,忽略父級作用域的x

console.log(x);//2

}

console.log(x);//1

}

letTest();

一執行函數進入函數體{}就會創建一個塊級作用域其中有x賦值為1,然后遇到if{}又創建一個塊級作用域其中有x賦值為2,但是由于這個子塊中有x所以父塊中x不會進行

varlist=document.getElementById("list");

for(leti=1;i<=5;i++){

varitem=document.createElement("LI");

item.appendChild(document.createTextNode("Item"+i));

item.onclick=function(ev){

console.log("Item"+i+"isclicked.");

};

list.appendChild(item);

}

這是一個很經典的使用let的好處的應用,這個for循環其實建立了兩個嵌套的塊級作用域,外面的塊中就是為()里面的參數建立的,

而里面的塊是為循環體建立的,當每次執行循環體的時候就是創建一個塊級作用域,這循環體中塊級作用域就會緩存父塊中i的值,

使得相應事件的時候依然有效。下面應用將詳細介紹。

2、引用實例

(1)模仿私有接口

//之前沒有let可能是這么創建一個類的,用閉包形成了一范圍保護類靜態私有屬性

//ClassClassimplementsInterface

varClass=(function(){

//靜態私有屬性和方法

varprivateProperty=12;

//靜態公共方法

//定義構造函數

varClass=function(property/*optional*/){

};

//extend(subClass,superClass)

//公共實例方法

Class.prototype={

constructor:Class,

};

returnClass;

})();

//現在可以用let替代閉包了

varClass;

{

//靜態私有屬性和方法

letprivateProperty=12;

//靜態公共方法

//定義構造函數

Class=function(property/*optional*/){

};

//extend(subClass,superClass)

//公共實例方法

Class.prototype={

constructor:Class,

};

}

(2)替代使用閉包模仿的塊級作用域

vararr=[];

for(vari=0;i<5;i++){

arr[i]=(function(i){

returnfunction(){

alert(i);

}

})(i);

}

//現在可以使用let了

for(leti=0;i<5;i++){

arr[i]=function(){

alert(i);

}

}

三、使用const聲明變量

合格關鍵字和let一樣也是E6標準提出的,使用const聲明變量和let幾乎差不多,只不過是對于定義的值只能切必須進行一次初始化。一般聲明為const的變量的變量名都要大寫。

console.log(CONST);//和let一樣也是有‘暫存死區’的存在

constCONST=100;

//CONST=12;//不能為定義const的變量修改值

//varCONST=20;//不能命名重復發生沖突

vue怎么保證一個js文件只加載一次

在Vue.js中,您可以使用ES6模塊引入方式來確保一個JS文件只加載一次。

例如,如果您有一個名為“util.js”的工具文件,并且希望它只被加載一次,您可以使用以下方法:

js

復制代碼

//util.js

exportconstadd=(a,b)=>a+b;

exportconstsubtract=(a,b)=>a-b;

//main.js

import*asUtilfrom'./util';//引入整個util.js

console.log(Util.add(2,3));//輸出5

console.log(Util.subtract(5,2));//輸出3

在上面的示例中,我們將整個“util.js”文件作為一個模塊導入到主文件“main.js”中,并將其綁定到名為“Util”的對象上。由于模塊只會在第一次引用時被加載,因此該文件只會被加載一次。

另外,如果您僅需要導入“util.js”文件中的某些函數,則可以使用以下方式:

js

復制代碼

//util.js

exportconstadd=(a,b)=>a+b;

exportconstsubtract=(a,b)=>a-b;

//main.js

import{add}from'./util';//僅導入add函數

console.log(add(2,3));//輸出5

//在其他地方再次導入add函數

import{add}from'./util';//不會重新加載util.js文件

在這種情況下,只有使用“add”函數的部分被加載,而“subtract”函數則不會被加載。如果在其他地方再次導入“add”函數,則不會重新加載整個“util.js”文件,因為它已經被加載且緩存了模塊。

js中some的用法

在JavaScript中,Array.prototype.some()是一個數組方法,用于檢查數組中是否至少有一個元素滿足給定的條件,返回一個布爾值。

.some()方法的語法如下:

```

array.some(function(currentValue,index,array),thisValue);

```

其中:

-`function(currentValue,index,array)`:必須。用于測試數組中每個元素的函數,該函數可以帶有三個參數:

-`currentValue`:必須。表示當前元素的值。

-`index`:可選。表示當前元素的索引。

-`array`:可選。表示數組本身。

如果該函數返回true,則表示該函數匹配到至少一個元素。如果沒有匹配到元素,則返回false。

-`thisValue`:可選。一個用于指定函數內部的this值的對象。

```

//舉個例子

constages=[18,22,25,35];

constresult=ages.some(age=>age<18);

console.log(result);//false

//ages數組中沒有小于18的元素,所以返回false。

```

在上面的例子中,我們使用`.some()`方法對數組`ages`進行過濾,檢查其中是否至少有一個元素小于18。由于數組中的所有元素都大于或等于18,所以`.some()`方法返回false。

js嚴格模式 不能用const嗎

不正確。在嚴格模式下,可以使用const關鍵字來定義常量。嚴格模式與非嚴格模式的主要區別在于如何處理不安全的行為和錯誤,以及如何處理作用域。

在嚴格模式下,變量未聲明就使用、函數參數重名、eval等會被視為錯誤,同時為了避免一些不利的行為,還禁止了一些使用不當的語法。

但const關鍵字并不會造成任何不利影響,使用它可以更好地實現常量,并能夠確保代碼的可讀性和可維護性。因此,在嚴格模式下,仍然可以使用const關鍵字。

var let const 區別和用法

var、let、const主要區別是各自屬性不同,具體含義及用法如下:

const常為聲明常量,let常為聲明變量,var定義的變量在之后可以修改,這些都是關鍵字之間的差異var,let以及const在JavaScript中。一般而言,大部分時間在使用的代碼中使用const和let是因為它們更安全和有用。同時很少將關鍵字var用于全局變量,或變量被提升。

好了,文章到這里就結束啦,如果本次分享的js中const用法和var let const問題對您有所幫助,還望關注下本站哦!

返回列表
上一篇:
下一篇: