[译]揭秘基本数据类型

原文地址: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,咱们操做的只不过是它的副本。

这就是为何说全部基本类型的值都是不可改变的。

相关文章
相关标签/搜索