下面的正确结果是什么?是否有任何 ECMA 标准规定了这一点?我目前的 Chrome 14.0.835.186m 认为false
和 Firefox 3.6.22 认为true
。
(new Error()).propertyIsEnumerable("message")
这很烦人,因为 Chrome 以前也这么想true
,现在我因为这个变化而破坏了代码。
下面的正确结果是什么?是否有任何 ECMA 标准规定了这一点?我目前的 Chrome 14.0.835.186m 认为false
和 Firefox 3.6.22 认为true
。
(new Error()).propertyIsEnumerable("message")
这很烦人,因为 Chrome 以前也这么想true
,现在我因为这个变化而破坏了代码。
我在规范中找不到ECMAScript 5
任何一种方式都需要它(并不意味着它不存在),但它似乎是可配置的,所以你可以这样做:
Object.defineProperty( Error.prototype,'message',{enumerable:true});
console.log( Error.prototype.propertyIsEnumerable('message') ); // true
或这个:
var err = new Error('a message');
Object.defineProperty( err,'message',{enumerable:true});
console.log( err.propertyIsEnumerable("message") ); // true
propertyIsEnumerable
不会为“内置”返回 true,例如:
Error.prototype.message
或者Array.prototype.length
可枚举属性是直接在对象本身上设置的属性,如 ECMA 262 的第 15.2.4.7 节中所定义,可以在此处下载
例如:
> var arr = [];
> arr.propertyIsEnumerable("length")
false
> arr.kudos = 55;
55
> arr.propertyIsEnumerable("kudos")
true
> var err = new Error("some message");
> err.propertyIsEnumerable("message")
false
> err.Something = { };
{}
> err.propertyIsEnumerable("Something")
true
该propertyIsEnumerable
方法旨在确定可以在for..in
循环中使用什么。
例如:
> for(var key in arr) { console.log(key); }
kudos
> for(var key in err) { console.log(key); }
Something
你用的是propertyIsEnumerable
代替hasOwnProperty
吗?
> err.hasOwnProperty("message")
true
> arr.hasOwnProperty("length")
true
以下是其他一些示例:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable
我的假设是,这些浏览器正在为 ECMAScript 5 合规性而努力。
编辑:
如果您需要所有属性,包括不可枚举的属性,您可以使用Object.getOwnPropertyNames(obj)
. 这是一个将不可枚举属性复制到另一个对象的示例。
> var err = new Error("Some message");
> var copy = { };
> Object.getOwnPropertyNames(err).forEach(function(key) {
... copy[key] = err[key];
... });
> copy
{ stack: 'Error: Some message\n at repl:1:11\n at Interface.<anonymous> (r
epl.js:168:22)\n at Interface.emit (events.js:67:17)\n at Interface._onLin
e (readline.js:153:10)\n at Interface._line (readline.js:408:8)\n at Inter
face._ttyWrite (readline.js:585:14)\n at ReadStream.<anonymous> (readline.js:
73:12)\n at ReadStream.emit (events.js:70:17)\n at onKeypress (tty_win32.j
s:46:10)',
message: 'Some message',
arguments: undefined,
type: undefined }
> copy instanceof Error
false
> err instanceof Error
true
见这里:https ://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects#section_2
正确的结果是错误的,因为 的message
属性Error
是继承的(我认为来自原型)。