【问题标题】:Finding sub properties of javascript object查找 javascript 对象的子属性
【发布时间】:2011-03-22 11:45:44
【问题描述】:

我的代码是这样的:

var cem = { "name": "cem topkaya" };
f_PropertyBul(cem);
function f_PropertyBul(obj) {

    for (var prop in obj) {

        document.writeln(obj + " prop: " + prop + " propertyIsEnumerable:" + obj.propertyIsEnumerable(prop) + "<br/>");

        if (obj.propertyIsEnumerable(prop)) {            
            f_PropertyBul(obj[prop]);            
        }

    }
 }

我知道对此有很多问题和答案,但我不明白为什么会得到这个结果:

[object Object] prop: isim enumaret: true
cem topkaya prop: 0 enumaret: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
c prop: 0 propertyIsEnumerable: true
.
..
....

最后,我以字符串形式到达最后一个属性。但它仍然说它有 propertyIsEnumareble true 。

我只想发送一个对象并搜索一个属性名称及其值。当它发现我只想中断搜索并返回我的 JSON 对象的一个​​属性。

【问题讨论】:

  • enumaret 应该是什么意思?什么是内斯?您是否有意将变量的名称传递给 nesne 的方法,而不是变量的值?
  • 对不起,我忘了更改它们。现在我觉得好多了。我正在从 Web 服务发送一个对象作为 JSON 对象。当客户端收到来自 Web Service 的响应时,它会转入对象以查找 Error/Exception 对象。然后它会自动生成错误信息来显示。我试图在 ajax 调用后收到的对象中找到错误/异常对象属性。在本教程中,我将字符串数组的第一个元素作为属性(c),但这只是一个字符串“cem topkaya”,它没有任何属于 obj 变量的属性。但它总是显示“c”。

标签: javascript properties attributes


【解决方案1】:

字符串是可枚举的。例如:

var str = "string"
for (var c in str) {
   console.log(str[c]);
}

返回:

s
t
r
i
n
g

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/propertyIsEnumerable

该方法可以判断一个对象中的指定属性是否可以被for...in循环枚举

如果要排除字符串,请在 if 语句中添加对 typeof prop !== "string" 的检查。

【讨论】:

  • 字符串字符并非在所有浏览器中都可枚举。此外,for...in 将返回添加到字符串或其原型的任何属性。
  • @Andy E:也许吧。但我相信根据 ECMAScript 规范,字符串是可枚举的。此外,由于它仅用于演示目的,我没有看到需要进行 hasOwnProperty 检查。 OP 也不需要 hasOwnProperty 检查,因为 propertyIsEnumerable 无论如何都不应该与继承的属性一起使用。哪些浏览器特别是字符串不可枚举?由于我通常只安装最新的浏览器,我通常对跨浏览器问题一无所知,默认情况下参考规范。
  • IE8 及更低版本不支持可枚举字符串。它最近才被添加到 ECMA-262 规范(第 5 版)中,因此基于第 3 版的旧浏览器将不支持它,但引入了该功能的 Firefox 除外。 FWIW,IE9 的平台预览支持它。原型链上的“继承”属性可枚举的(随意测试),除非您明确将它们定义为不可枚举(也仅限 ECMA-262 5th)。
  • @Andy E: propertyIsEnumerable 不应根据 ECMA-262 规范使用原型链中的属性。第 15.2.4.7 节:“此方法不考虑原型链中的对象。”最新版本的 Firefox 和 Chrome 似乎遵循规范。以下在 Chrome 和 FF 中返回 false:({ prototype: { enum: [1,2,3] } }).propertyIsEnumerable("enum")
  • @Daniel:for...in 将枚举添加到原型链的自定义属性,但不会枚举本机函数和方法——它们不可枚举(除了 IE 和 Chrome 中的奇怪错误)。见stackoverflow.com/questions/2257993/…。您添加到原型链中的任何属性或方法(还有很多 String.prototype 扩展)都将被 for...in 迭代。
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2023-03-27
相关资源
最近更新 更多