被虐日記----开心并快乐着的求各种虐

只有被虐了才会发现自己的不足,才能激励自己更好的学习

第一、一个简单的函数

       (function() {
            console.log(a + 1);  //NaN
            var a = 2;
        })();

其实很简单吧,我却把他当成了 undefined1,当做字符拼接了。

第二、闭包的使用

 function A(){
        var funs=[];
        for(var i=0;i<10;i++){
           funs[i]=function(){
               return i;
           }
        }
        return funs; 
    }
    var funs = A();//定义funs[0]-funs[9],10个函数
    console.log(funs[0]());//10
    console.log(funs[1]());//10
    console.log(funs[6]());//10

这里是i是全局变量最后输出的都是一个i。用闭包解决

  function A() {
            var funs = [];
            for (var i = 0; i < 10; i++) {
                var j = i;
                (function(arg) {
                    funs[i] = function() {
                        return arg;
                    }
                })(j)
            }
            return funs;
        }
        var funs = A(); //定义funs[0]-funs[9],10个函数
        console.log(funs[0]()); //0
        console.log(funs[1]()); //1
        console.log(funs[6]()); //6

第三、js数组去重

有这样一个数组,成员都是数字,例如
var a = [1,2,3,4,5,2,3,4,6,7,8…….n];
请实现a.unique()方法,用来给数组a去掉重复值,要求对Array的原型进行扩展方法,并尽可能做到效率最优。

答案一

 var a = [1, 2, 3, 4, 5, 2, 3, 4, 6, 7, 8];
        Array.prototype.unique= function() {
            var b = [],//记录重复数字的位置,
                oa = this.concat(); // 将原来数据赋值给oa数组
            for (var i = 1; i < oa.length; i++) {
                for (var j = 0; j < i; j++) {
                    if (b.indexOf(j) > -1) continue; //如过下表j在数组b中跳出当前循环 
                    if (oa[j] == oa[i]) {
                        b.push(j);
                    }
                }
            }
            this.splice(0, this.length); //将原数组清空成为空数组
            //遍历数组
            for (var i = 0; i < oa.length; i++) {
                //判断下标是否在b中,如果存在则大于-1。则不重新加入数组
                if (b.indexOf(i) > -1) continue;
                this.push(oa[i]);
            }
            return this;
        }
        var d = a.unique();

答案二

var a = [1, 2, 3, 4, 5, 2, 3, 4, 6, 7, 8];
        Array.prototype.unique = function() {
            //遍历数组
            for (var i = 0; i < this.length; i++) {
                //将第i的值赋值给n。
                var n = this[i];
                //从当前数组移除,并不插入null,这里是先去除一种一个,如果这时候还能通过indexof找到,那说明该值不值一个
                this.splice(i, 1, null);
                if (this.indexOf(n) < 0) {
                    //如果不重复则重新插入
                    this.splice(i, 1, n); //不存在重复
                } else {
                    this.splice(i, 1); //存在重复
                }
            }
            return this;
        };
        var d = a.unique();

答案三(目前认为最好的办法)

Array.prototype.unique = function() {
            var result = [this[0]];
            this.sort();
            this.forEach(function(v) {
                v != result[result.length - 1] && result.push(v); //仅与result最后一个元素比较,当不相等的时候,则加到result数组中。
            });
            return result;
        }

还有其他答案等测试完了再贴出来,欢迎大神提出更好的方法,来让大家一起进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值