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;
}
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方法是否不明智?
答案 0 :(得分:0)
就最佳做法而言,如果您适当地使用异常(即仅在真正异常或意外的错误情况下),则它们不太可能对性能造成重大影响,并且完全可以接受。
但是,在您的情况下,依靠try-catch块进行控制流可能会在程序上产生可观的时间成本,尽管它实现了所需的输出,因此不被视为最佳方法。
我建议您改用之前提到的一种方法,可能是第一种。