人人IT網

人人IT網

當前位置: 主頁 > JAVA編程 > JAVA >

(轉)JavaScript學習筆記:變量

時間:2016-12-03 01:05來源:Internet 作者:Internet 點擊:
在很多語言當中都有變量,而這也是基礎知識。在JavaScript中也有變量,而最近也在學習有關於這方面的知識。今天就來總結一下JavaScript中有關於變量的一些基礎知識。 變量命名規則 在Ja
在很多語言當中都有變量,而這也是基礎知識。在JavaScript中也有變量,而最近也在學習有關於這方面的知識。今天就來總結一下JavaScript中有關於變量的一些基礎知識。

變量命名規則

在JavaScript中可以用變量來为值命名。變量的名稱稱为identifiers,需要遵守一定的規則。

JavaScript中的變量名(也可稱作是一個標識符identifier),其命名有一定的規則:

必須以字母、下劃線(_)或者美元符號($)開頭,後續的字符可以包含數字(0-9),比如num、_name、$doc等;
變量命名區分大小寫,大寫字母可以是大寫的(A~Z)和小寫的(a~z);
聲明方式

JavaScript中有三種聲明方式:

var: 聲明變量,可選擇將其初始化为一個值。詳細介紹
let: 聲明塊範圍局部變量,可選擇將其初始化为一個值。詳細介紹
const: 聲明一個只讀命名常量。 詳細介紹
聲明變量

聲明變量常見的方式有以下三種方式。

使用關鍵詞var
直接賦值
使用關鍵詞let
使用關鍵詞var

使用關鍵詞var聲明了一個變量,並且可以同時初始化該變量。例如:

var i;
var num;
var a, b;
var name ='bingdian';
var i = 0, j = 1 , k=6;
使用var關鍵詞聲明的變量根據變量的作用域,又可以分为全局變量和局部變量。而全局變量和局部變量又是一個令人頭痛的概念,特別是對於一位初學者,更是令人模糊。後面我們專門來討論和學習這個概念。

而且使用var關鍵詞聲明的變量是永久的,用delete運算符刪除這些變量將會引發錯誤:

var a = 1;
b = 2;

delete this.a; // 在嚴格模式(strict mode)下拋出TypeError,其他情況下執行失敗並無任何提示。
delete this.b;

console.log(a, b); // 拋出ReferenceError。
// 'b'屬性已經被刪除。
直接賦值

在代碼中可以直接给一個聲明名符賦值,如:

x = 42;
這样就創建了一個全局變量,並會導致JavaScript編譯時產生一個嚴格警告。在代碼中強烈建議不采用這種方式聲明一個變量。

使用關鍵詞let

關鍵詞let是ES6中新增的一個命令,用來聲明一個塊級域的本地變量,並且可以同時初始化該變量。它的用法類似於var,只不過let聲明的變量只在代碼塊內有效:

{
    let a = 10;
    var b = 10;
    console.log(a); // 10
}

console.log(a); // Uncaught ReferenceError: a is not defined
console.log(b); // 10
上面的代碼在代碼塊中,分別使用let和var聲明兩個變量。然後在代碼塊內調用這兩個變量,返回的值都是正確的值。但在代碼塊之外調用這兩個變量,結果let聲明的變量報出Uncaught ReferenceError: a is not defined的錯誤信息,而使用var聲明的變量返回正確的值为10。這也再次證明let聲明的變量只在它所在的代碼塊有效。

let vs var

簡單點說,let的作用域是塊,而var的作用域是函數(要麼是全局,要麼是局部):

var a = 5;
var b = 10;
if (a !== undefined) {
    let a = 10; // 域在if塊內
    var b = 5; // 域在函數內
    console.log(a); // 10
    console.log(b); // 5
}
console.log(a); // 5
console.log(b); // 5
還有一點var可以重复聲明同一個變量,而let不允許在相同的作用域內重复聲明一個變量。如:

function func1(){
  let a = 'w3cplus';
  var a = 'blog';
  console.log(a);
}
func1();
// repl: Duplicate declaration "a"

function func2(){
  var a = "w3cplus";
  var a = "blog";
  console.log(a);
}
func2(); // blog
使用var關鍵詞聲明的變量,變量可以提升,而let關鍵不存在變量提升。來看兩段代碼:

console.log(foo); // ReferenceError
let foo = 2;
而使用var則不會報錯

