Javascript 如何在方法中处理长度为1且大于1的对象而无需重新一致性

Javascript 如何在方法中处理长度为1且大于1的对象而无需重新一致性,javascript,Javascript,我正在编写自己的JavaScript绑定方法(用于实践),在这种方法中,我很难摆脱以不同方式处理单个对象和多个对象的需要,这仅仅是因为我需要遍历长度大于1的对象。(见下文obj与obj[i]) 有什么方法可以减少这种绑定方法的冗余感吗?(请假设不可能使用其他库..谢谢) var foo=(函数(){ 返回{ 绑定:函数(对象、类型、处理程序、委托){ var delegate=delegate | | false, len=物体长度; 如果(对象类型==‘未定义’){ 返回false; } 如果

我正在编写自己的JavaScript绑定方法(用于实践),在这种方法中,我很难摆脱以不同方式处理单个对象和多个对象的需要,这仅仅是因为我需要遍历长度大于1的对象。(见下文obj与obj[i])

有什么方法可以减少这种绑定方法的冗余感吗?(请假设不可能使用其他库..谢谢)

var foo=(函数(){
返回{
绑定:函数(对象、类型、处理程序、委托){
var delegate=delegate | | false,
len=物体长度;
如果(对象类型==‘未定义’){
返回false;
}
如果(len>1){
对于(变量i=0;i
您可以将其强制放入阵列中:

if (!('length' in obj))
    obj = [ obj ];

for (var i = 0; i < obj.length; i++) {
    if (obj[i].addEventListener) {
        obj[i].addEventListener(type, handler, delegate); // false: bubble (^). true: capture (v).
    } else if (obj[i].attachEvent) {
        obj[i].attachEvent('on' + type, handler);
    } else {
        obj[i]['on' + type] = handler;
    }
}
if(!('length'在obj中))
obj=[obj];
对于(变量i=0;i
如果不完全理解代码,我会说,如果只有一个对象,它应该仍然包含在一个数组中,因此会发生一次迭代。应该没有必要考虑这种特殊情况

您应该检查单数情况,并将其转换为具有单个条目的数组:

if (obj.constructor.toString().indexOf("Array") == -1) {
    obj = [obj];
}

您可以测试
obj
以查看它是否具有
nodeType
属性。如果是,请将其放置在一个数组中

if( obj.nodeType ) {
    obj = [ obj ];
    //...
或者可以在空数组上执行concat

obj = [].concat(obj);
如果您没有数组,这将为您提供一个数组


因此,您的最终代码可能如下所示:

var foo = (function () {
    return {
        bind: function (obj, type, handler, delegate) {
            var delegate = delegate || false
            if (typeof obj == 'undefined') {
                return false;
            }
            obj = [].concat(obj);
            for (var i = 0, len = obj.length; i < len; i++) {
                if (obj[i].addEventListener) {
                    obj[i].addEventListener(type, handler, delegate); // false: bubble (^). true: capture (v).
                } else if (obj.attachEvent) {
                    obj[i].attachEvent('on' + type, handler);
                } else {
                    obj[i]['on' + type] = handler;
                }
            }
        }
    }
})();
var foo=(函数(){
返回{
绑定:函数(对象、类型、处理程序、委托){
var delegate=delegate | | false
如果(对象类型==‘未定义’){
返回false;
}
obj=[].concat(obj);
对于(变量i=0,len=obj.length;i
带有空数组的Concat obj:

obj = [].concat(obj)

您的代码不适用于单元素数组。我最初设置了getElementByClass()方法,如果实际对象的长度为1,则返回该对象。现在开始觉得这是个愚蠢的想法。这样做基本上就需要运行你们正在谈论的这项检查。20分钟内+1,当我拿回我的选票时。。。(尽管我不喜欢你在if语句中省略了花括号。)对,我假设他可以计算出,如果对象是单数的,将其转换为数组。我将作相应的修改。
obj = [].concat(obj)