1. 变量与常量
- 变量由字母,数字,下划线,$组成,第一个字母必须是:字母,下划线或 $
- 不能使用关键字和保留字
- 保留字:javascript还没使用但可能会使用的名字
- 常量:一般全部大写
- 变量和常量会在ES6进一步区分
2. 数据类型
2.1. 数据类型总结
基本数据类型 |
特点 |
Number |
数字:整型,浮点型,NaN, Infinity |
String |
字符串: |
Boolean |
布尔值:true, false |
undefined |
未定义:变量未赋值,函数无返回值 |
null |
空值: |
BigInt |
大整数 |
Symbol |
符号 |
引用数据类型 |
特点 |
Array |
数组 |
Object |
对象 |
Function |
函数 |
Date |
日期 |
RexExp |
正则表达式 |
Error |
错误对象 |
let a = 10;
let b = a; // b 是 a 的副本
b = 20; // b 改变了,但 a 不受影响,a 仍然是 10
let arr1 = [1, 2, 3];
let arr2 = arr1; // arr2 是 arr1 的引用
arr2[0] = 99; // 修改 arr2 也会影响 arr1
console.log(arr1[0]); // 输出 99,arr1 被修改了
Number
- 不区分
int
float
- 特殊: 非数字(
NaN
)
- 出现场景:
- 数学运算非法:除数为0等
- 转化为数字失败:
Number("abc")
typeof(NaN)
返回 Number
String
- 都使用单引号或双引号
- 单引号可以包含双引号,反之亦然
boolean
undefined
- 凡是声明了但没有赋值的变量,值都是undefined。
null
null
- 如果一个变量的值等于
null
,则表示系统没有给这个变量分配内存空间
2.2. 类型转换(基本类型之间)
方法 |
要求 |
异常结果 |
Number() |
纯数字字符串->数字 |
包含非数字字符->返回NaN |
parseInt() |
数字、加号、减号开头,提取整数部分 |
非数字字符开头->返回NaN |
parseFloat() |
数字、加号、减号开头,提取整数+小数部分,包括小数点 |
非数字字符开头->返回NaN |
方法 |
要求 |
处理方式 |
特点 |
与空字符串相加 |
任何类型 |
内建规则+toString() |
对象转换为"[object Object]" |
toString() |
引用类型(null和undefined用会报错) |
toString() |
基本类型使用会抛出错误 |
String() |
任何类型 |
内建规则+toString() |
通用 |
3. 数据类型判断方法
方法 |
严格程度 |
底层原理 |
特殊值备注 |
Object.is() |
🌟🌟🌟🌟🌟 |
SameValue |
✅ NaN === NaN,✅ 区分 +0 和 -0 |
Number.isNaN() |
🌟🌟🌟🌟🌟 |
=== NaN(无类型转换) |
✅ 精确判断 NaN,❌ 不误判字符串 |
includes() |
🌟🌟🌟🌟🌟 |
SameValueZero |
✅ NaN == = NaN,✅ +0 === -0(不区分) |
=== |
🌟🌟🌟🌟 |
Strict Equality |
❌ NaN !== NaN,✅ +0 === -0(不区分) |
indexOf() |
🌟🌟🌟 |
=== |
❌ 无法识别 NaN,✅ 匹配 +0/-0 (不区分) |
isNaN() |
🌟🌟 |
Number() + isNaN |
⚠️ 易误判:如 isNaN('abc') → true |
== |
🌟 |
Abstract Equality |
❌ NaN,⚠️ 类型自动转换,易出错 |
|
|
|
|
//两种等于号
console.log("== vs ===");
console.log(0 == '0'); // true ✅ 类型转换
console.log(0 === '0'); // false ❌ 类型不同
//判断 NaN
console.log("\nNaN 测试");
console.log(NaN == NaN); // false ❌
console.log(NaN === NaN); // false ❌
console.log(Object.is(NaN, NaN)) // true ✅
console.log(isNaN('hello')); // true ⚠️ 易误判
console.log(Number.isNaN('hello')) // false ✅ 不会误判
console.log(Number.isNaN(NaN)); // true ✅
//区分+0 -0
console.log("\n+0 / -0 测试");
console.log(+0 === -0); // true ✅ 不区分
console.log(Object.is(+0, -0)); // false ✅ 区分
//indexOf vs includes 对 NaN 的处理
console.log("\nindexOf vs includes 对 NaN 的处理");
let arr = [1, 2, NaN];
console.log(arr.indexOf(NaN)); // -1 ❌ 无法找到 NaN
console.log(arr.includes(NaN)); // true ✅ 能找到 NaN
//indexOf vs includes 对 +0/-0 的处理
console.log("\nindexOf vs includes 对 +0/-0 的处理");
let arr2 = [+0, -0];
console.log(arr2.indexOf(-0)); // 0 ✅ 视作相等
console.log(arr2.includes(-0)); // true ✅ 视作相等
let arr3 = [+0];
console.log(arr3.indexOf(-0)); // 0 ✅ 视作相等
console.log(arr3.includes(-0)); // true ✅ 视作相等
//Object.is 和 includes 的 SameValue 对比
console.log("\nObject.is 和 includes 的 SameValue 对比");
console.log(Object.is(42, 42)); // true ✅
console.log(Object.is('a', 'a'));// true ✅
console.log(Object.is([], [])); // false ❌(引用不同)
let arr4 = [1,2,3];
let arr5 = arr4;
console.log(Object.is(arr4,arr5)); //true ✅引用相同
