数组

认识数组

数组:用一个变量存储一堆数据结构。

数据类型:

基本数据类型

特殊数据类型

复合/引用数据类型

声明数组

1、通过new创建数组

参数:传入任意的数据,存储到数组中。

2、省略new运算符创建数组

【注】上述两种方法,传入参数只有一个,并且是数字的时候,直接声明这么长的数组

3、数组常量进行赋值。(JS一般使用中括号[ ])

<script>/* 通过new创建数组 */var arr = new Array(100,true,"hello");alert(arr); /* 省略new运算符创建数组 */var arr2 = Array(100,true,"hello");alert(arr2); /* 上述两种方法,传入参数只有一个,并且是数字的时候,直接声明这么长的数组 */var arr4 = new Array(10);alert(arr4);var arr5 = Array(10);alert(arr5);/* 数组常量进行赋值。(JS一般使用中括号[ ]) */var arr3 = [100,true,"hello"];alert(arr3);
</script>

数组的属性

数组.length        返回值数组【元素】的个数。

元素:将数组存储的每一个数据,叫做数组的元素

访问数组的元素

                        数组[下标];下标是从0开始的。

【注】数组和循环是天生一对

 <script>   /* 数组常量进行赋值。(JS一般使用中括号[ ]) */var arr3 = [100,true,"hello"];alert(arr3); var arr = [100,true,"hello"];/* alert(arr.length);alert(arr[1]); */for(var i = 0;i < arr.length; i++){document.write(arr[i] + "<br/>");}
</script>

数组遍历

Math.randon( );           随机数   [0,1)

parseInt(Math.randon( ) * 10 );    随机数   [0,10)

<script>// 1、长度是10的数组var arr = new Array(10);for(var i = 0; i < arr.length; i++){arr[i] = parseInt(Math.random() * 10);}alert(arr);/* 数组的遍历for 循环for...in 遍历   快速遍历/快速枚举,不需要判断任何东西*/var arr = [10,20,30,40,50];//在页面上分别将每一个数输出for(var i = 0; i < arr.length; i++){document.write(arr[i] + "<br/>");}for(var i in arr){document.write(arr[i] + "<br/>");}
</script>

数组方法

栈结构:

                结构:从同一头进,从同一头进出

特点:先进后出

数组的两个方法形成栈结构

  • push

    • 格式:数组.push(参数1,参数2...);
    • 功能:给数组的末尾添加元素
    • 返回值:插完元素以后数组的长度
  • pop
    • 格式:数组.pop( )
    • 参数:没有参数
    • 返回值:取下一个元素
    • 功能:从数组末尾取下一个元素
<script>var arr = ["北京","上海","广州"];var res = arr.push("深圳","天津","成都");alert(arr);alert(res);/* 插完元素以后数组的长度:6 */var arr2 = ["北京","上海","广州"];var res2 = arr2.pop();alert(res2);alert(arr2);
</script>

队列结构:

结构:从末尾进,从头部出

特点:先进先出

  • push

    • shift( )

      • 格式:数组.shift( )
      • 参数:没有参数
      • 功能:从数组的头部取下一个元素
      • 返回值:取下的元素
    • unshift( )
      • 格式:数组.unshift(参数1,参数2...)
      • 功能:从数组的头部插入元素
      • 返回值:插完元素以后数组的长度
<script>var arr = ["唐朝","元朝","清朝"];var res = arr.shift();alert(res);alert(arr); /* 首部元素不存在了 */var arr2 = ["唐朝","元朝","清朝"];var res2 = arr.unshift("隋朝","商汤");alert(res2);    /* 插完元素以后数组的长度:4 */alert(arr2);
</script>

数组方法

  • contact( )

    • 1、拷贝原数组,生成新数组
    • 2、合并数组
      • 格式:数组.contact( 数组,数据,...)
      • 返回值:合并成的新数组
<script>var arr1 = [10,20,30];var arr2 = [50,60,70];var newArr = arr1.concat(arr2,"hello",true);alert(newArr);alert(newArr.length); // 8,将arr2中的元素拆开单独存入arr1中alert(arr1);
</script>
  • slice( ) 方法

    • 格式:数组.slice(start , end);   [start , end)
    • 功能:可以基于当前数组获取指定区域元素 [start , end),提取出元素生成新数组
    • 返回值:生成的新数组,原数组不会发生任何的改变
