只有被虐了才会发现自己的不足,才能激励自己更好的学习
第一、一个简单的函数
(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;
}
还有其他答案等测试完了再贴出来,欢迎大神提出更好的方法,来让大家一起进步