/*label和break、continue的运用。 *label作为标签与break和continue一起使用, *循环中break后面跟上label标签时,会break到label标记的位置,continue同理 */ var num=0; start: for(var i=1;i<5;i++){ for(var j=1;j<5;j++){ for(var k=1;k<5;k++){ if(k===2){ // break start; //num为1 // break; //num为16 // continue; //num为48 continue start; //num为4 } num++; } } } console.log(num); /** * 函数参数 * 定义函数时,我们可以定义2个参数,但实际使用时, * 我们可以不传参数或者传入两个以上的参数进去,而且不会报错. * 这是因为,在函数体内,参数是以一个数组(arguments)的形式表示的。 * 因此,我们也可以直接在函数体内使用arguments访问参数 */ function numberOfArguments(){ console.log(arguments.length); } numberOfArguments(1,2); //输出2 numberOfArguments(); //输出0 /** * 函数参数传递 * 无论是基本类型还是引用类型,函数参数的传递都是按照值来传递的,而不是引用。 */ function changeNum(num1){ num1=10; } function changNumOfObject(ob1){ ob1.num=10; } var num=5; var ob=new Object(); changeNum(num); changNumOfObject(ob); console.log(num); //输出5 console.log(ob.num); //输出10 /** * 上面的程序num输出5,而不是10,因为参数值传递时,将num的值赋值给了num1, * num1和num为两个独立的变量,num1的改变不会影响到num。 * 而ob.num输出10也同样可以理解,ob赋值给了ob1,但是因为ob是引用类型, * 本身储存的是一个指针,赋值后,ob和ob1的值是相互独立的,但是它们按引用来访问的对象是同一个, * 所以函数内,ob1添加了num属性。函数外ob可以访问到num属性。 */ /** * Array数组 * 在javascript中构造数组有两种方法,如下: */ var array1=new Array(); //通过Array的构造函数进行构造 var array2=[1,2]; //通过数组字面量进行构造 /** * 数组的length属性是可以动态修改的,比如一下代码是没有错误的: */ console.log(array1.length); //输出0 array1[array1.length]=1; console.log(array1.length); //输出1 array1.length=3; console.log(array1.length); //输出3 console.log(array1[2]); //输出undefined,因为虽然声明了但是未初始化 /** * 检测一个变量是否为数组时,我们可以用instanceof进行检测 * ,但是这个操作符只适合于只有一个全局作用域的情况。 * 如果有多个全局作用域(当我们引用了多个框架并且相互传递参数时),这个操作符便适用了, * 为此,ECMAScript为我们提供了Array.isArray()方法。不管有多少个全局执行环境, * 这个方法都可以为我们判断变量是否是数组。 */ console.log(array1 instanceof Array); //返回true console.log(Array.isArray(array1)); //返回true /** * 数组调用valueOf()方法返回的是数组本身 * 数组调用toString()方法返回的是数组每一项的toString结果拼接起来的并以逗号相隔的字符串 * 数组调用join()方法可以指定分隔字符串的分隔符,该方法只接受一个参数(指定分隔符) * 如果数组中有数组项为undefined,则调用上述方法时,该项值为空字符串 */ console.log(array2.valueOf()); //返回[1,2] console.log(array2.toString()); //返回1,2 console.log(array2.join(':')); //返回1:2 console.log(array1.valueOf()); //返回[1, , ] /** * 数组的栈方法 * 使用push()和pop()方法模拟栈的数据操作 * push()会在数组尾部添加传入的参数并返回修改后数组长度, * pop()会删除数组最后一个元素并返回被删除的元素。 */ var count1=array2.push(4); console.log(count1); //返回3 console.log(array2); //返回[1,2,4] var item=array2.pop(); console.log(item); //返回4 console.log(array2); //返回[1,2] /** * 数组的队列方法(一) * 使用shift()方法和push()模拟队列 * shift()方法会删除数组的第一个元素并返回这个元素 */ var count2=array2.push(3); console.log(array2); //返回[1,2,3] var item2=array2.shift(); console.log(item2); //返回1 console.log(array2); //返回[2,3] /** * 数组的队列方法(二) * 使用unshift()和pop()模拟反方向的队列 * unshift()会将传入的参数逐一添加到数组的最前面并返回修改后的数组长度 */ var count3=array2.unshift(0); console.log(count3); //返回3 console.log(array2); //返回[0,2,3] /** * 数组排序 * reverse(),将数组倒序排列 * sort(),无参数时,将数组按升序排序,排序过程中会每项都会调用toString方法, * 比较toString方法的返回结果进行升序排序。 * 这种方式得出的排序结果常常不是我们需要的, * 所以为了得到期望的排序我们可以传入一个比较函数。 * 比较函数接收两个参数,如果希望第一个参数位于第二个参数前面则返回负数, * 如果希望第一个参数位于第二个参数后面则返回正数,如果两个参数相等则返回0。 */ function sortNum(num1,num2){ if(num1<num2){ return -1; } else if(num1>num2){ return 1; } else{ return 0; } } var array3=[1,20,3,4]; array3.reverse(); console.log(array3); //返回[4,3,20,1] array3.sort(); console.log(array3); //返回[1,20,3,4],因为是根据toString的结果排序的 array3.sort(sortNum); //返回[1,3,4,20] console.log(array3); /** * 数组的操作方法 * concat()基于当前数组与传入的参数(可以是数组也可以是非数组)进行拼接构建并返回新数组。 * slice()基于当前数组根据接收的参数进行裁剪构建并返回新数组,接收一个或两个参数,作为起始项和结束项。 * splice()基于当前数组进行任何位置的插入删除替换操作,接收两个或两个以上的参数, * 第一个参数为起始项,第二个为删除项数,第三个及之后的为替换项的值。始终返回一个数组, * 该数组包含被删除的项值(如果没有删除则为空)。 * 需要注意的是,这concat和slice不会对原数组的值有影响,而splice则会影响原数组 */ var array4=[1,2,3,4]; console.log(array4.concat([5,6],7)); //返回[1,2,3,4,5,6,7] console.log(array4.slice(1)); //返回[2,3,4],只有一个参数时默认从起始项开始直至数组末尾(包括最后一项) console.log(array4.slice(1,3)); //返回[2,3],不包括结束项 var rm=array4.splice(0,1); console.log(array4); //返回[2,3,4] console.log(rm); //返回[1] rm=array4.splice(0,0,0); console.log(array4); //返回[0,2,3,4] console.log(rm); //返回[] rm=array4.splice(0,1,1,2); console.log(array4); //返回[1,2,2,3,4] console.log(rm); //返回[0] /** * 数组的位置方法 * indexOf(),接收一个或两个参数,作为查找项值和查找起始位置,从数组开头向末尾查找 * lastIndexOf(),与indexOf查找方向相反 */ var array5=[1,2,3,2,4,5]; console.log(array5.indexOf(2)); //返回1 console.log(array5.indexOf(2,2)); //返回3 console.log(array5.lastIndexOf(2)); //返回3 console.log(array5.lastIndexOf(2,2)); //返回1 /** * 数组的迭代方法 * every(),每个数组项运行指定函数,如果每次函数都返回true,则方法返回true。 * some(),每个数组项运行指定函数,任意一次函数结果返回true,则该方法返回true。 * filter(),每个数组项运行指定函数,函数返回true的项组成数组并被返回。 * map(),每个数组项运行指定函数,所有结果组成数组并被返回。 * forEach(),每个数组项运行指定函数,该方法无返回值。 * 这些操作对原数组值无影响 */ function someFunction(item,index,array){ return item>3; } function otherFunction(item,index,array){ console.log(item); } console.log(array5.every(someFunction)); //返回false console.log(array5.some(someFunction)); //返回true console.log(array5.filter(someFunction)); //返回[4,5] console.log(array5.map(someFunction)); //返回[false,false,false,false,true,true] array5.forEach(otherFunction); //执行次语句时,控制台会依次打印1,2,3,2,4,5 /** * 数组的归并方法 * reduce(),接收一个或两个参数,第一个为迭代时调用的函数,第二个为归并的初始值。 * 迭代函数接收4个参数,分别作为前一项值,当前项值,当前索引,数组对象。 * reduceRight(),用法同上,但迭代方向相反,reduceRight从数组末尾向开头遍历。 */ function subtract(prev,cur,index,array){ return cur-prev; } var array6=[1,2,3]; console.log(array6.reduce(subtract)); //返回2 console.log(array6.reduce(subtract,8)); //返回-6 console.log(array6.reduceRight(subtract)); //返回2 console.log(array6.reduceRight(subtract,8)); //返回-6