2

下面的正确结果是什么?是否有任何 ECMA 标准规定了这一点?我目前的 Chrome 14.0.835.186m 认为false和 Firefox 3.6.22 认为true

(new Error()).propertyIsEnumerable("message")

这很烦人,因为 Chrome 以前也这么想true,现在我因为这个变化而破坏了代码。

4

3 回答 3

2

我在规范中找不到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
于 2011-09-26T18:31:24.663 回答
1

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

于 2011-09-26T18:45:47.970 回答
0

正确的结果是错误的,因为 的message属性Error是继承的(我认为来自原型)。

于 2011-09-26T18:31:02.310 回答