js数组和对象问题

在封装方法的时候发现个问题,颠覆我对数组的看法,直接贴代码:

String.prototype.replaces=function(reg,str){
    var arr = [];
    var newStr= this;
    var i= '';
    var d;
    while((d = reg.exec(newStr))!=null) {
        //debugger
        try{
            //console.log(d)
            if(reg.global){
                arr = newStr.split(d[0]);
                newStr = arr.join(str);
                continue
            }else{
                if(reg.ignoreCase){
                    console.log(d instanceof Array);
                    for(var x of d){
                        console.log(x)
                    }
                }
                break;
            }
            
        }catch(e){
            console.log(e)
        }
        
    }
    return newStr
    
}

var s ="我是a,c,a,cc,c,c,cc".replaces(/a/i,'b')
console.log(s);

把上面代码直接贴到控制台就可以测试,问题来了,d这个变量,他到底是array还是object

打印出的d:
clipboard.png

console.log(d instanceof Array)得出d是数组,但是用for循环和for of
都只能打印出一个变量,用d[1]访问会报错,d['index']则不会报错反而正确,
如果他是对象数组,则d[1]['index']才会正确吧?

阅读 2.1k
3 个回答

js中并没有真正意义上的数组,你所用的数组是伪数组,实际上是一个对象。
首先你肯定能理解下面这段代码

var a={"index":"1"}
console.info(a["index"])//结果为1

那么这样你理解起来也没问题了

var a={"0":"1"}
console.info(a["0"])//结果为1
console.info(a[0])//更进一步,结果为1

让我们变得更像数组一点


var a={"0":"1","1":"3","2":"1",length:3}

你完全可以自己写一个数组出来

是数组,数组其实也是对象,它上面可以挂载其他属性

var a=[];
a['aa']=1;
a instanceof Array
关联数组
a.length=10;
for(let i of a){console.log(i)}
of是根据length来的 不会遍历到非数字下表

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题