javascript数据类型判断和值判断
2024-05-19 20:59:56
浏览:46
评论:0
javascript数据类型判断和值判断
在日常开发中,常用的判断数据类型的方法有typeof、Object.prototype.toString等等。常用的值判断的方式有三元条件运算、!=、==、!==、===等等。为了对上述这些方法有深刻理解,本文就判断数据类型和值判断的方法进行深入分析。
数据类型判断
typeof、instanceof、constructor、Object.prototype.toString
属性 | 优点 | 缺点 |
---|---|---|
typeof | 简单易用,可用于基本类型判断,如number, string, boolean, undefined, function, bigint, symbol和object | 无法区分null和其他对象、不区分原始值和对象包装器 |
instanceof | 用于判断一个对象是否是某个构造函数的实例或其子类的实例 | 不适用于基本类型,且构造函数必须在当前作用域中可用。 |
constructor | 可以在某种程度上判断对象的构造函数。 | 不适用于基本类型。构造函数可以被篡改,所以不是完全可靠。 |
Object.prototype.toString | 最准确的判断方法,返回格式为'[object Type]',如'[object Array]',适用于所有类型,包括基本类型和引用类型。 | 相对繁琐,性能略低于其他方法。 |
isXXX判断
- isNaN(): 检查一个值是否为NaN(Not-a-Number)。例如:isNaN("Hello") 返回 true。
- isFinite(): 检查一个值是否为有限数(非无穷大、非无穷小、非NaN)。例如:isFinite(Infinity) 返回 false。
- isPrototypeOf(): 用于检查一个对象是否存在于另一个对象的原型链上。例如:Array.prototype.isPrototypeOf([]) 返回 true。
- isExtensible(): 检查一个对象是否可以扩展,即是否可以向该对象添加新的属性。例如:Object.isExtensible({}) 返回 true。
- isSealed(): 检查一个对象是否密封,即是否不可扩展且所有现有属性都是不可配置的。例如:Object.isSealed(Object.freeze({})) 返回 true。
- isFrozen(): 检查一个对象是否冻结,即是否不可扩展、所有属性都是不可配置且所有数据属性都是只读的。例如:Object.isFrozen({}) 返回 false,但 Object.isFrozen(Object.freeze({})) 返回 true。
- isInteger(): ES6引入的方法,用于检查一个数值是否为整数。例如:Number.isInteger(42) 返回 true。
- isSafeInteger(): 也是ES6引入的,用于检查一个数值是否为安全整数(即在-(2^53)+1和2^53之间的整数)。例如:Number.isSafeInteger(Math.pow(2, 53)) 返回 false。
- isPrototypeOf(): 这个方法属于对象原型,用于检查一个对象是否存在于另一个对象的原型链上。
请注意,不是所有的isXXX方法都直接挂在全局对象或原型链上,例如isArray是挂在Array构造函数上的,而一些类型检查方法如isInteger、isSafeInteger是挂在Number构造函数上的。了解每个方法的具体使用场景和所属对象对于正确使用它们至关重要。
值判断
常用基本判断三元条件运算、!=、==、!==、===等等在这里不做过多介绍,主要做新语法的一个详解。
(重点)值判断详解
==
比较的两个变量的值===
比较的两个变量的值以及类型
console.log('5' == 5); // 返回 true,因为在比较之前,字符串 '5' 会被转换成数字 5,然后再进行比较。
console.log('5' === 5); // 返回 false,因为一个是字符串类型,另一个是数字类型,即便它们的值看起来一样。
console.log(NaN == NaN); // 返回 false, 任何与 NaN 的比较(包括 NaN == NaN)都应该返回 false。
console.log(NaN === NaN); // 也会返回 false,因为严格相等也遵守 NaN 比较的特殊规则,但它强调了比较的严格性。
新增语法?:
和??
和?.
?:
(三元条件运算符) 的简写。??
(空值合并运算符)当左侧操作数为null
或undefined
时,返回右侧的操作数,否则返回左侧操作数本身。
// 常用在后端接口返回字段判断
let value = null;
let result = value ?? 'default';
console.log(result); // "default"
?.
(可选链操作符)允许你安全地访问深层嵌套的属性,而不用担心中间某个属性不存在导致的错误。如果路径中任何一个属性不存在,则整个表达式立即短路返回undefined
。
const obj = null;
// let keys = obj.prop.keys; // 报错Uncaught SyntaxError: Identifier 'obj' has already been declared
let keys = obj?.prop?.keys; // undefined