JavaScript中的数据类型和区别
在JavaScript中,数据类型分别两种
- 基本类型
- 复杂类型
基本类型
基本类型主要为
Number
String
Boolean
Undefined
Null
Symbol
Number
- 数值
数值最常见的整数类型格式则为十进制,还可以设置八进制(零开头)、十六进制(0x开头)
letintNum = 55 // 10进制的55
letnum1 = 070 // 8进制的56
lethexNum1 = 0xA // 16进制的10
浮点类型则在数值汇总必须包含小数点,还可通过科学计数法表示
letfloatNum1 = 1.1;
letfloatNum2 = 0.1;
letfloatNum3 = .1; // 有效,但不推荐
letfloatNum = 3.125e7; // 等于31250000
在数值类型中,存在一个特殊数值NaN
,意为“不是数值”,用于表示本来要返回数值的操作失败了(而不是抛出错误)
console.log(0 / 0); // NaN
console.log(-0 / +0); // NaN
String
- 字符串
字符串可以使用双引号(")、单引号(')或反引号(`)标示
letfirstName = "John";
letlastName = 'Jacob';
letlastName = `Jingleheimerschmidt`
字符串是不可变的,意思是一旦创建,它们的值就不能变了
letlang = "Java";
lang = lang + "Script"; // 先销毁再创建
Boolean
- 布尔值
Boolean
(布尔值)类型有两个字面值:true
和false
通过Boolean可以将其他类型的数据转化成布尔值
规则如下:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
String | 非空字符串 | "" |
Number | 非零数值(包括无穷值) | 0 、NaN |
Object | 任意对象 | null |
Undefined | N/A(不存在) | undefined |
Undefined
- 未定义
Undefined
类型只有一个值,就是特殊值undefined
。当使用var
或let
声明了变量但没有初始化时,就相当于给变量赋予了undefined
值
letmessage;
console.log(message == undefined); // true
包含undefined
值的变量跟未定义变量是有区别的
letmessage; // 这个变量被声明了,只是值为undefined
console.log(message); // "undefined"
console.log(age); // 没有声明过这个变量,报错
Null
- 空值
Null
类型同样只有一个值,即特殊值null
逻辑上讲,null
值表示一个空对象指针,这也是给typeof
传一个null
会返回object
的原因
letcar = null;
console.log(typeofcar); // "object"
undefined
值是由null
值派生而来
console.log(null == undefined); // true
只要变量要保存对象,而当时又没有那个对象可保存,就可用null
来填充该变量
Symbol
- 符号
Symbol
(符号)是原始值,且符号实例是唯一、不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险
letgenericSymbol = Symbol();
letotherGenericSymbol = Symbol();
console.log(genericSymbol == otherGenericSymbol); // false
letfooSymbol = Symbol('foo');
letotherFooSymbol = Symbol('foo');
console.log(fooSymbol == otherFooSymbol); // false
复杂类型
复杂类型统称为Object
Object
Array
Function
Date
Map
Set
Object
- 对象
创建object常用方式为对象字面量表示法,属性名可以是字符串或数值
let person = {
name: "Nicholas",
"age": 29,
5: true
};
Array
- 数组
JavaScript数组是一组有序的数据,但跟其他语言不同的是,数组中每个槽位可以存储任意类型的数据。并且,数组也是动态大小的,会随着数据添加而自动增长
let colors = ["red", 2, {age: 20}]
colors.push(2)
Function
- 函数
函数实际上是对象,每个函数都是 Function
类型的实例,而 Function
也有属性和方法,跟其他引用类型一样
函数存在三种常见的表达方式:
- 函数声明
// 函数声明
function sum(num1, num2) {
return num1 + num2;
}
- 函数表达式
let sum = function (num1, num2) {
return num1 + num2;
};
- 箭头函数 函数声明和函数表达式两种方式
let sum = (num1, num2) => {
return num1 + num2;
};
Date
- 日期
Date
类型用于表示日期和时间,JavaScript 中的日期基于 Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 起经过的毫秒数)。
创建日期对象的常用方式:
// 创建当前日期和时间的对象
let now = new Date();
// 传入毫秒数创建指定日期
let epoch = new Date(0); // 1970-01-01T00:00:00.000Z
// 传入日期字符串(多种格式支持)
let date1 = new Date("2023-10-01");
let date2 = new Date("October 1, 2023");
// 传入年、月(0-11)、日等参数
let date3 = new Date(2023, 9, 1, 12, 30, 0); // 2023年10月1日12:30:00
常用方法:
let date = new Date();
console.log(date.getFullYear()); // 获取年份(4位数)
console.log(date.getMonth()); // 获取月份(0-11)
console.log(date.getDate()); // 获取日期(1-31)
console.log(date.getHours()); // 获取小时(0-23)
console.log(date.getTime()); // 获取时间戳(毫秒数)
console.log(date.toLocaleDateString()); // 本地格式的日期字符串
Map
- 映射
Map
是一种键值对集合,与对象不同的是:
- 键可以是任意类型(包括对象、函数、基本类型等)
- 能够记住键的插入顺序
- 有专门的方法获取键值对数量
创建和使用 Map
:
// 创建空映射
let map = new Map();
// 初始化时传入可迭代的键值对数组
let map2 = new Map([
["name", "Alice"],
[1, "number key"],
[true, "boolean key"]
]);
// 添加/修改键值对
map.set("age", 30);
map.set({id: 1}, "object key");
// 获取值
console.log(map.get("age")); // 30
// 检查键是否存在
console.log(map.has("age")); // true
// 删除键值对
map.delete("age");
// 获取映射大小
console.log(map.size); // 1(剩余{id:1}对应的键值对)
// 清空映射
map.clear();
遍历 Map
:
let map = new Map([["a", 1], ["b", 2]]);
// 遍历键值对
for (let [key, value] of map) {
console.log(`${key}: ${value}`);
}
// 只遍历键
for (let key of map.keys()) {
console.log(key);
}
// 只遍历值
for (let value of map.values()) {
console.log(value);
}
Set
- 集合
Set
是一种无序的、不重复的元素集合,常用于存储唯一值。
创建和使用 Set
:
// 创建空集合
let set = new Set();
// 初始化时传入可迭代对象(数组、字符串等)
let set2 = new Set([1, 2, 3, 3, 4]); // 自动去重,结果为 {1, 2, 3, 4}
let set3 = new Set("hello"); // 结果为 {'h', 'e', 'l', 'o'}
// 添加元素
set.add(5);
set.add("string");
set.add({}); // 可以添加对象(引用不同则视为不同元素)
// 检查元素是否存在
console.log(set.has(5)); // true
// 删除元素
set.delete(5);
// 获取集合大小
console.log(set.size); // 2(剩余"string"和{})
// 清空集合
set.clear();
遍历 Set
:
let set = new Set([1, 2, 3]);
// 遍历元素
for (let item of set) {
console.log(item);
}
// 转为数组(利用扩展运算符)
let arr = [...set]; // [1, 2, 3]
// 利用Set实现数组去重
let uniqueArr = [...new Set([1, 2, 2, 3])]; // [1, 2, 3]