<script>var arr1 = [10,20,30,40,50,60];var newArr = arr1.slice(1,4);alert(newArr);  /* 20,30,40 */alert(arr1);    /* 10,20,30,40,50,60 */
</script>
  • splice( )

    • 格式:数组.splice(start , length , 数据1 , 数据2 ...);
    • 参数:
      • start        开始截取的位置
      • length     截取的元素长度
      • 第三个参数开始:在start 位置,插入的元素
    • 返回值:截取下来的元素组成的数组
<script>
var arr = [10,20,30,40,50,60];// 增加功能var res = arr.splice(2,0,"hello","world");alert(arr); /* 10,20,hello,world,30,40,50,60 */alert(res); /* 为空 */// 删除功能var res = arr.splice(1,2);alert(arr); /* 10,40,50,60 */alert(res); /* 20,30 *///修改功能arr.splice(2,1,"hello");alert(arr); /* 10,20,hello,40,50,60 */</script>
  • join( )

    • 格式:数组.join(字符串)
    • 功能:将数组中的元素,用传入的拼接符,拼接成一个字符串
    • 返回值:拼接好的字符串
        var arr = [10,20,30];var str = arr.join("==");alert(str);alert(arr);
  • reverse( )         逆序

        var arr = [true,"hello",100];arr.reverse();alert(arr);
  • 数组排序 sort

    • 格式:数组.sort( )        默认从小到大排序,按照字符串排序
    • 如果要进行数值大小排序
      • 传参数:一个函数,代表要怎么去进行排序(固定用法)
<script>var arr = [30,20,50,10,40,60];arr.sort();alert(arr);/* 10,20,30,40,50,60 */var arr2 = [1,10,20,15,25,5];arr2.sort();alert(arr2);/* 1,10,15,20,25,5 *//* 数值从小到大 */var arr = [1,10,20,15,25,5];arr.sort(function(value1,value2){return value1 - value2;})alert(arr);/* 数值从大到小 */var arr = [1,10,20,15,25,5];arr.sort(function(value1,value2){return value2 - value1;})alert(arr);</script>

数组求平均数

<script>/* 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。*///1、声明数组var arr = new Array(30);for(var i = 0; i < arr.length; i++){arr[i] = i * 2 + 2;}// alert(arr);// 2、求平均数var averageArr = [];for(var i = 0; i < 6; i++){// 3、取出求平均数的这组数var newArr = arr.splice(0,5);   /* y也可以用slice,但是slice不会改变数组,所以需要提取不同的下标    arr.slice(i * 5,(i + 1) * 5) */// 4、求平均值var sum = 0;for(var j = 0; j < newArr.length; j++){sum += newArr[j];}averageArr.push(sum / 5);}alert(averageArr);</script>

数组的引用

【引用】数据类型

数组,数组的变量存储的是数组的存储

<script>var arr1 = [10,20,30,40];var arr2 = arr1;arr2.push(50,60);alert(arr1);/* 10,20,30,40,50,60 */alert(arr2);/* 10,20,30,40,50,60 */</script>

concat( )

拷贝原数组,生成一个新数组

<script>var arr1 = [10,20,30,40];var arr2 = arr1.concat();arr2.push(50,60);alert(arr1);/* 10,20,30,40 */alert(arr2);/* 10,20,30,40,50,60 */</script>

声明提升

概念:在当前作用域,声明变量和函数,会直接提升在整个代码的最前面运行

<script>
/* 内存分配,一次分配准备做菜,先要将菜谱从头到尾看一遍,所有准备材料准备好,才开始工作预编译:在所有代码运行之前,计算机将代码从头到尾看一遍。将这个程序需要运行的空间一次性分配好相当于:var num;alert(num); var num = 10;alert(num);函数也会声明提升。*/alert(num); //undefinedvar num = 10;alert(num); //10show();  //hello world 声明提升了function show(){document.write("hello world");}/* 局部作用域 */function show(){var num;     //声明提升alert(num);  //undefinedvar num = 10;alert(num);  //10}show();alert(num);  //报错,离开了局部作用域的范围</script>

