为什么要使用toString()来对可以使用typeof进行检查的参数进行类型检查
Why use toString() to typecheck args that you can check with typeof?
我理解为什么需要使用Object.prototype.toString()
或String()
进行类型检查数组,但typeof是否足以进行类型检查函数和字符串?例如,Array.isArray的MDN上的polyfill使用:
Object.prototype.toString.call(arg) == '[object Array]';
在数组的情况下,这一点非常清楚,因为您不能使用typeof
来检查数组。Valentine使用实例:
ar instanceof Array
但是对于字符串/函数/布尔值/数字,为什么不使用typeof
呢?
jQuery和Undercore都使用类似的东西来检查函数:
Object.prototype.toString.call(obj) == '[object Function]';
这难道不等于这样做吗?
typeof obj === 'function'
甚至是这个?
obj instanceof Function
好吧,我想我已经明白了为什么你会看到toString
的用法。考虑一下:
var toString = Object.prototype.toString;
var strLit = 'example';
var strStr = String('example');
var strObj = new String('example');
console.log(typeof strLit); // string
console.log(typeof strStr); // string
console.log(typeof strObj); // object
console.log(strLit instanceof String); // false
console.log(strStr instanceof String); // false
console.log(strObj instanceof String); // true
console.log(toString.call(strLit)); // [object String]
console.log(toString.call(strStr)); // [object String]
console.log(toString.call(strObj)); // [object String]
我能想到的第一个原因是typeof null
返回object
,这通常不是你想要的(因为null
不是一个对象,而是一个类型)。
但是,Object.prototype.toString.call(null)
返回[object Null]
。
但是,正如您所建议的,如果您希望某个字符串或其他类型能够很好地与typeof
配合使用,我认为您没有理由不使用typeof
(在这种情况下,我经常使用typeof
)。
您提到的库使用所选方法的另一个原因可能只是为了保持一致性。您可以使用typeof
来检查Array
,因此请使用另一种方法并始终坚持该方法。
有关更多信息,Angus Croll有一篇关于typeof
运算符的优秀文章。
相关文章:
- ajax在输入等于null时进行检查
- 通过Javascript将HTML中的电话号码与URL参数进行交换
- 从id标记中的文本进行检查,并将类添加到另一个标记中
- vue-js-单选按钮won't默认情况下使用v-model属性进行检查
- 使用Router()参数进行快递
- hasOwnProperty 在对照父对象属性进行检查时返回 true
- 对“参数”进行原型设计
- 设置计时器并使用javascript/PHP进行检查
- 如何使用默认值对参数进行解结构
- jQuery可以't对作为URL的参数进行编码
- 如何将mysql值附加到单选按钮并进行检查
- 如果未选择警报,则从动态创建的多个淹没中进行检查
- 如何使用 Muse 参数进行布尔比较以运行 JS 函数
- 在转到 URL 之前进行检查的按钮
- 余烬数据:防止对查询参数进行编码
- 骨干路由器无法通信并发送 url 参数进行查看
- 当需要(“http”)时发生了什么.Server() 以 Express 应用程序作为其参数进行评估
- 设置 HTML 复选框以使用 javascript 进行检查
- 将值存储在会话变量中,并对其进行检查
- 为什么要使用toString()来对可以使用typeof进行检查的参数进行类型检查