如何在JavaScript中检查对象是否为arguments对象?
我处于ES5严格模式,因此解决方案如何在JavaScript中检查对象是否为arguments对象?,javascript,Javascript,我处于ES5严格模式,因此解决方案 function isArguments(item) { return item.callee !== undefined; } 不幸的是,这不起作用。是正确的,但一些解释可能有用 function isArguments( item ) { return Object.prototype.toString.call( item ) === '[object Arguments]'; } 在ECMAScript 5中,Arguments对象
function isArguments(item) {
return item.callee !== undefined;
}
不幸的是,这不起作用。是正确的,但一些解释可能有用
function isArguments( item ) {
return Object.prototype.toString.call( item ) === '[object Arguments]';
}
在ECMAScript 5中,Arguments对象的唯一特征是其内部[[Class]],如图所示:
调用CreateArgumentsObject时,将执行以下步骤
执行:
- 让obj成为创建新ECMAScript对象的结果
- 将obj的[[Class]]内部属性设置为
“Arguments”
- 返回obj
“参数”
,[…]之外的任何字符串值
因此,要识别Arguments对象,只需检查其类
您可以使用以下方法完成此操作:
- 让O作为调用的结果,将this值作为参数传递
- 设class为O的[[class]]内部属性的值
- 返回串接三个字符串的结果字符串值
、class和“[object”
”]”
this
值设置为要检查的对象来调用该方法。当且仅当返回的字符串是Arguments对象时,返回的字符串将是“”[对象参数]”
Object.prototype.toString.call(obj) == '[object Arguments]'
请注意,这并不是万无一失的,因为全局对象
可能已被本地对象遮挡,或者全局对象
或其toString
属性可能已被修改
但是,没有更好的方法:
请注意,本规范不提供任何程序方法
除了通过Object.prototype.toString
访问该值外(请参阅
)
生成和比较字符串以确定对象的类型有点模糊。就像@bergi建议的那样,我认为这样做更方便。浓缩成一个函数,它是:
function isArguments(value) {
return !!value && typeof value == 'object' && Object.prototype.hasOwnProperty.call(value, 'callee') && !Object.prototype.propertyIsEnumerable.call(value, 'callee');
}
任何特定的引擎或解决方案都必须是通用的吗?您是否只想检查具有
length
属性的对象
?请注意,即使在非严格模式下,上述方法也不完全可靠:警报(isArguments({“被调用方”:“测试”)
-我同意alex的观点,即检查length
属性是一种合理的折衷方法。+1。请注意,和库将其作为一个辅助函数提供。.isArguments
。请注意,ES6添加了,它提供了一种自定义对象.prototype.toString
结果的方法。因此,在最新版本的JavaScript中有可能打破这一检查。