function isValidNumber(value) { // Good return typeof value === 'number' && !isNaN(value); } isValidNumber(Number('Z99')); // => false isValidNumber(5 * undefined); // => false isValidNumber(undefined); // => false isValidNumber(Number('99')); // => true isValidNumber(5 + 10); // => true
除了typeof value === 'number'之外,还多验证!isNaN(value)确保万无一失。
5.instanceof 和原型链
JS 中的每个对象都引用一个特殊的函数:对象的构造函数。
object instanceof Constructor是用于检查对象的构造函数的运算符:
const object = {}; object instanceof Object; // => true const array = [1, 2]; array instanceof Array; // => true const promise = new Promise(resolve => resolve('OK')); promise instanceof Promise; // => true
现在,咱们定义一个父类Pet和它的子类Cat:
class Pet { constructor(name) { this.name; } } class Cat extends Pet { sound = 'Meow'; } const myCat = new Cat('Scratchy');
现在,尝试确定myCat的实例
myCat instanceof Cat; // => true myCat instanceof Pet; // => true myCat instanceof Object; // => true
instanceof运算符表示myCat是Cat,Pet甚至Object的实例。
instanceof操作符通过整个原型链搜索对象的构造函数。要准确地检测创建对象的构造函数,需要检测 constructor 属性
myCat.constructor === Cat; // => true myCat.constructor === Pet; // => false myCat.constructor === Object; // => false
只有myCat.constructor === Cat的计算结果为true,表示 Cat 是 myCat实例的构造函数。
6. 总结
运算符typeof和instanceof 用于类型检查。 它们尽管易于使用,但需要注意一些特殊情况。
需要注意的是:typeof null等于'object'。 要确定变量是否包含非null对象,需要显示指明null:
typeof myObject === 'object' && myObject !== null
检查变量是否包含数组的最佳方法是使用Array.isArray(variable)内置函数。
因为undefined是虚值的,所以我们经常直接在条件句中使用它,但这种做法容易出错。更好的选择是使用prop in object来验证属性是否存在。
使用双问号操作系符号object.prop ?? def 或者 { prop = def } = object 来访问可能丢失的属性。
NaN是一个类型为number的特殊值,它是由对数字的无效操作创建的。为了确保变量有正确的数字,最好使用更详细的验证:!isNaN(number) && typeof number === 'number'。
最后,请记住instanceof通过prototype链搜索实例的构造函数。如果不知道这一点,那么如果使用父类验证子类实例,可能会得到错误的结果。
代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
您可能感兴趣的文章: