【发布时间】:2019-07-12 22:46:28
【问题描述】:
in operator 只能用于非原始值。尝试对原语使用 in 运算符会引发 TypeError。
示例函数:
function isFoo(value) {
return value && 'foo' in value;
}
TypeError: 无法使用 'in' 运算符在 原始值中搜索 'foo'
有几种方法可以避免这个问题:
-
类型检查
这种方法似乎是最合适的,因为它形式化了原语无效的事实。但它很长。
function isFoo(value) {
const type = typeof value;
return value
&& type !== 'string'
&& type !== 'number'
&& type !== 'boolean'
&& 'foo' in value;
}
-
字体转换
这种方法比上一种方法更短,可以完成相同的工作,但会增加性能开销。
function isFoo(value) {
const obj = Object(value);
return value && 'foo' in obj;
}
-
hasOwnProperty
这种方法根本不使用in运算符,而是使用基元上可用的hasOwnProperty方法。但它更长。
function isFoo(value) {
return value && value.hasOwnProperty('foo');
}
但是,我想知道使用 try-catch 块的最后一种方法是否可靠或合适。
尝试...抓住
function isFoo(value) {
try {
return value && 'foo' in value;
} catch {
return false;
}
}
我担心的是,例如,某些 JS 实现可能不会因滥用 in 运算符而引发可捕获的异常。我也不确定故意允许 TypeError 异常是否会对性能产生影响。
使用 try-catch 方法是否不明智?
【问题讨论】:
-
JavaScript 不支持类型转换。
Object(value)不是类型转换,它为原始值创建一个正确类型的对象。所有原始类型都可以使用文字来表示,但它们也有扩展Object的类型。文档解释说:“在非构造函数上下文中调用时,Object 的行为与 new Object() 相同。” -- developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… -
类型转换是示例的目的,但是,这感觉像是一个不必要的挑剔。
-
const isObject = value => typeof value === "object" && value!==null, isFoo = value => isObject(value) && 'foo' in value;怎么样
标签: javascript