我正在制作一个将对象中的所有日期转换为字符串的函数,当我使用以下函数时,我在 FF 中遇到错误“太多递归”。 (它在 IE 和 chrome 中也失败了)
function datesToString(obj) {
if (obj instanceof Object) {
if (obj instanceof Date) {
obj = "this part does not matter";
} else {
for (var key in obj) { obj[key] = datesToString(obj[key]); }
}
}
return obj;
}
但是当我将其更改为使用 typeof 时它工作正常吗?
function datesToString(obj) {
if (obj && typeof obj == "object") {
if (obj instanceof Date) {
obj = "this part does not matter";
} else {
for (var key in obj) { obj[key] = datesToString(obj[key]); }
}
}
return obj;
}
应该是等量的递归。我错过了什么吗?为什么我在第一个示例中遇到错误,而在第二个示例中却没有?
更新: 这是我使用的对象的示例(json 格式)
Contact = {
"LContactID": "00000000-0000-0000-0000-000000000000",
"CellPhone": "",
"HomePhone": "4564564560",
"OtherPhone": "",
"BirthDate": new Date(-62135575200000),
"SSN": "456456456",
"HowToContact": 1,
"ContactType": 3,
"Address1": "123 test",
"Address2": "apt. 1",
"City": "Valparaiso",
"State": "IN",
"Zip": "46383",
"FullAddress": "123 test, apt. 1",
"BuilderID": "",
"FullAddressWithCityState": "123 test\r\napt. 1\r\nValparaiso, IN 46383",
"WorkHours": "9-5",
"ContactTime": "",
"ContactMethod": "???",
"IsMilitaryOrSelfEmployed": false,
"AlternateContactName": "",
"AlternateContactPhone": "",
"ContactID": "00000000-0000-0000-0000-000000000000",
"Password": null,
"FirstName": "updatetest",
"MiddleName": null,
"LastName": "test_",
"Suffix": null,
"EmailAddress": null,
"EmailAddressAlternate": null,
"WorkPhone": "6546546540",
"WorkPhoneExt": null,
"CreatedOn": new Date(1263597309000),
"CreatedOnOverride": new Date(-62135575200000),
"ModifiedOn": new Date(1264014749000),
"SCRep": "",
"HBCRep": "",
"PPPRep": "",
"DPSRep": "",
"DRSRep": "",
"RDRep": "",
"OwnerID": "00000000-0000-0000-0000-000000000000",
"FullName": "updatetest test_",
"ImportID": 0,
"IncludeEmail": false,
"PreferredLanguage": 1,
"CarbonCopyList": [],
"HearAboutUs": 5,
"HearAboutUsOther": "",
"init": function() { },
"update": function() { },
"load": function() { }
}
看起来当我删除方法参数(init、update 和 load)时它可以与 instanceof 示例一起使用。
更新:事实证明这是一个 ASP.Net ScriptManager 问题。很抱歉没有包括我正在使用 ASP.Net 网站这一事实。ASP.Net ScriptManager 将方法原型(prototype)化为 Function,这在对函数执行递归 for in 循环时会导致无限循环。
最佳答案
(首先,让我说我在 FF 3.5.7 上试过你的代码,它没有遇到无限递归。也许你使用了不同的输入示例?)
无论如何,回答你的问题:
(a) 为什么会得到无限递归?因为一个对象可能会引用它自己。如果 o.f==o
然后在 o
上调用您的函数将触发对 o.f
的后续调用,实际上是 o
等等……
(b) 为什么两个版本之间存在差异? obj instanceof Object
检查 obj 是 Object
的实例还是子类 的实例。假设每个 Javascript 对象都继承自 Object,那么这个条件是平凡的,因此是没有意义的。最终结果是第一个 if
总是成功。另一方面,typeof obj == "object"
检查 obj 是否是 Object 的一个实例。这可能是错误的,例如,如果 obj
是 String 的一个实例(在这种情况下 typeof obj
产生 String
)。因此,差异。
关于asp.net - 在 typeof 上使用 instanceof 时出现 "Too much recursion"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2103486/