省略var

<script>
/* 省略var,直接去强制给一个变量赋值,这个变量会被JS强制声明成全局变量【注】不建议,这属于语法错误*/function show(){var num = 10;alert(num);}show();alert(num);//报错function show2(){num2 = 10;alert(num2);}show2();alert(num2);  //10
</script>

二维数组

数组存储数据,数组中每一个元素,元素可以是任意的数据类型。

【注】数组中的元素可以是数组

二维数组:认为起的,不为官方命名。

<script>var arr1 = [10,20,30];var arr = [true,100,"hello",arr1];alert(arr.length);  //4alert(arr[3]);  //[10,20,30]alert(arr[3] == arr1);  //truealert(arr[3][1]);   //20
</script>
<script>/* 通过循环按行顺序为一个5x5的二维数组a赋1到25的自然数,然后输出该数组的左下半三角。 */var arr = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]];//  for(var i = 0; i < arr.length; i++){//      for(j = 0; j <= i; j++){//          document.write(arr[i][j] + " ");//      }//      document.write("<br/>");//  }// for(var i = 0; i <arr.length; i++){//     // document.write(arr[i]);//     var newArr = arr[i];//     for(var j = 0; j < newArr.length; j++){//         if(i >= j){//             document.write(newArr[j] + "&nbsp");//         }//     }//     document.write("<br/>");// }for(var i = 0; i <arr.length; i++){// document.write(arr[i]);for(var j = 0; j < arr[i].length; j++){if(i >= j){document.write(arr[i][j] + "&nbsp");}}document.write("<br/>");}</script>

冒泡排序

  • 规则:前后两个数两两进行比较,如果符合交换条件就交换两个数的位置
  • 规律:冒泡排序每一轮排序,都可以找出一个较大的数,放在正确的位置
