本声明
if ('foo' in bar)
如果bar
是字符串,会抛出TypeError。我认为对于其他类型的对象可能会有相同的错误。
如何判断bar
是否是支持in
运算符的对象?
这段代码是不够的:如果foo
是一个字符串,它会传递给in
语句并抛出。
if (foo instanceof Object && ! (foo instanceof String))
{
if ('foo' in foo) {}
}
答案 0 :(得分:2)
in
operator抛出TypeError是右操作数不是对象。
您可以使用
检查值是否为对象Object(value) === value;
此外,in
运算符调用内部[[HasProperty]]方法。 For ordinary objects it should never throw,但在一些奇特的物体中可能就是这种情况。例如,
var proxy = new Proxy({}, {has: () => {throw "Can't use `in`"}});
"property" in proxy; // Error: Can't use `in`
为了处理这些情况,我认为您只能使用try
语句ringø suggested。
答案 1 :(得分:0)
var o = {};
console.log(o.constructor === Object && o !== null); //true
答案 2 :(得分:0)
捕获任何错误
try {
if ('foo' in bar) {
}
}
catch(e) {
// 'foo' is not in bar
}
或者如果您只想捕捉 'foo' in bar
错误
var inbar = false;
try { if ('foo' in bar) inbar = true; }
catch(e) {}
if (inbar) {
...
}
答案 3 :(得分:0)
如何检测在Javascript中使用
in
运算符是否安全?
ShiftExpression中的生产RelationalExpression:RelationalExpression评估如下:
- 让lref成为评估RelationalExpression的结果。
- 让lval成为GetValue(lref)。
- 让rref成为评估ShiftExpression的结果。
- 让rval为GetValue(rref)。
- 如果Type(rval)不是Object,则抛出TypeError异常。
- 使用参数ToString(lval)返回调用[[HasProperty]] rval内部方法的结果。
醇>
强调我的。
在ES5 Type()
中可以
为防止TypeError
发生,您必须确保
undefined
null
true
或false
EcmaScript 2015也引入了Symbol
类型。
示例函数可能如下所示:
function canCallIn(arg) {
if (arg === null ||
arg === undefined)
return false;
switch (typeof arg) {
case 'boolean':
case 'string':
case 'symbol':
case 'number':
return false;
}
return true;
}
虽然您可以进行各种优化。