原文地址:developer.mozilla.org/en-US/docs/…javascript
基本類型(基本數值,基本數據類型)是一種既非對象,也無方法的數據。在JavaScript中,共有六中基本類型:string、number、boolean、null、undefined、symbol(ECMAScript 2015新增)。java
多數狀況下,基本類型表明了最底層的語言實現。數組
全部基本類型的值都是不可改變的。但須要注意的是,基本類型自己和一個賦值爲基本類型的變量的區別。變量會被賦予一個新值,而原值不能像數組、對象以及函數那樣被改變。閉包
這個示例會幫助你瞭解基本類型不可改變的事實。函數
// 使用字符串方法不會改變一個字符串
var bar = "baz";
console.log(bar); // baz
bar.toUpperCase();
console.log(bar); // baz
// 使用數組方法能夠改變一個數組
var foo = [];
console.log(foo); // []
foo.push("plugh");
console.log(foo); // ["plugh"]
// 賦值行爲能夠給基本類型一個新值,而不是改變它
bar = bar.toUpperCase(); // BAZ
複製代碼
基本類型值能夠被替換,但不能被改變。ui
下面的示例將讓你體會到JavaScript是如何處理基本類型的。spa
// 基本類型
let foo = 5;
// 定義一個貌似能夠改變基本類型值的函數
function addTwo(num) {
num += 2;
}
// 和前面的函數同樣
function addTwo_v2(foo) {
foo += 2;
}
// 調用第一個函數,並傳入基本類型值做爲參數
addTwo(foo); // 獲取到當前的基本類型值
console.log(foo); // 5
// 嘗試調用第二個函數...
addTwo_v2(foo);
console.log(foo); // 5
複製代碼
你是否定爲會獲得7
,而不是5
?若是是,請看看代碼是如何運行的:code
addTwo
和addTwo_v2
函數調用時,JavaScript會檢查標識符foo
的值,從而準確無誤的找到第一行實例化變量的聲明語句。對象
找到之後,JavaScript將其做爲參數傳遞給函數的形參。ip
在執行函數體內的語句以前,JavaScript會將傳遞進來的參數(基本類型的值)複製一份,建立一個本地副本。這個副本只存在於該函數的做用域中,咱們可以經過指定在函數中的標識符訪問到它(addTwo
中的num
,addTwo_v2
中的foo
)。
接下來,函數體中的語句開始執行
第一個函數中,建立了本地num
參數,num
的值加2,但這個值並非原來的foo
的值。
第二個函數中,建立了本地參數foo
,並將它的值加2,這個值不是外部foo
的值。在這種狀況下,外部的foo
變量不能以任何方式被訪問到。這是由於JavaScript的詞法做用域(lexical scoping)所致使的變量覆蓋,本地的變量foo
覆蓋了外部的變量foo
。欲知詳情,請參閱閉包。
綜上所述,函數中的任何操做都不會影響到最初的foo
,咱們操做的只不過是它的副本。
這就是爲何說全部基本類型的值都是不可改變的。