<script>/* 冒泡排序:前后两个数两两进行比较,如果符合交换条件就交换两个数的位置分析:比较轮数 = 数组长度- 1;每一轮比较的次数 = 数组长度 - 当前的轮数。*/var arr = [9, 8, 7, 6, 5, 4];for(var i = 0; i < arr.length - 1; i++){/* 注意:j < arr.length - (i + 1) */for(var j = 0; j < arr.length - (i + 1); j++){if(arr[j] > arr[j + 1]){var temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for(var i = 0; i < arr.length; i++){document.write(arr[i] + "&nbsp;");}</script>

选择排序

  • 规则:选出一个位置,这个位置上的数,和后面所有的数进行比较,如果比较出大小就交换两个数位置。
  • 规律:每一轮都能选出一个最小的数,放在正确的位置
 <script>/* 9, 8, 7, 6, 5, 4第一轮: 9, 8, 7, 6, 5, 48, 9, 7, 6, 5, 47, 9, 8, 6, 5, 46, 9, 8, 7, 5, 45, 9, 8, 7, 6, 44, 9, 8, 7, 6, 5第二轮:9, 8, 7, 6, 58, 9, 7, 6, 57, 9, 8, 6, 56, 9, 8, 7, 55, 9, 8, 7, 6. . . . . .比较的轮数 = 数组长度 - 1;每一轮比较的次数 = 数组长度 - 当前的轮数*/var arr = [9, 8, 7, 6, 5, 4];//用的擂台的下标for(var i = 0; i < arr.length - 1; i++){//被比较的数的下标for(var j = i + 1; j < arr.length; j++){if(arr[i] > arr[j]){var tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}}alert(arr);</script>

可以将冒泡排序和选择排序封装成函数,写在新的 tool.js 文件内,后续使用更加便捷

/* 冒泡排序升序 */
function bubbleSortAsc(arr){for(var i = 0; i < arr.length - 1; i++){for(var j = 0; j < arr.length - (i + 1); j++){if(arr[j] > arr[j + 1]){var temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for(var i = 0; i < arr.length; i++){document.write(arr[i] + "&nbsp;");}
}/* 冒泡排序降序 */
function bubbleSortDesc(arr){for(var i = 0; i < arr.length - 1; i++){for(var j = 0; j < arr.length - (i + 1); j++){if(arr[j] < arr[j + 1]){var temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for(var i = 0; i < arr.length; i++){document.write(arr[i] + "&nbsp;");}
}/* 选择排序升序 */
function changeSortAsc(arr){for(var i = 0; i < arr.length - 1; i++){//被比较的数的下标for(var j = i + 1; j < arr.length; j++){if(arr[i] > arr[j]){var tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}}
}/* 选择排序降序 */
function changeSortDesc(arr){for(var i = 0; i < arr.length - 1; i++){//被比较的数的下标for(var j = i + 1; j < arr.length; j++){if(arr[i] < arr[j]){var tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}}
}

数组的练习

  • 随机给出一个五位以内的数,然后输出该数共有多少位,每位分别是什么
/* 方法一: */var x = parseInt(Math.random() * 100000);document.write("x=" + x + "<br>");var y = x, count = 1;while(true){if(parseInt(y / 10) == 0){break;}else{y = parseInt(y / 10);count++;}}document.write("count=" + count + "<br>");for(var i = 0; i < count; i++){var a = Math.pow(10,(count - i));var b = Math.pow(10,(count - i - 1));var c = x % a;var n = parseInt(c / b);document.write("第" + (i + 1) + "位数为" + n + "<br>")}/* 方法二: */function countOfNum(num){var arr = [];while(num){arr.push(num % 10);num = parseInt(num / 10);}arr.reverse();alert("一共是:" + arr.length + "位" + ", 每一位分别是" + arr);}countOfNum(12345);
  • 编写函数 has(arr, 60) 判断数组中是否存在60这个元素,返回布尔类型
function has(arr, item){for(var i = 0; i < arr.length; i++){if(arr[i] === item){return true;}}return false;}alert(has([10,20,30],20));
  • 生成13位条形码(对之前的知识综合练习)

Ean-13码规则:第十三位数字是前十二位数字经过计算得到的校验码

例如:690123456789

第三位计算其校验码过程为:

@前十二位的奇数位和6+0+2+4+6+8=26

@前十二位的偶数位和9+1+3+5+7+9=34

@将奇数和与偶数和的三倍相加26+34*3=128

@取结果的个位数:128的个位数位8

@用10减去这个个位数10-8=2

所以校验码位2(注:如果取结果的个位数为0,那么校验码不是(10-0=10),而是0)实现方法ean13() 计算验证码,输入12位条码,返回13位校验码

例如:输入:692223361219

输出:6922233612192

alert(ean(692223361219));function ean(num){var arr = [];while(num){arr.unshift(num % 10);num = parseInt(num / 10);} var odd = 0;var even = 0;for(var i = 0; i < arr.length; i++){if(arr[i] % 2 == 0){odd += arr[i];  //下标为偶数,但在本身这个数中为奇数}else{even += arr[i]; //下标为奇数,但在本身这个数中为奇数}}var sum = (odd + even * 3) % 10;if(sum){sum = 10 -sum;}arr.push(sum);return Number(arr.join(""));}

ECMA5严格模式

严格模式:写在哪个作用域下,就在哪个作用域下生效。

"use strict"

【注】尽量注意不要严格模式写在全局。

用了严格模式,会有什么变量:

1、全局变量声明时,必须加var

/* function show(){num = 10;   //全局变量}show();alert(num);  //10,在控制台中查看会报错 */function show(){"use strict";var num = 10;   //强制声明称全局变量alert(num);     }show();alert(num);     //控制台报错,无法输出

  2、this无法指向全局对象(后续介绍)

        3、函数内重名属性

/* function show(num1, num1, num2){alert(num1 + "," + num2);       //20,30   因为后一个num1会覆盖前一个num1}show(10,20,30); */function show(num1, num1, num2){"use strict";alert(num1 + "," + num2);     //Uncaught SyntaxError: Duplicate parameter name not allowed in this context}show(10,20,30);  //无输出内容

  4、arguments对象

        4.1 arguments对象不允许被动态改变

/* function show(num1, num2){alert(num1 + "," + num2);       //10,20alert(arguments[0] + "," + arguments[1]);   //10,20}show(10,20); */function show(num1, num2){num1 = "hello";alert(num1 + "," + num2);       //hello,20alert(arguments[0] + "," + arguments[1]);   //hello,20}show(10,20);function show(num1, num2){"use strict";num1 = "hello";alert(num1 + "," + num2);       //hello,20alert(arguments[0] + "," + arguments[1]);   //10,20; arguments对象不允许被动态改变}show(10,20);

5、新增保留字:

                        implements, interface, let, package, private, protected, public, static, yield

/* var interface = 10;alert(interface);   //10 */"use strict";var interface = 10;alert(interface);   //interface是关键字,不可以声明成变量

严格模式的目的:

  1. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  2. 消除代码运行的一些不安全之处,保证代码运行的安全;
  3. 提高编译器效率,增加运行速度;
  4. 为未来新版本的JavaScript做好铺垫

【注】严格模式体现了JavaScript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它。

另一方面,同样的代码,在严格模式中,可能会有不一样的运行结果;一些在正常模式下可以运行的语句,在严格模式下将不能运行。

ECMA5新增数组方法

indexOf():

        格式: 数组.index(item,start);

参数:item  任意的数据

start   下标  可以不传入,默认是0

功能:在数组中查找第一次出现item元素下标,从start开始去查找

返回值:-1  没有查找到

>= 0        查找到的元素的下标

        var arr = [10, 20, 30, 40, 50, 20, 30];// var index = arr.indexOf(20);    //返回找到的第一个数的下标,1// var index = arr.indexOf(20,2);    //从下标2开始找可以找到后面20的下标,5var index = arr.indexOf(120);    //-1alert(index);

数组遍历:

for循环

for...in

        forEach( ECMA5新增)

                forEach 屏蔽了初学者对于循环的理解

item:当前遍历到的元素
                index:当前遍历到元素的下标
                arr数组本身

        var arr = [10, 20, 30, 40, 50];arr.forEach(function(item, index, arr){/* item:当前遍历到的元素index:当前遍历到元素的下标arr数组本身*/document.write(item + "," + index + "," +arr + "<br/>");});

map()  

            映射,可以根据固定的一个计算公式把原来的数计算出结果,把它放在一个数组里

        var arr = [10, 20, 30, 40, 50];var newArr = arr.map(function(item, index, arr){//遍历要做的事情   映射关系return item * 1.3;});alert(newArr);  //13,26,39,52,65alert(arr);     //10,20,30,40,50

filter( ) 过滤        

把我们想要的符合条件的元素单独拿出来存储在新数组中

        var arr = [10, 20, 30, 40, 50];var newArr = arr.filter(function(item, index, arr){//过滤的条件return item > 20;});alert(newArr);  //30,40,50alert(arr);     //10,20,30,40,50

some  某些   

【注】在数组中查找是否有符合条件的数,有返回true;没有返回false

短路操作:主要找到符合条件的元素,后面的循环就停止了

        var arr = [10, 20, 30, 40, 50];var res = arr.some(function(item, index, arr){//过滤的条件return item > 20;});alert(res);  //truealert(arr);     //10,20,30,40,50

every  每一个

【注】在数组中查找每一个元素是否符合条件,符合返回true,不符合返回false

短路操作:只要找到不符合条件的元素,后面的循环就停止了

        var arr = [10, 20, 30, 40, 50];var res = arr.every(function(item, index, arr){//过滤的条件return item < 30;  //如果条件为 item < 100;那么将会把所有的数遍历一遍});alert(res);  //falsealert(arr);     //10,20,30,40,50

reduce  归并

prev:第一次是  下标位0的元素

第二次开始  上一次遍历return的值

next:从下标1开始,当前遍历到的元素

arr:数组本身

/* prev = 10; next = 20; prev + next = 30prev = 30; next = 30; prev + next = 60prev = 60; next = 40; prev + next = 100prev = 100; next = 50; prev + next = 150res = 150*/var arr = [10, 20, 30, 40, 50];var res = arr.reduce(function(prev, next, index, arr){alert(prev + "," + next);return prev + next;});alert(res);

Javascript数组部分相关推荐

  1. [JavaScript] JavaScript数组挖掘,不只是讲数组哟(2)

    课程来源:后盾人 上一篇的内容:[JavaScript] JavaScript数组挖掘,不只是讲数组哟 数组引用类型分析,多维数组,用Array.of为数组创建细节,类型检测与转换,在一个数组后面加一 ...

  2. 这是如何更好地利用JavaScript数组的方法

    by pacdiv 由pacdiv 这是如何更好地利用JavaScript数组的方法 (Here's how you can make better use of JavaScript arrays) ...

  3. Javascript 数组

    Javascript 数组 Javascript中的Array可以包含任意数据类型,并通过索引来访问每个元素. 要取得Array的长度,直接访问length属性: var arr = [1, 2, 3 ...

  4. JavaScript 数组拼接打印_JavaScript 数组方法

    JavaScript 数组方法 JS 数组 JS 数组排序 JavaScript 数组的力量隐藏在数组方法中. 把数组转换为字符串 JavaScript 方法 toString() 把数组转换为数组值 ...

  5. 如何将JavaScript数组信息导出到csv(在客户端)?

    本文翻译自:How to export JavaScript array info to csv (on client side)? I know there are lot of questions ...

  6. 从JavaScript数组中获取随机项[重复]

    本文翻译自:Get random item from JavaScript array [duplicate] This question already has answers here : 这个问 ...

  7. 创建零填充JavaScript数组的最有效方法?

    在JavaScript中创建任意长度的零填充数组的最有效方法是什么? #1楼 使用对象符号 var x = []; 零填充? 喜欢... var x = [0,0,0,0,0,0]; 充满" ...

  8. 判断javascript数组的方法

    2019独角兽企业重金招聘Python工程师标准>>> 判断javascript数组的方法 var is_array=function(){ return value &&a ...

  9. 深入浅出 JavaScript 数组 v0.5

    有一段时间不更新博客了,今天分享给大家的是一篇关于JS数组的,数组其实比较简单,但是用法非常灵活,在工作学习中应该多学,多用,这样才能领会数组的真谛. 以下知识主要参考<JS 精粹>和&l ...

  10. Javascript数组操作(转)

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

最新文章

  1. 使用libxml提示libxml/tree.h找不到的问题解决
  2. shell date常用运算命令
  3. 完全复制一个dict_Redis主从复制getshell技巧
  4. java与.net平台之间进行RSA加密验证
  5. 想一个颠覆性技术方向建议,你能想到什么?
  6. 名图1.8智能隐藏功能_7年后再度回归 全新一代名图“大”不同_搜狐汽车
  7. 2020年软件工程现状:Python或将成为第一大编程语言,中国开源涨势最猛
  8. Solving 'stdin: is not a tty ' error
  9. PHP error_reporting() 错误控制函数功能详解
  10. c语言循环重新输入Y,大佬们帮帮忙 帮我改改 怎样能在输入Y后 再次进行for循环...
  11. iText 7 基础
  12. Wso2 api manager 帮助文档
  13. 使用VNC远程登录百度智能云服务器
  14. Thinkpad T410加内存
  15. shields 徽标_纽约公共图书馆的新徽标
  16. NVT | 67x USB MSDC设备分析
  17. 【Cocos游戏】《天天炫斗》:在手机上感受街机狂潮
  18. java sub函数,请问Sub子过程与Function函数过程有什么区别?
  19. python3.4勾股定理代码_用于解答算法题目的Python3代码框架
  20. cascade down_cascade是什么意思_cascade的翻译_音标_读音_用法_例句_爱词霸在线词典...

热门文章

  1. 短视频无尽流前端开发指南
  2. 突发!人人影视字幕组14人被抓,用户超800万,涉案金额超1600万!网友炸了:免费的片没了...
  3. 坐等膜拜|什么是真正的架构设计?十年Java经验让我总结出了这些,不愧是我
  4. android自定义波浪图,Android自定义控件--波浪图控件
  5. 惠普彩色激光打印机CM1312送稿台卡纸不能消除解决办法
  6. unicode转中文 中文转unicode的简单方式
  7. android开发之单点触摸
  8. 2015 移动技术白皮书
  9. 亚马逊aws免费云服务器搭建总结
  10. 用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机