[譯]揭祕基本數據類型

原文地址:developer.mozilla.org/en-US/docs/…javascript

基本類型(基本數值,基本數據類型)是一種既非對象,也無方法的數據。在JavaScript中,共有六中基本類型:string、number、boolean、null、undefined、symbol(ECMAScript 2015新增)。java

多數狀況下,基本類型表明了最底層的語言實現。數組

全部基本類型的值都是不可改變的。但須要注意的是,基本類型自己和一個賦值爲基本類型的變量的區別。變量會被賦予一個新值,而原值不能像數組、對象以及函數那樣被改變。閉包


示例1

這個示例會幫助你瞭解基本類型不可改變的事實。函數

// 使用字符串方法不會改變一個字符串
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


示例2

下面的示例將讓你體會到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

  • addTwoaddTwo_v2函數調用時,JavaScript會檢查標識符foo的值,從而準確無誤的找到第一行實例化變量的聲明語句。對象

  • 找到之後,JavaScript將其做爲參數傳遞給函數的形參。ip

  • 在執行函數體內的語句以前,JavaScript會將傳遞進來的參數(基本類型的值)複製一份,建立一個本地副本。這個副本只存在於該函數的做用域中,咱們可以經過指定在函數中的標識符訪問到它(addTwo中的numaddTwo_v2中的foo)。

  • 接下來,函數體中的語句開始執行

    • 第一個函數中,建立了本地num參數,num的值加2,但這個值並非原來的foo的值。

    • 第二個函數中,建立了本地參數foo,並將它的值加2,這個值不是外部foo的值。在這種狀況下,外部的foo變量不能以任何方式被訪問到。這是由於JavaScript的詞法做用域(lexical scoping)所致使的變量覆蓋,本地的變量foo覆蓋了外部的變量foo。欲知詳情,請參閱閉包

  • 綜上所述,函數中的任何操做都不會影響到最初的foo,咱們操做的只不過是它的副本。

這就是爲何說全部基本類型的值都是不可改變的。

相關文章
相關標籤/搜索