数据类型
最新的 ECMAScript 标准定义了 8 种数据类型:
- 6 种原始类型,使用 typeof 运算符检查:
- null:typeof instance === “object”。
- Object:typeof instance === “object”。任何 constructed 对象实例的特殊非数据结构类型,也用做数据结构:new Object,new Array,new Map,new Set,new WeakMap,new WeakSet,new Date,和几乎所有通过 new keyword 创建的东西。
记住 typeof 操作符的唯一目的就是检查数据类型,如果我们希望检查任何从 Object 派生出来的结构类型,使用 typeof 是不起作用的,因为总是会得到 “object”。检查 Object 种类的合适方式是使用 instanceof 关键字。但即使这样也存在误差。
基本数据类型(原始值)
除 Object 以外的所有类型都是不可变的(值本身无法被改变)。我们称这些类型的值为“原始值”。
undefined
一个没有被赋值的变量会有个默认值
null 类型
值 null
特指对象的值未设置。null
是表示缺少的标识,指示变量未指向任何对象。把 null
作为尚未创建的对象,也许更好理解。
Boolean类型
布尔表示一个逻辑实体,可以有两个值:true 和 false。
Number类型
字面量格式可以是十进制、八进制(八进制第一位必须是0)、十六进制(前两位必须是0x)。
它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。
BigInt类型
可以用任意精度表示整数。使用 BigInt,可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。BigInt 是通过在整数末尾附加 n
或调用构造函数来创建的。
> const x = 2n ** 53n;
9007199254740992n
> const y = x + 1n;
9007199254740993n
String类型
由零个或多个16位Unicode字符组成的字符序列,用于表示文本数据。第一个元素的索引为 0,下一个是索引 1,依此类推。字符串的长度是它的元素的数量。
不同于类 C 语言,JavaScript 字符串是不可更改的。这意味着字符串一旦被创建,就不能被修改。但是,可以基于对原始字符串的操作来创建新的字符串。
Symbol类型
ES5 的对象属性名都是字符串,这容易造成属性名的冲突,ES6引入。Symbol(string)生成的值是唯一的且是不可修改的。
let sy = Symbol("key1");
let syObject = {};
syObject[sy] = "kk";
syObject[sy]; // "kk"
syObject.sy; // undefined
引用类型(对象)
引用类型统称为object类型,对象可以被看作是一组属性的集合。细分的话有:
- Object 类型,对象
- Array 类型,数组
- Date 类型,时间对象
- RegExp 类型,正则表达式对象
- Function 类型,函数
等。
区别
- 基本类型的值是不可变的,任何方法都无法改变一个基本类型的值,也不能给基本类型添加属性和方法。引用类型的值是可变的,我们可为为引用类型添加属性和方法,也可以删除其属性和方法
var name = 'jozo';
name.toUpperCase(); // 输出'JOZO'
console.log(name); // 输出'jozo'
var person = 'jozo';
person.age = 22;
person.method = function(){//...};
console.log(person.age); // undefined
console.log(person.method); // undefined
- 基本类型的比较是值的比较,只有在它们的值相等的时候它们才相等。引用类型的比较是引用的比较,引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同
- 基本类型的变量是存放在栈区的,引用类型的值是同时保存在栈内存和堆内存中的对象
- 基本类型向另一个变量赋值时,会在该变量上创建一个新值,再把值复制到为新变量分配的位置上。引用类型向另一个变量赋值时会将变量中存储的对应堆地址复制给新变量,两个变量都指向同一个堆,任何一个变量发生了变化都会互相影响。
let arr = {}
let func = function(arr_n){
arr_n.name = "ximu"
}
func(arr)
console.log(arr.name); // "ximu"