网站首页 > 知识剖析 正文
slice() 方法可从已有的数组中返回选定的元素。原数组不改变返回新选定的元素组成的新数组。
数组.slice(start,end)
start: 可选 数组从什么位置开始选择,如果没设置默认值是0,从开始选择。
end :可选,数组截取到哪里,默认截取到数组的尾部
var arr=[1,3,5,7,9];
var arr1=arr.slice();//[1,3,5,7,9];从头开始选取
var arr2=arr.slice(1);//[3,5,7,9];从下标1开始选择
var arr3=arr.slice(-1);//[9];从倒数第1项开始选择
var arr4=arr.slice(2,4);//[5,7]从第二项选择到第4项
var arr5=arr.slice(-3,4);//[5,7]从倒数第3项选择到正数第4项
var arr6=arr.slice(-3,-1);//[5,7]从倒数第三项选择到倒数第一项
注释:您可使用负值从数组的尾部选取元素。
注释:如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。
重点
//返回一个对象,对象有max和min属性,求出当前参数的最大值和最小值
function fn1(){
var arr= Array.prototype.slice.call(arguments);
if(arr.length===0) return;
arr=arr.sort(function(a,b){return a-b});
return {max:arr[arr.length-1],min:arr[0]};
}
fn1(3,5,7,9);//{max:9,min:3
在这个案例中Array.prototype.slice.call(arguments)为什么会将伪数组转换为数组呢
这个问题牵扯一下两种概念
1、prototype 原型,所有的数组对象如果需要使用什么方法那就必须将这个方法增加在原型中,而且在必须在里面使用this,这个this就是这个数组对象
例如:
//求数组中数值元素的和
Array.prototype.sum=function(){
var sum=0;
//this就是调用这个方法的数组
for(var i=0;i<this.length;i++){
//判断这个数组的第i项是不是数值
if(!isNaN(this[i])){
sum+=this[i];
}
}
return sum;
};
var arr=[10,15,20,30,40];
var sum=arr.sum();
console.log(sum);//115;
2、call 的作用,call在调用函数时可以替代函数中的this,例如:
function fn2(){
this.a=3;
this.b=10;
}
fn2();//因为直接调用函数this就是window,
//因此,这里等于给window增加属性a和b。
//那么window的属性其实就是变量,因此实际上是增加变量a和b
console.log(a,b);//3,10
var obj={};
fn2.call(obj);
//这里将obj带入函数后替代函数中this,
//因此,其实就是给obj增加属性a和属性b
console.log(obj.a,obj.b);//3,10;
那么现在我们解释一下Array.prototype.slice.call(arguments)。首先我们先模仿数组的原生API写一下slice,猜测哦,谁也不知道JS底层怎么写的。
Array.prototype.slice1=function(start,end) {
if (!start) start = 0;
if (!end) end = this.length;
if (start < 0) start = this.length + start;
if (end < 0) end = this.length + end;
var arr = [];
for (var i = start; i < end; i++){
arr.push(this[i]);
}
return arr;
};
var arr=[1,3,5,7,9];
var arr1=arr.slice1(2,4);//[5,7];
上面这个就是模拟了slice的函数内容。那么在这里,this就是这个数组。如果我们使用Array.prototype.slice1.call(arguments);那么就是把上面的这个方法中slice1函数中this用arguments替代了,类数组也是有下标的,因此,就相当于遍历取出每个下标存储在新的数组中,并且返回这个新数组。而这里call()后面没有带参,意味着直接调用了slice1,start和end都没有传入,当没有传参时默认从开始选择到尾部所有的元素放在新数组中,因此才可以转换为新数组。
猜你喜欢
- 2024-11-10 PHP数组学习笔记(1) php数组有哪几种类型
- 2024-11-10 Rust语言入门教程 数组和切片 rust语言例子
- 2024-11-10 javascript自学笔记:Array类型1 javascript自学笔记:array类型1怎么解决
- 2024-11-10 Array.from详解: 语法、功能与应用场景
- 2024-11-10 帮你精通JS:解析与盘点数组array的5类22种方法
- 2024-11-10 10 个实用的 JS 技巧 js常用方法大全
- 2024-11-10 WordPress 内置的数组处理相关函数大全
- 2024-11-10 3分钟短文 | PHP获取函数的代码片段,唯有反射最高效
- 2024-11-10 JS 中的类数组对象如何转换为数组?
- 2024-11-10 Go 中的循环是如何转为汇编的?看完你懂了吗?
- 07-07select * from table where id in (上千id) 超时了,in的奇特优化方法
- 07-07SQL Server中从SELECT进行UPDATE的方法
- 07-07彻底弄懂IO复用:深入了解select,poll,epoll
- 07-07以后面试官问你 为啥不建议使用Select *,请你大声回答他
- 07-07太厉害了,只需一条DOS命令,就可以找到windows10许可证密钥
- 07-07「Oracle」 sql语句查询报错ORA-00904
- 07-07面试官:select语句和update语句分别是怎么执行的?
- 07-07第四章 SQL查询select(sql查询怎么用)
- 最近发表
-
- select * from table where id in (上千id) 超时了,in的奇特优化方法
- SQL Server中从SELECT进行UPDATE的方法
- 彻底弄懂IO复用:深入了解select,poll,epoll
- 以后面试官问你 为啥不建议使用Select *,请你大声回答他
- 太厉害了,只需一条DOS命令,就可以找到windows10许可证密钥
- 「Oracle」 sql语句查询报错ORA-00904
- 面试官:select语句和update语句分别是怎么执行的?
- 第四章 SQL查询select(sql查询怎么用)
- sql之查询语句 select(sql查询语句怎么用)
- Vue-Web前端选择题(50题)(vue前端面试题2020及答案)
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)