如何检查对象是否是 JavaScript 中的参数对象
How do I check whether an object is an arguments object in JavaScript?
我处于 ES5 严格模式,所以解决方案
function isArguments(item) {
return item.callee !== undefined;
}
不幸的是不起作用。
function isArguments( item ) {
return Object.prototype.toString.call( item ) === '[object Arguments]';
}
威廉的回答是正确的,但一些解释可能是有用的。
在 ECMAScript 5 中,唯一表征参数对象的是它们的内部 [[Class]],如 §10.6 参数对象所示:
[当调用 CreateArgumentsObject 时,以下步骤是 执行:
- 让 obj 成为创建一个新的 ECMAScript 对象的结果。
- 将 obj 的 [[类]] 内部属性设置为
"Arguments"
。- 返回对象
[Class]] 是所有对象通用的内部属性,其值是用于对对象进行分类的字符串。这在 §8.6.2 对象内部属性和方法中有解释:
[[类]] 内部属性的值由此定义 每种内置对象的规范。
[[类]] 内部属性的值在内部用于 区分不同种类的对象。
此外,请注意,主机对象不会有问题:
主机对象的 [[Class]] 内部属性的值可以是 除
"Arguments"
之一之外的任何字符串值 , [...]
因此,要标识 Arguments 对象,只需检查其类。
您可以使用 §15.2.4.2 Object.prototype.toString
来执行此操作:
- 设 O 是调用 ToObject 的结果,将此值作为参数传递。
- 设 class 是 O 的 [[Class]] 内部属性的值。
返回字符串值,- 该值是连接三个字符串
"[object "
、类和"]"
的结果。
因此,可以使用 Function.prototype.call
调用该方法,并将this
值设置为要检查的对象。返回的字符串将'[object Arguments]'
当且仅当它是 Arguments 对象时。
Object.prototype.toString.call(obj) == '[object Arguments]'
请注意,这并非完全万无一失,因为全局Object
可能已被局部遮蔽,或者全局Object
或其toString
属性可能已被修改。
但是,没有更好的方法:
请注意,此规范不为程序提供任何方法 以访问该值,但通过
Object.prototype.toString
除外(请参阅 15.2.4.2(。
生成和比较字符串以确定对象的类型有点模糊。就像@bergi建议的那样,我认为Lodash以一种更方便的方式做到这一点。 浓缩为一个函数,它是:
function isArguments(value) {
return !!value && typeof value == 'object' && Object.prototype.hasOwnProperty.call(value, 'callee') && !Object.prototype.propertyIsEnumerable.call(value, 'callee');
}
- 检查对象是否是mongo游标
- 在node.js/ssocket.io中,如何判断对象是否是套接字的实例
- 是否有跨浏览器和跨框架的方法来检查对象是否是HTML元素
- 如何检查一个对象是否是“;深空”;
- 如何检查一个对象是否是“;子对象“;在Javascript中
- 基于 html5 数据属性值创建 JavaScript 对象是否是一种好的做法
- 测试对象是否是 Google 闭包类框架中接口的实现
- 查找一个对象是否是 javascript 中另一个对象的子集
- 有没有办法在我的单元测试中测试一个对象是否“是”Backbone.Model
- 如何在 Rhino 中检查对象是否是 JavaScript 对象
- 为什么JavaScript中没有一个内置的方法来检查一个对象是否是普通对象?
- 如何检查一个对象是否是JavaScript中某一组原型的实例?
- 如何检查对象是否是 JavaScript 中的参数对象
- 如何判断一个对象是否是RegExp对象
- 找出一个对象是否是数组的最好方法是什么?
- 如何检查一个对象是否是一个特定的属性
- 检查对象是否是一个IsConstructor
- 检查一个对象是否是一个有希望的函数
- 检查对象是否是一个文本框javascript
- 一种检查对象是否是window.constructor实例的干净方法