JavaScript—Array的方法以及函数直接量
学习笔记,非原创。
数组
数组是用构造函数来创建的。
数组的方法
>join()方法
把数组里的所有元素都转换成字符串,然后再把它们连接起来,可以指定一个可选的字符串来分割结果字符串中的元素。,如果没有指定分割字符串,那么就可以使用逗号分割。
Var a =[1,2,3];
Var s = a.join(); //s=”1,2,3”
S=a.join(“.”);//s=”1.2.3”
>reverse()方法
将颠倒数组的元素的顺序并返回颠倒后的数组。它在原数组上执行这一操作,并不是创建一个重排了元素的新数组,而是在已经存在的数组中对数组元素进行重排。
var a = new Array(1,2,3); //a[0]=1, a[1]=2, a[2]=3
a.reverse(); //a[0]=3, a[1]=2, a[2]=0
var s = a.join(); //s=”3,2,1”
>sort()方法
是在原数组上对数组元素进行排序,返回排序后的数组。如果没有传递参数,就是按照字母顺序就行排序。如果数组有未定义的元素,则放在数组尾。
var a = new Array(“banana”, “cherry”, “apple”);
a.sort();
var s = a.join(“, ”); //s=”apple, banana, cherry”
如果要将数组按照别的顺序来排序,必须将一个比较函数作为参数传递给sort()。
>concat()方法
创建并返回一个数组,这个数组包含原始数组,其后跟随的concat的参数。
var a = [1,2,3];
a.concat(4,5); //返回[1,2,3,4,5]
a.concat([4,5]); // [1,2,3,4,5]
a.concat([4,5],[6,7]); //[1,2,3,4,5,6,7]
a.concat(4,[5,[6,7]]); //[1,2,3,4,5,[6,7]]
>slice()方法
返回一个数组片段,或者说是子数组。
返回由第一个参数开始到第二个参数为止的元素,但不包含第二个参数所指定的元素。
如果只有一个参数,则是从这个参数位置开始到结束处。
如果有一个是负数,则是指相对于数组中最后一个元素而言的元素。-1是指最后一个元素,-3是倒数第三个元素。
var a =[1,2,3,4,5];
a.slice(0,3); //[1,2,3]
a.slice(3); //[4,5]
a.slice(1,-1); //[2,3,4]
a.slice(-3,-2); //[3]
splice()方法
插入或者删除数组元素。在原数组上修改数组,并不创建新数组。
第一个参数指定了要插入或者删除的元素在数组中的位置。第二个参数指定了要删除的元素个数。如果第二个参数省略了,那么将删除从开始元素到数组结尾的所有元素。返回的是删除了的元素数组。
var a =[1,2,3,4,5,6,7,8];
a.splice(4); //返回[5,6,7,8];a是[1,2,3,4]
a.splice(1,2); //返回[2,3];a是[1,4]
a.splice(1,1); //返回[4]; a是[1]
splice的前两个参数指定了应该删除的数组元素,这两个参数指数还可以任意个参数,它们指定的是要从第一个参数指定的位置处开始插入的元素。
var a = [1,2,3,4,5];
a.splice(2,0,’a’,’b’); //返回[], a=[1,2,’a’,’b’,3,4,5]
b.splice(2,2,[1,2],3); //返回[‘a’,’b’];a是[1,2,[1,2],3,3,4,5]
push()和pop()方法
push()和pop()方法使我们可以像使用栈那样来使用数组。push()可以将一个或多个新元素附件到数组的尾部,然后返回数组的新长度。
pop()相反,它将删除数组的最后一个元素,减少数组长度,但是返回删除的值。
var stack=[];
stack.push(1,2);//stack=[1,2];返回 2
stack.pop();//stack=[1],返回2
stack.push(3); //stack=[1,3];返回2
stack.pop();//stack=[1],返回3
unshift()和shift()方法
和push()和pop()相似,但是是在数组的头部进行元素的插入和删除。
unshift()会将一个或多个元素添加到数组的头部,然后把已有的元素移动到下标较大的位置以腾出空间,返回的数组的新长度。方法shift()会删除并返回数组的第一个元素,然后将后面元素前移。
var a =[];
a.unshift(1);//a=[1],返回1
a.unshift(22); //a=[22,1];返回2
a.shift();//a=[1];返回22
a.unshift(3,[4,5]); //a=[3,[4,5],1];返回3
a.shift();//a=[[4,5],1];返回3
a.shift();//a=[1];返回[4,5];
a.shift();//a=[];返回1
toString()方法
将数组的每个元素都转换成一个字符串,然后输出这些字符串的列表,字符串之间用逗号隔开。
toSource()方法
toSource() 方法表示对象的源代码。
function employee(name,job,born)
{
this.name=name;
this.job=job;
this.born=born;
}
var bill=new employee("Bill Gates","Engineer",1985);
var s= bill.toSource(); //s=({name:"Bill Gates", job:"Engineer", born:1985})
函数定义方法
函数定义有3中方式
function语句,Function()构造函数,函数直接量。
function f(x){return x*x;} // function语句
var f = new Function(“x”, “return x*x”); // Function()构造函数
var f = function(x){return x*x;}; //函数直接量
函数直接量是一个表达式,它可以定义匿名函数。虽然函数直接量创建的是未命名函数,但是它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时非常有用。
给函数直接量命名,并不是真正创建一个函数,而是使用命名的引用。
var f = function fact(x){if(x<=1) return1; else return x*fact(x-1);};
上面的代码定义了一个未命名函数,并把对它的引用存储在变量f中。它并没有真正创建一个名为fact()的函数,只是允许函数体用这个名字来引用自身。
构造函数和函数直接量的区别:
- 构造函数允许在运行时动态地创建和编译Javascript代码。函数直接量是一个静态部分。
- 每次使用构造函数都会解析函数体并且创建一个新的函数对象。如果对构造函数的调用出现在一个循环中,或者经常被调用的函数中,效率就非常低。
函数直接量出现在循环中或者多次调用的时候,不是每次都被重新编译,而且每次遇到一个函数直接量时也不创建一个新的函数对象。
- 构造函数创建的函数不使用此法作用域。总是被当作顶级函数来编译。