学习js有一段时间,但是没有完完整整的看完一本原生js的书,或许有,但也是匆匆扫过,近期将重新阅读js经典书《javascript高级程序设计》,希望从中能够获得新的知识。
所以强烈要求自己写下笔记,笔记内容虽然很简单,但是却也是学习过程中必不可少的一部分,会不定时更新,如果有什么欠缺的地方欢迎提出,同时也希望可以和众大神、萌新们一起学习!
这一篇笔记主要涉及数组的一些小知识。
1.全局对象在函数重置对象不受影响
全局对象作为参数传入函数,在函数内部重置参数对象,最后全局对象不受影响。
函数内部修改的对象即为局部对象,在函数执行完成之后,改局部对象变会立刻被撤销。
如下所示:
function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
console.log("obj name:",obj.name);//Greg
}
var person = new Object();
setName(person);
console.log(person.name);//Nicholas
注:上述person全局对象并未受到函数内部重置对象影响
2. 数组小知识
- pop()
例子:
var aar = ['a','b'];
aar.pop();//移除最后一项,返回移除项
- push()
例子:
var aar = ['a','b'];
aar.push('d','c'); //添加到数组末尾,返回修改后数组长度
- shift()
例子:
var aar = ['a','b'];
aar.shift();//移除第一项,返回移除项
- unshift()
例子:
var aar = ['a','b'];
aar.unshift('c','s');//添加到数组前面,返回修改后数组长度
- conact()
例子:
var aar = ['a','b'];
aar.conact('c');//连接数组 生成新的数组
aar.conact(['d','e']);
console.log(aar);//打印结果:['a','b','c','d','e']
- slice()
例子:
var aar = ['a','b','c','d','e'];
aar.slice(1); // 生成新数组 ['b','c','d','e']
aar.slice(1,4); // 生成新数组 ['b','c','d']
//可以接收一或两个参数
- splice()
- 删除
- 插入
- 替换
例子:
var aar = ['a','b','c','d','e'];
aar.splice(1,2);//1:起始位置 2:删除项数 从位置1删除两项
aar.splice(1,0,'f');//1:起始位置 2:删除项数 在位置1处插入f
aar.splice(1,1,'f');//1:起始位置 2:删除项数 在位置1处插入f 删除一项
- indexOf()/lastIndexOf()
例子:
var aar = ['a','b','c','d','e'];
arr.indexOf(b);//从第一项开始找到b的位置 1
arr.lastIndexOf(b) //从末尾开始找到b的位置 3
//找不到则返回-1
迭代方法
- every()
- filter()
- forEach()
- map()
- some()
1)其中,every()和some()两个方法及其相似,都用于查询数组中的项是否满足某个条件,但是不一样的地方是,every()类似于逻辑运算中的&&,数组中的每一项都要满足条件,才能返回true值,且当前面有一个不满足时便直接返回false;some()则类似于逻辑运算中的||,数组中只要有一项满足条件便返回true,且当第一项满足返回true是便直接返回true。
例子: function numberChecker(element,index,item){ return (element >=10 ); } console.log("every:",[10,80,5,10,50].every(numberChecker));//false console.log("some:",[1,8,5,10,5].some(numberChecker));//true //numberChecker()这个方法用于判断数字是否满足条件,满足则返回true
2)filter()和它的名字一样,就是过滤,从数组中过滤出自己想要的子数组。
例子: function numberChecker(element,index,item){ return (element >=10 ); } console.log([10,80,5,10,50].filter(numberChecker));//[10,80,10,50] //numberChecker()这个方法用于判断数字是否满足条件,满足则返回true
3)map()和它的名字一样,就是映射,将原数组映射成新的数组。
例子: function numberChecker(element,index,item){ return (element * 2); } console.log([10,80,5,10,50].filter(numberChecker));//[20,160,10,20,100] //numberChecker()这个方法用于设定条件方法
4)forEach()类似于数组遍历。
例子: var arr= [10,80,5,10,5]; var evenArr = []; function numberChecker(element,index,item){ if (element%2 == 0) { evenArr.push(element); return; } } arr.forEach(numberChecker2) console.log(evenArr);//[10,80,10] //numberChecker()这个方法用于设定条件方法,选出偶数
数组排列
function descending(v1,v2){//降序
if( v1 < v2 ){
return 1;
}else if( v1 > v2 ){
return -1;
}else{
return 0;
}
}
function ascending(v1,v2){//升序
if( v1 > v2 ){
return 1;
}else if( v1 < v2 ){
return -1;
}else{
return 0;
}
}
var values = [0,5,4,6,8,10];
console.log(values.sort(descending));//[10,8,6,5,4,0]
console.log(values.sort(ascending));//[0,4,5,6,8,10]
归并方法
- reduce()
- reduceRight()
两个方法都是遍历数组,构建最终返回的值,但是遍历的方法不同,并且都接收四个相同的参数(前一个值,当前值,项的索引,数组对象)。
例子:
function numberChecker(pre,current,index,item){
return current
}
console.log("reduce:",[1,2,3,4,5].reduce(numberChecker));//5
console.log("reduceRight:",[1,2,3,4,5].reduceRight(numberChecker));//1
//可以从上面两个打印出来的结果得出reduce从左边开始遍历,而reduceRight从右边开始遍历
以上为数组的基础方法,个人觉得js 数组这一块还是比较有用的,
前不久用过Underscore工具类,里面有很多数组的方法,感觉挺实用的,上手也挺快,有兴趣的萌新们可以去看看。