特点
typeof、Array.isArray、Object.prototype.toString等let num = 1; num = '1'优缺点分析
如何在“无类型声明”的语言中构建可靠系统? 防御式编程!
| 层级 | 工具/方法 | 作用 |
|---|---|---|
| 运行时安全 | typeof、Array.isArray、Object.prototype.toString | 基本类型检测 |
| 模式守护 | Type Guard 函数、instanceof、Symbol.for('type') | 防止类型伪装 |
| 静态预检 | TypeScript | 编译期拦截错误,提前发现逻辑漏洞 |
示例:运行时类型守卫
const type = {
isNumber: (val) => typeof val === 'number',
isString: (val) => typeof val === 'string',
isArray: (val) => Array.isArray(val),
isObject: (val) => val !== null && typeof val === 'object',
isFunction: (val) => typeof val === 'function',
};
function input(data) {
if (type.isNumber(data)) // TODO
else if (type.isString(data)) // TODO
else if (type.isArray(data)) // TODO
else throw new Error('Unsupported type');
}
console.log(input(5));有 7 种原始数据类型(又叫简单数据类型、基本数据类型、值类型)
| 基本数据类型 | 含义 | 说明 |
|---|---|---|
| Undefined | 未定义 | 未声明的变量或声明过但未赋值的变量,当然也可以赋值为 undefined |
| Null | 空值 | 表示空对象指针 |
| Boolean | 布尔 | true/false |
| Number | 数值 | IEEE 754 双精度浮点数使用 64 位来表示:符号,指数,尾数 |
| String | 字符串 | 可以访问指定位置的字符,但不能修改 |
| Symbol | 符号 | 唯一值 |
| Bigint | 大整数 | 任意精度整数 |
除此以外都是复杂数据类型(Object 类型及其派生类型)。
运算过程中自动进行类型的转换,内部称为抽象操作
Javascript 的类库已经默认挂载在了全局对象上了。
该类库又称为: