在JS里Array是一个类,slice是此类里的一个方法 ,那么使用此方法应该Array.prototype.slice这么去用。但通常我们通过arrayObj.slice(start,[end])来截取数组。
那么什么场景下使用Array.prototype.slice呢?来看下面这个例子:
function test(a,b,c,d) {
var arg = Array.prototype.slice.call(arguments,1);
alert(arg);
}
test("a","b","c","d"); //b,c,d
Array.prototype.slice.call(arguments, 1),不就是等于 arguments.slice(1) 吗?像前者那样写具体的好处是什么?因为arguments并不是真正的数组对象,只是与数组类似而已,所以它并没有slice这个方法,而Array.prototype.slice.call(arguments, 1)
可以理解成是让arguments转换成一个数组对象,让arguments具有slice()方法。要是直接写arguments.slice(1)会报错。
var a={length:2,0:'first',1:'second'};//类数组,有length属性,长度为2,第0个是first,第1个是second
console.log(Array.prototype.slice.call(a,0));// ["first", "second"],调用数组的slice(0);
var toArray = function(s){
try{
return Array.prototype.slice.call(s);
} catch(e){
var arr = [];
for(var i = 0,len = s.length; i < len; i++){
//arr.push(s[i]);
arr[i] = s[i]; //据说这样比push快
}
return arr;
}
}
运用input控件上传文件,判断文件后缀名和文件大小,也用到Array.prototype.slice.call()转化files为数组
<input id="myfile" type="file"/>
$('#myfile').change(function(){
var files = Array.prototype.slice.call(this.files);
var that=this;
files.forEach(function (file, i) {
if (file.size > 20 * 1024) {
alert("上传图片不能大于20k");
that.value = "";
return;
} else if (file.size == 0) {
alert("上传图片路径不正确(可能包含中文)");
that.value = "";
return;
}
if (!/\/(?:jpeg|png|gif)/i.test(file.type)){
alert("文件格式必须为jpeg,png,gif")
}
})
})