javascript - 未定义的 JavaScript 对象构造函数

标签 javascript

多年来我一直在使用我构建的同一个 JavaScript 库,现在我遇到了这个函数的错误:

IsArray : function ()
{
    if (typeof arguments[0] == 'object')
    {
        var criterion = arguments[0].constructor.toString().match(/array/i);
        return (criterion != null);
    }

    return false;
}

有时会在抛出以下错误时调用它:

TypeError: Cannot call method "toString" of undefined

我在定义 criterion 变量之前添加了以下内容以解决此问题:

if (arguments[0].constructor == null || arguments[0].constructor == undefined)
    return false;

但是,我想了解这会如​​何发生或为什么会发生。我不知道为什么具有“对象”类型的变量没有构造函数。在此问题之前,我从未见过它。令我困扰的是,这一切都是在我更新另一个库函数几周后开始的,该库函数检查空值和空字符串以尝试过滤掉空数组(将空数组与空字符串进行比较时,它返回一个匹配项) .

最佳答案

嗯...您可能知道,JavaScript 有时会让人感到有些惊讶。使用 ES3,要确定一个数组是否真的是一个数组一点也不容易。因此,如果您想保留遗留代码,我认为您应该遵循 Douglas CrockfordJavaScript:The Good Parts 中给出的重要提示。

JavaScript does not have a good mechanism for distinguishing between arrays and objects. We can work around that deficiency by defining our own is_array function:

var is_array = function (value) {
  return value && typeof value === 'object' && value.constructor === Array;
};

Unfortunately, it fails to identify arrays that were constructed in a different window or frame. If we want to accurately detect those foreign arrays, we have to work a little harder:

var is_array = function (value) {
  return Object.prototype.toString.apply(value) === '[object Array]';
};

此外,当您使用null 时应该非常小心,因为Object.create(null) 创建了一个没有任何原型(prototype)的对象,typeof null 返回 objectnull == undefined 返回 true...

对于 ES5,最好的解决方案是使用 Array.isArray()

关于javascript - 未定义的 JavaScript 对象构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43616128/

相关文章:

javascript - js如何避免第一个参数必须是字符串或Buffer Node

javascript - 使用 javascript 旋转文本 - 在 IE8 中不起作用

javascript - 如何查看 jQuery 修改后的 HTML Dom?

javascript - html5 canvas 和纯 Javascript/GWT 的游戏性能

javascript - 在 JavaScript 中将数组元素打印到各自的列中

javascript - Ajax HTTP 请求使用请求正文中的数组更改 JSON

javascript - 使用 a4j :commandButton 防止双重提交

javascript - 单击下拉列表中的复选框时如何添加输入字段

javascript - 将 JSON 对象结构转换为 html 输入元素

javascript - 排序功能删除了 jQuery 单击操作