繁体   English   中英

使用intanceof over typeof时“太多递归”错误?

[英]“Too much recursion” error when using intanceof over typeof?

我正在创建一个函数将对象中的所有日期转换为字符串,当我使用以下函数时,我在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将函数原型化为函数,当对函数进行循环递归时会导致无限循环。

(首先,让我说我在FF 3.5.7上尝试了你的代码并且它没有遇到无限递归。也许你使用了不同的输入示例?)

无论如何,回答你的问题:

(a)为什么你得到无限递归? 因为对象可能指自己。 如果of==o然后调用你的函数o将触发对后续调用of实际上是o等等...

(b)为什么两个版本之间存在差异? obj instanceof Object检查obj是Object的实例还是其子类的实例。 鉴于每个Javascript对象都继承自Object,那么这种情况很简单,因此毫无意义。 净结果是第一个if总是成功的话。 另一方面, typeof obj == "object"检查obj是Object的实例。 这可能是错误的,例如,如果obj是String的实例(在这种情况下, typeof obj产生String )。 因此,差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM