【问题标题】:Error "Cannot call toString on undefined" but variable is defined错误“无法在未定义时调用 toString”但已定义变量
【发布时间】:2011-10-04 08:45:49
【问题描述】:

在这段 Javascript 中

creds = cp[0];
data[creds.toString()] = cp[1]; // data is an object

Chrome 在第二行给我错误TypeError: Cannot call method toString of undefined。但是,我已经通过调试器验证了 creds 的值此时是数字 1400

发生了什么事?

【问题讨论】:

    标签: javascript undefined tostring typeerror


    【解决方案1】:

    Javascript 不需要变量类型,因此可以通过删除 toString() 来实现。

    顺便说一句,我不确定您是否可以将原始类型上的 toString() 称为 int

    【讨论】:

    • data 是一个对象,而不是一个数组,所以我将creds 转换为一个字符串作为键。如果不需要,至少可以让意图更清晰。
    • 你之前应该指定过这个。无论如何,在整数(如果是)上调用 toString() 将停止 Javascript。您是否已经尝试过不使用它?
    • 你可以拥有它 data['' + creeds + ''] (这是两个单引号,如字符串开头字符串结尾)它会将你的号码转换为字符串
    • 文字数字没有任何方法(避免小数点混淆),但var a=[1234] .. a[0].toString() 完全没问题
    • @Alex K 实际上在另一个问题中我看到了像100..toString()100["toString"]() 这样的表达方式
    【解决方案2】:

    在使用for in 循环数组时应该非常小心。改用普通循环。

    数组cpl 不仅有数据,还有函数,所以循环中的第三个cp 是函数。这就是为什么creds 变成未定义的原因。

    这个链接有很好的解释:Why is using "for...in" with array iteration a bad idea?

    【讨论】:

    • 这是新信息。为什么要谨慎?
    • +1 在 for 循环中,您点击 cpl[i] 这是一个方法名称,例如 cpl["copy"]。这会将cp 设置为toString() 方法(因此字符串function (start,length) ...)导致credscreds = cp[0]; 之后变为undefined,因此随后的creds.toString(); 失败。
    • @Alex K @Sangdol 感谢您的解释。我已经在某个地方知道了这一点,但是当我编写循环时并没有想到它。事实证明这确实是问题所在,我错误地调试了它(仅在第一次迭代中检查了值,而错误出现在后面的迭代中)
    猜你喜欢
    • 2020-11-30
    • 2014-10-09
    • 1970-01-01
    • 2018-08-06
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多