Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中检查对象是否为arguments对象?_Javascript - Fatal编程技术网

如何在JavaScript中检查对象是否为arguments对象?

如何在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对象

我处于ES5严格模式,因此解决方案

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
[[Class]]是所有对象共有的内部属性,其值是对对象进行分类的字符串。下文对此进行了解释:

[[Class]]内部属性的值由以下内容定义: 各种内置对象的规范

[[Class]]内部属性的值在内部用于 区分不同种类的物体

此外,请注意,宿主对象不会有问题:

宿主对象的[[Class]]内部属性的值可能是 除了一个
“参数”
,[…]之外的任何字符串值

因此,要识别Arguments对象,只需检查其类

您可以使用以下方法完成此操作:

  • 让O作为调用的结果,将this值作为参数传递
  • 设class为O的[[class]]内部属性的值
  • 返回串接三个字符串的结果字符串值
    “[object”
    、class和
    ”]”
因此,您可以使用将
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中有可能打破这一检查。