"Too much recursion" error when using intanceof over typeof?

asp.net, javascript, loops, recursion, scriptmanager

Solution

(First, let me say that I tried your code on FF 3.5.7 and it didn't run into an infinite recursion. maybe you used a different input example?)

Anyway, to answer your questions:

(a) Why do you get an infinite recursion? Because an object may refer to itself. If `o.f==o` then calling your function on `o` will fire a subsequent call on `o.f` which is actually `o` and so on...

(b) Why the difference between the two versions? `obj instanceof Object` checks if obj is an instance of `Object` or an instance of a subclass thereof. Given that every Javascript object inherits from Object then this condition is trivially true, and is thus meaningless. Net result is that the first `if` always succeeds. On the other hand `typeof obj == "object"` checks that obj is an instance of Object. This may be false, for example, if `obj` is an instance of String (at which case `typeof obj` yields `String`). Hence, the difference.

Problem

I was making a function to convert all dates in an object to strings and when I used the following function I got a error in FF "too much recursion". (It also fails in IE and 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; } ``` but when I changed it to use typeof it worked fine? ``` 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; } ``` It should be the same amount of recursion. Am I missing something? Why am I getting an error with the first example but not the second? Update: here is an example of the object I was using (in json form) ``` 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() { } } ``` It looks like when I remove the method parameters (init,update and load) it works with the instanceof example. UPDATE: This is a ASP.Net ScriptManager problem it turns out. Sorry for not including the fact that I was working with an ASP.Net website.The ASP.Net ScriptManager prototypes methods to Function which causes an infinity loop when doing a recursive for in loop on a function.

Original source