console.log(foo); // undefined
var foo = 2;
在使用var聲明變量時,一個函數中所有的var語句應盡可能地放在接近函數頂部的地方。

常量

前面提到過,JavaScript中有三種聲明方式,其中const關鍵詞就是用來創建一個只讀的常量。常量標識符的命名規則和變量的相同。

使用const聲明的常量的值只要一旦聲明了,就不能再改變。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: "PI" is read-only
上面的代碼表明改變常量的值會報錯。

const聲明的變量,只要聲明了就能不改變,所以就必須立即初始化,不能留到後面來賦值,不然就會報錯。

const foo;
// SyntaxError: missing = in const declaration
const和let作用域是相同的,只在聲明所在的塊級作用域內才有效。

if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined
const命令聲明的常量也是不提升,同样存在暫時性死區,只能在聲明的位置後面使用。

if (true) {
  console.log(MAX); // ReferenceError
  const MAX = 5;
}
上面代碼在常量MAX聲明之前就調用,結果報錯。

const聲明的常量,也與let一样不可重复聲明。

var message = "Hello!";
let age = 25;

// 以下兩行都會報錯
const message = "Goodbye!";
const age = 30;
一個常量不能和它所在作用域內的其他變量或函數擁有相同的名稱。

下面的例子演示了常量的特性。在瀏覽器的控制台度一下這個例子:

// 注意: 常量在聲明的時候可以使用大小寫,但通常情況下會使用全部大寫英文。

// 定義常量MY_FAV並賦值7
const MY_FAV = 7;

// 在 Firefox 和 Chrome 這會失敗但不會報錯(在 Safari這個賦值會成功)
MY_FAV = 20;

// 輸出 7
console.log("my favorite number is: " + MY_FAV);

// 嘗試重新聲明會報錯
const MY_FAV = 20;

//  MY_FAV 保留给上面的常量,這個操作會失敗
var MY_FAV = 20;

// MY_FAV 依舊为7
console.log("my favorite number is " + MY_FAV);

// 下面是一個語法錯誤
const A = 1; A = 2;

// 常量要求一個初始值
const FOO; // SyntaxError: missing = in const declaration

// 常量可以定義成對象
const MY_OBJECT = {"key": "value"};

// 重寫對象和上面一样會失敗
MY_OBJECT = {"OTHER_KEY": "value"};

// 對象屬性並不在保護的範圍內,下面這個聲明會成功執行
MY_OBJECT.key = "otherValue";
對變量求值

用var或let聲明的未賦初始值的變量,值都會被設定为undefined。所以我們就可以通過這样的方法了判斷一個變量是否賦予了初始值:

var a;
if (a === undefined) {
    ...
} else {
    ...
}
undefined值在布爾類型環境中會被當作false。例如,下面的代碼將運行函數myFunction,因为數組myArray中的元素未被賦值:

var myArray = new Array();
if (!myArray[0]) myFunction();
數值類型環境中undefined值會被轉換为NaN:

var a;
a + 2; // NaN
當你對一個空變量求值時,空值null在數值類型環境中會被當作0來對待,而布爾類型環境中會被當作false。例如:

var n = null;
console.log(n * 32); //  0
變量的真相

可能很多人已經注意到,在 Javascript 當中,一個變量與一個對象的一個屬性,有很多相似的地方,實際上,它們並沒有什麼本質區別。在 Javascript 中,任何變量都是某個特定對象的屬性。

全局變量都是全局對象的屬性。在 Javascript 解釋器開始運行且沒有執行 Javascript 代碼之前,會有一個全局對象被創建,然後 Javascript 解釋器會给它與定義一些屬性,這些屬性就是我們在 Javascript 代碼中可以直接使用的內置的變量和方法。之後,每當我們定義一個全局變量,實際上是给全局對象定義了一個屬性。

在客戶端的 Javascript 當中,這個全局變量就是 Window 對象,它有一個指向自己的屬性 window ,這就是我們常用的全局變量。

對於函數的局部變量,則是在函數開始執行時,會有一個對應的調用對象被創建,函數的局部變量都作为它的屬性而存儲。這样可以防止局部變量覆蓋全局變量。
From:ITEYE
頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
發表評論
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
評價:
表情:
驗證碼:點擊我更換圖片
欄目列表
推薦內容