asp.net - 在 typeof 上使用 instanceof 时出现 "Too much recursion"错误?

标签 asp.net javascript recursion loops scriptmanager

我正在制作一个将对象中的所有日期转换为字符串的函数,当我使用以下函数时,我在 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/

相关文章:

c# - MVC3 中更新局部 View 的 SetTimeout 随机执行

javascript - 使用 jQuery 删除这个单击的列表元素

java - 将前缀表达式转换为后缀

python - 查找并打印总和为 100 的每个唯一组合,并返回 1 到 100 之间数字的所有此类组合的计数

c++ - 使用同一泰勒级数评估log(1 + x)的递归

.net - 如何跟踪和消除 session 滥用?

asp.net - 用于 Flex 4.6 前端的 ASP.NET 中没有 MVC 框架的 Web API

c# - 显式本地化

javascript - ES6 导入 - 为字符串成员添加别名?

javascript - 在模块之间注入(inject)路由配置