--- title: 原始数据 slug: Glossary/Primitive tags: - Glossary - JavaScript - 基本数据类型 - 基本类型 - 词汇 translation_of: Glossary/Primitive ---
基本类型(基本数值、基本数据类型)是一种既非{{Glossary("object", "对象")}}也无{{glossary("method","方法")}}的数据。在 {{Glossary("JavaScript")}} 中,共有7种基本类型:{{Glossary("string")}},{{Glossary("number")}},{{Glossary("bigint")}},{{Glossary("boolean")}},{{Glossary("null")}},{{Glossary("undefined")}},{{Glossary("symbol")}} ({{Glossary("ECMAScript")}} 2016新增)。
多数情况下,基本类型直接代表了最底层的语言实现。
所有基本类型的值都是不可改变的。但需要注意的是,基本类型本身和一个赋值为基本类型的变量的区别。变量会被赋予一个新值,而原值不能像数组、对象以及函数那样被改变。
这个示例会帮助你了解基本类型不可改变的事实。
// 使用字符串方法不会改变一个字符串
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
基本类型值可以被替换,但不能被改变。
下面的示例将让你体会到JavaScript是如何处理基本类型的。
// 基本类型
let foo = 5;
// 定义一个貌似可以改变基本类型值的函数
function addTwo(num) {
num += 2;
}
// 和前面的函数一样
function addTwo_v2(foo) {
foo += 2;
}
// 调用第一个函数,并传入基本类型值作为参数
addTwo(foo);
// Getting the current Primitive value
console.log(foo); // 5
// 尝试调用第二个函数...
addTwo_v2(foo);
console.log(foo); // 5
你是否认为会得到7
,而不是5
?如果是,请看看代码是如何运行的:
addTwo
和addTwo_v2
函数调用时,JavaScript会检查标识符foo
的值,从而准确无误的找到第一行实例化变量的声明语句。addTwo
中的num
,addTwo_v2
中的foo
)。num
参数,num
的值加2,但这个值并不是原来的foo
的值。foo
,并将它的值加2,这个值不是外部foo的值。在这种情况下,外部的foo
变量不能以任何方式被访问到。这是因为JavaScript的词法作用域(lexical scoping)所导致的变量覆盖,本地的变量foo
覆盖了外部的变量foo
。欲知详情,请参阅闭包。foo
,我们操作的只不过是它的副本。这就是为什么说所有基本类型的值都是无法改变的。
除了 null
和 undefined
之外,所有基本类型都有其对应的包装对象:
这个包裹对象的valueOf()
方法返回基本类型值。