文章目录
一.基本数据类型
基本数据类型是不可变的,存储在栈内存中
typeof 检测除了null之外的基本数据类型
示例:
var a = "id";
console.log(typeof a); // "string" - 字符串类型
1.undefined (未定义)
- 变量声明后未赋值时默认值为 undefined
- 函数没有返回值时,默认返回 undefined
- 使用typeof检测返回 undefined时返回"undefined"
示例:
var x;
console.log(x); // undefined
console.log(typeof x); // "undefined"
2.Null (空值)
- 表示一个 “空” 的值
- 通常用于主动释放对象引用
- typeof null会返回"object"(历史遗留 bug)
- 与undefined的区别:null是主动设置的空值,undefined是未定义
示例:
var st = null;
console.log(st); // null
console.log(typeof st); // "object" - 特殊情况
比较undefined和null
console.log(undefined == null); // true(值相等)
console.log(undefined === null); // false(类型不同)
3.Boolean (布尔值)
- 只有两个值:true和false
- 常用于条件判断
- 转换规则:0、“”、null、undefined、NaN 会转为 false, 其他值通常转为 true
示例:
var f_t = true;
console.log(f_t); // true
var f_f = false;
console.log(f_f); // false
转换规则:
console.log(Boolean(0)); // false
console.log(Boolean("")); // false
console.log(Boolean("hello")); // true
console.log(Boolean({})); // true(空对象为true)
4.Number (数值)
- 所有数字都是以 64 位浮点数形式储存
- 整数和小数没有明确区分
- 特殊值:Infinity(无穷大)、-Infinity(负无穷大)、NaN(非数字)
数值表示:
var integer = 42;
var float = 3.14;
console.log(integer); // 42
console.log(float); // 3.14
在数字前使用不同开头可以定义不同的进制
对应方法:
进制 | 开头 |
---|---|
二进制 | 0b或0B |
八进制 | 0o或0O |
十六进制 | 0x或0X |
示例:
var hexNum = 0x11; // 十六进制,等于十进制的17
console.log(hexNum); // 17
var binNum = 0b1010; // 二进制,等于十进制的10
console.log(binNum); // 10
- 特殊数值与检测
console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
console.log("hello" / 2); // NaN
console.log(Number.isNaN(NaN)); // true - (检测NaN的唯一方法)
console.log(Number.isFinite(Infinity)); // false - 检测是否为有限数
4.String (字符串)
- 用于表示文本数据
- 可以用单引号 (‘’)、双引号 (“”) 或反引号 (``) 包裹
- 反引号支持多行字符串和模板占位符${}
字符串创建:
var str1 = "hi";
var str2 = 'hi'; // 单引号定义
var str3 = `hi`; // 反引号定义
var str4 = `第一行
第二行
第三行`; // 多行字符串
console.log(str1, str2, str3, str4);
模板字符串 - 支持变量嵌入
var name = "Alice";
var greeting = `你好, ${name}, 今天是 ${new Date().getDate() 号}`;
console.log(greeting);
字符串拼接特性:任何数据与字符串相加结果都为字符串
console.log(str1 + str2); // "hihi"
console.log(10 + 20 + "hi"); // "30hi" - 先计算数字相加
console.log("hi" + 10 + 20); // "hi1020" - 从左到右依次拼接
字符串属性和方法:
var str = "hello";
console.log(str.length); // 5(长度属性)
console.log(str.toUpperCase()); // "HELLO"(转换为大写)
console.log(str.indexOf("l")); // 2(查找字符位置,返回第一个匹配索引)
console.log(str.slice(1, 4)); // "ell"(截取子串,从索引1到3)
console.log(str.charAt(2)); // "l"(获取指定位置字符)
console.log(str.split("")); // ["h", "e", "l", "l", "o"](分割为数组)
6.Symbol (符号)
- ES6 新增类型,表示唯一的、不可变的值
- 主要用于对象属性的唯一标识符,避免属性名冲突
- 不能使用new关键字创建
示例:
const id1 = Symbol("id");
const id2 = Symbol("id");
console.log(id1 === id2); // false - 即使描述符相同,也是不同的Symbol
console.log(id1); // Symbol(id)
console.log(typeof id1); // "symbol"
7.BigInt (任意大整数)
- ES2020 新增类型,用于表示任意精度的整数
- 通过在整数末尾加n或使用BigInt()构造函数创建
- 不能与 Number 类型直接运算,需要先转换类型
示例:
var bigNum1 = BigInt(9007199254740991);
var bigNum2 = 9007199254740991n; // 直接在数字后加n
console.log(bigNum1); // 9007199254740991n
二.复杂数据类型(引用类型)
复杂数据类型存储在堆内存中,变量中存储的是指向堆内存的引用地址
1.Object (对象):
- JavaScript 中所有非基本类型都是对象
- 由键值对(key-value)组成
- 键通常是字符串,值可以是任何类型
对象字面量创建:
var person = {
name: "Wendy",
age: 22,
isStudent: true,
hobbies: ["reading", "coding"],
greet: function() {
console.log(`Hello, I'm ${this.name}`);
},
};
访问, 修改, 添加, 删除, 调用对象属性:
// 访问属性
console.log(person.name); // "Wendy"(点表示法)
console.log(person['age']); // 22(方括号表示法)
// 修改属性
person.age = 23;
// 添加新属性
person.email = "wendy@example.com";
// 删除属性
delete person.isStudent;
// 调用方法
person.greet(); // "Hello, I'm Wendy"
// 对象遍历
for (var key in person) {
console.log(`${key}: ${person[key]}`);
}
2.Function (函数)
- 可执行的代码块,用于封装逻辑
- 可以作为值传递,也可以作为对象的属性(方法)
函数声明:
function fn(x) {
var y = 2 * x;
return y;
}
console.log(fn(3)); // 6
函数表达式:
const multiply = function(a, b) {
return a * b;
};
箭头函数(ES6):
const add = (a, b) => a + b;
调用函数:
console.log(add(2, 3)); // 5
console.log(multiply(4, 5)); // 20
函数作为参数:
function calculate(a, b, operation) {
return operation(a, b);
}
console.log(calculate(10, 2, divide)); // 5
内置对象方法:
console.log(Math.max(1, 2, 4, 5)); // 5 - 求最大值
console.log(Math.min(1, 2, 4, 5)); // 1 - 求最小值
console.log(Math.random()); // 0-1之间的随机数
Date对象:
var day = new Date();
console.log(day.toLocaleString()); // 本地时间字符串
console.log(day.getFullYear()); // 当前年份
3.Array (数组)
- 存储有序的集合
- 元素可以是任意类型
- 长度可以动态变化
- 索引从 0 开始
创建数组:
let arr = [1, "hello", true, null, { key: "value" }];
let emptyArr = new Array(); // 使用构造函数
// 数组长度
console.log(arr.length); // 5
// 访问元素
console.log(arr[0]); // 1 - 访问第一个元素(索引从0开始)
console.log(arr[1]); // "hello" - 访问第二个元素
// 修改元素
arr1[0] = "first"; // 修改第一个元素
console.log(arr1);
// 数组遍历
arr.forEach(item => {
console.log(item);
});
// 数组转换
let numbers = [1, 2, 3];
console.log(numbers.join("-")); // "1-2-3"
常用方法:
arr.push("new element"); // 在末尾添加元素
console.log(arr.pop()); // 移除并返回最后一个元素
arr.unshift("first"); // 添加到开头
console.log(arr.shift()); // 移除第一个元素
console.log(arr.indexOf("hi")); // 查找元素索引
console.log(arr.slice(1, 4)); // 截取子数组