JavaScript-基础知识

摘要:
JavaScript在移动页面中,也是不可或缺的。2011年,Node.js诞生,使JavaScript能够开发服务器程序了。JavaScript入门易学性JavaScript是有界面效果的,是弱变量类型的语言,变量只需要用var来声明JavaScript是前台语言,而不是后台语言。JavaScript运行在用户的终端网页上JavaScript的组成JavaScript基础分为三个部分:ECMAScript:JavaScript的语法标准。JavaScript的特点简单易用:可以使用任何文本编辑工具编写,只需要浏览器就可以执行程序。例如:alert;3.语法规则JavaScript对换行、缩进、空格不敏感。
一、JavaScript-简介

Web前端有三层:

  • HTML:从语义的角度,描述页面结构

  • CSS:从审美的角度,描述样式(美化页面)

  • JavaScript:从交互的角度,描述行为(提升用户体验)

JavaScript历史背景介绍

布兰登 • 艾奇(Brendan Eich,1961年~),1995年在网景公司,发明的JavaScript。

开始JavaScript叫做LiveScript,后改名为JavaScript

JavaScript和ECMAScript的关系

ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)制定的标准。

ECMAScript不是一门语言,而是一个标准

JavaScript的发展:

2004年,JavaScript命运开始改变,那一年,谷歌公司开始带头使用Ajax技术,Ajax技术就是JavaScript的一个应用。

JavaScript在移动页面中,也是不可或缺的

HTML5推出了一个东西叫做Canvas(画布),工程师可以在Canvas上进行游戏制作,利用的就是JavaScript。

2011年,Node.js诞生,使JavaScript能够开发服务器程序了。

JavaScript入门易学性

JavaScript是有界面效果的,是弱变量类型的语言,变量只需要用var来声明

JavaScript是前台语言,而不是后台语言。JavaScript运行在用户的终端网页上

JavaScript的组成

JavaScript基础分为三个部分:

  • ECMAScript:JavaScript的语法标准。包括变量、表达式、运算符、函数、if语句、for语句等。

  • DOM:操作网页上的元素的API。比如让盒子移动、变色、轮播图等。

  • BOM:操作浏览器部分功能的API。比如让浏览器自动滚动。

JavaScript的特点

(1)简单易用:可以使用任何文本编辑工具编写,只需要浏览器就可以执行程序。

(2)解释执行(解释语言):事先不编译、逐行执行、无需进行严格的变量声明。

(3)基于对象:内置大量现成对象,编写少量程序可以完成目标

二、JavaScript基础

1.JS的引入方式

1直接编写
    <script>alert('abc')
    </script>
2导入文件
    <script src="http://t.zoukankan.com/index.js"></script>

2.JS的变量

1.声明使用var关键字

vara;
a=3;

2.一行可以声明多个变量.并且可以是不同类型

var name="alex", age=20, job="teacher";

3.变量命名:

  • 首字符只能是 字母,下划线,$美元符 三选一
  • 余下的字符可以是 下划线/美元符字母/数字/ 且区分大小写,常用
  • 常见用法Camel 标记法,首字母是小写的,接下来的字母都以大写字符开头。例如: 3 var myTestValue = 0, mySecondValue = "hi";

4.“直接量”即常量,也称为“字面量”。

简单的直接量有2种:数字、字符串。例如:alert(886);

3.语法规则

(1)JavaScript对换行、缩进、空格不敏感。备注:每一条语句末尾要加上分号

(2)所有的符号,都是英语的。比如括号、引号、分号。

(3)JavaScript的注释:

//我是单行注释


/*我是多行注释
    我是多行注释
*/

4.JavaScript在网页中输出信息的写法

弹出警告框:alert("")

控制台输出:console.log("")

用户输入:prompt()

alert和prompt的区别:

alert("从前有座山");                //直接使用,不需要变量
var a = prompt("请输入一个数字");   //必须用一个变量,来接收用户输入的值

5.JS的数据类型

数据类型有:

number     -----数值
boolean    -----布尔值
string     -----字符串
undefined  -----undefined
null       -----   null  

typeof()表示“获取变量的类型”

数值型:number

  • 不区分整型数值和浮点型数值。只要是数,就是数值型

字符串类型(string):

是由Unicode字符、数字、标点符号组成的序列;字符串常量首尾由单引号或双引号括起

var a = "abcde";
    var b = "路飞";
    var c = "123123";
    var d = "哈哈哈哈哈";
    var e = "";     //空字符串

布尔类型(bolean):

Boolean类型仅有两个值:true和false
Boolean值主要用于JavaScript的控制语句

if (x==1){
      y=y+1;
}else{
      y=y-1;
      }

Undefined类型

1.Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。

2.当函数无明确返回值时,返回的也是值 "undefined";

Null类型

另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

不同:undefined 是声明了变量但未初始化时赋值,null 则用于表示尚不存在的对象。

6.变量值的传递(赋值)

将等号右边的值,赋给左边的变量;等号右边的变量,值不变。

7.变量格式转换

prompt()就是专门用来弹出能够让用户输入的对话框。重要的是:用户不管输入什么,都是字符串。

将number转化为string类型:用函数 String() toString()

将字符串转换成number类型,可用number。

parseInt()可以将字符串转数字。取整,只保留数字部分

parseFloat()可以将字符串转数字。保留小数部分的数值

8、运算符

算术运算符:
    +   -    *    /     %       ++        --
比较运算符:
    >   >=   <    <=    !=    ==    ===   !==
逻辑运算符:
     &&   ||!

赋值运算符:
    =  +=   -=  *=   /=
字符串运算符:
    +  连接,两边操作数有一个或两个是字符串就做连接运算

算术运算符:自增,自减

++i:先计算后赋值
i++:先赋值后计算

比较运算符:

>   >=   <    <=    !=    ==    ===   !==

比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型.

比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较.

==比较的是值的相同
console.log(x==y);//返回true

===比较的是值和数据类型(内存地址)
console.log(x===y);//返回false

逻辑运算符

&&表示与  两个条件都成立的时候 才成立
||表示或
有一个条件成立的时候 就成立

9、流程控制

if语句
var age = 20;
if(age>18){
    //{}相当于作用域
    console.log('成年');
}
alert('alex'); //下面的代码照样执行
if-else语句
var age = 20;
if(age>18){
    //{}相当于作用域
    console.log('成年');
}else{
    console.log('好好学习');
}
alert('alex'); //下面的代码照样执行
if-else if -else
var age = 18;
if(age==18){
    //{}相当于作用域
    console.log('成年);
}else if(age==30){
    console.log('而立');
}else{
    console.log('11')
}
alert('alex'); //下面的代码照样执行
逻辑与&&、 逻辑或|| 与if语句结合
//1.模拟  如果总分 >400 并且数学成绩 >89分 被清华大学录入//逻辑与&& 两个条件都成立的时候 才成立
if(sum>400 && math>90){
    console.log('清华大学录入成功')
}else{
    alert('高考失利')
}
//2.模拟 如果总分>400 或者你英语大于85 被复旦大学录入//逻辑或  只有有一个条件成立的时候 才成立
if(sum>500 || english>85){
    alert('被复旦大学录入')
}else{
    alert('高考又失利了')
switch 语句
case 表示一个条件,满足这个条件就会输出,直到遇到break跳出
如果不写break,程序会遇到下一个break停止。这个就是 'case穿透'
var gameSore = 'n';

        switch(gameSore){
            case 'good':
                console.log('玩的很好');
                break;
            case 'better':
                console.log('玩的更好');
                break;
            case 'best':
                console.log('玩的最好');
                break;
            default:
                console.log('很遗憾,淘汰');
                break;
        }
while循环
  1. 初始化循环变量
  2. 判断循环条件
  3. 更新循环变量
//例子:打印 1~9之间的数
var i = 1; //初始化循环变量

while(i<=9){ //判断循环条件
console.log(i);
    i = i+1; //更新循环条件
}

练习:将1~100所有是2的倍数在控制台打印。使用while循环

var i = 1;
while(i <= 100){
    if(i%2==0){
        console.log(i);
    }
    i +=1;
}
do-while循环
//不管有没有满足while中的条件do里面的代码都会走一次
var i = 3;//初始化循环变量
do{

    console.log(i)
    i++;//更新循环条件
}while (i<10) //判断循环条件
for循环

for循环遍历列表是最常用的对数据的操作

//输出1~10之间的数
for(var i = 1;i<=10;i++){
     console.log(i)
 }

练习:输入1~100之间所有数之和

var sum = 0;
for(var j = 1;j<=100;j++){
    sum = sum+j
}
console.log(sum);

for循环嵌套练习

for(var i=1;i<=3;i++){

   for(var j=0;j<6;j++){
        document.write('*')//document.write(''); 往浏览器文档中写
    }

   document.write('<br>')
 }

10、常用内置对象

在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量。

String、Math、Array、Date、RegExp都是JavaScript中重要的内置对象,在JavaScript程序大多数功能都是基于对象实现的

数组Array

字面量方式创建

var colors = ['red','green','yellow'];

使用构造函数(后面会讲)的方式创建 使用new关键词对构造函数进行创建对象,构造函数与后面的面向对象有关系

var colors = newArray();
//通过下标进行赋值
colors[0] = 'red';
colors[1] = 'green';
colors[2] = 'yellow';
console.log(colors);

数组的常用方法

JavaScript-基础知识第1张

  • 数组的合并 concat()
var north = ['北京','山东','天津'];
var south = ['东莞','深圳','上海'];

var newCity =north.concat(south);
console.log(newCity)
  • join() 将数组中元素使用指定的字符串连接起来,它会形成一个新的字符串
var score = [98,78,76,100,0];
var str = score.join('|');
console.log(str);//"98|78|76|100|0"
  • slice(start,end); 返回数组的一段记录,顾头不顾尾
var arr = ['张三','李四','王文','赵六'];
var newArr  = arr.slice(1,3);
console.log(newArr);//["李四", "王文"]
  • pop 移除数组的最后一个元素
var arr = ['张三','李四','王文','赵六'];
arr.pop();
console.log(arr);//["张三", "李四","王文"]
  • push() 向数组最后添加一个元素
var arr = ['张三','李四','王文','赵六'];
arr.push('小马哥');
console.log(arr);//["张三", "李四","王文","赵六","小马哥"]
  • reverse() 翻转数组
var names = ['alex','xiaoma','tanhuang','angle'];
//4.反转数组
names.reverse();
console.log(names);
  • sort对数组排序
var names = ['alex','xiaoma','tanhuang','abngel'];
names.sort();
console.log(names);//["alex", "angle", "tanhuang", "xiaoma"]
  • 判断是否为数组:isArray()
布尔类型值 = Array.isArray(被检测的值) ;
字符串string

JavaScript-基础知识第2张

  • chartAt() 返回指定索引的位置的字符
var str = 'alex';
var charset = str.charAt(1);
console.log(charset);//l
  • concat 返回字符串值,表示两个或多个字符串的拼接
var str1 = 'al';
var str2  = 'ex';
console.log(str1.concat(str2,str2));//alexex
  • replace(a,b) 将字符串a替换成字符串b
var a = '1234567755';
var newStr = a.replace("4567","****");//旧的,新的
console.log(newStr);//123****755
  • indexof() 查找字符的下标,如果找到返回字符串的下标,找不到则返回-1 。跟seach()方法用法一样
var str = 'alex';
console.log(str.indexOf('e'));//2
console.log(str.indexOf('p'));//-1
  • slice(start,end) 左闭右开 分割字符串
var str = '小马哥';
console.log(str.slice(1,2));//
  • split('a',1) 以字符串a分割字符串,并返回新的数组。如果第二个参数没写,表示返回整个数组,如果定义了个数,则返回数组的最大长度
var str3 = 'SAKDjlaakljfadfhajdk';
        console.log(str3.split('a',3));
  • toLowerCase()转小写
var str = 'XIAOMAGE';
console.log(str.toLowerCase());//xiaomage
  • toUpperCase()转大写
var str = 'xiaomage';
console.log(str.toUpperCase());//XIAOMAGE
Math内置对象

JavaScript-基础知识第3张

 //Math内置对象
        //1.向上取整(小数点向上加1),天花板函数
        var x = 1.3142;
        var a =Math.ceil(x);
        console.log(a);//2
        //可以用于分页
        var pageNum = 12345/6;
        console.log(Math.ceil(pageNum));//2058
        console.log(pageNum);//2057.5

        //2.地板函数(即小数点前面的数值,保持不变)
        console.log(x);//1.3142;
        console.log(Math.floor(x));//1

        //3.求两个数的最大值与最小值
        console.log(Math.max(2,5));//最大值 5
        console.log(Math.min(2,5));//最小值 2

        //4.取随机数Math.random() [0-1),初始值是0
console.log(Math.random());

        //取200-500之间的随机数 公式:min+Math.random()*(max-min)
        console.log(200+Math.random()*(500-200));

函数

函数:就是把将一些语句进行封装,然后通过调用的形式,执行这些语句。

函数的作用:

  • 解决大量的重复性的语句
  • 简化编程,让编程模块化
//1.普通函数,声明函数
        functionadd(x,y) {
            return x+y;
        }
        alert(add(1,2));//可以在任何地方调用函数

        //2.函数对象
        var add = function(x,y){
            return x+y;
        }//函数类型的
        console.log(add(3,4));
  • function:是一个关键字。中文是“函数”、“功能”。
  • 函数名字:命名规定和变量的命名规定一样。只能是字母、数字、下划线、美元符号,不能以数字开头。
  • 参数:后面有一对小括号,里面是放参数用的。
  • 大括号里面,是这个函数的语句。

js中创建对象的方式

//1.使用Object或者对象字面量创建对象
        var person =Object();
        console.log(person);
        console.log(typeofperson);

        //给对象赋值
        person.name='alex';
        person.age=20;
        console.log(person);

        var favfn = function() {
            //this 指的是当前的对象 跟python中的self类似
            console.log(this.name);
        }
        var person2={
            name:'wusir',
            age:26,
            fav:favfn
        }
        console.log(person2);
        person2.fav();
//4.原型模型式创建对象 propotype 它是当前对象的父类
        functionPerson(name,age){
            this.name=name;
            this.age=age;
        }
        
        Person.prototype.alertName = function() {
            alert(this.name);
        };

        var p1 = new Person('alex',20);
        var p2 = new Person('alex1',23);
        //内存地址与值
        console.log(p1===p2);
        p1.alertName();
        p2.alertName();

伪数组 arguments

arguments代表的是实参,只在函数中使用。

fn(2,4);
    fn(2,4,6);
    fn(2,4,6,8);

    functionfn(a,b,c) {
        console.log(arguments);
        console.log(fn.length);         //获取形参的个数
        console.log(arguments.length);  //获取实参的个数
console.log("----------------");
    }

arguments可以修改元素,但不能改变数组的长短

fn(2,4);
    fn(2,4,6);
    fn(2,4,6,8);

    functionfn(a,b) {
        arguments[0] = 99;  //将实参的第一个数改为99
        arguments.push(8);  //此方法不通过,因为无法增加元素
    }

清空数组的几种方式:

var array = [1,2,3,4,5,6];
    array.splice(0);      //方式1:删除数组中所有项目
    array.length = 0;     //方式2:length属性可以赋值,在其它语言中length是只读
    array = [];           //方式3:推荐

Date日期对象

创建日期对象只有构造函数一种方式,使用new关键字

//创建了一个date对象
var myDate = new Date();

JavaScript-基础知识第4张

//返回本地时间
console.log(myDate().toLocalString());
//内置函数
        var myDate = newDate();
        console.log(myDate);
        //获取月份中的第几天,1-31
console.log(myDate.getDate());

        //getMonth() 获取指定日期对象的月份(0-11),需要加一
        console.log(myDate.getMonth()+1);

        //返回四位数的年 2019
console.log(myDate.getFullYear());

        //getDay 返回一星期的周几,0代指的是星期日
console.log(myDate.getDay());

        //getMinutes()获取分钟数,getSecond() 获取秒数
console.log(myDate.getMinutes());
        console.log(myDate.getSeconds());

        //常用:返回本地时间,2019/2/24 上午8:45:53
        console.log(myDate.toLocaleString())

json

//json 是个轻量级的数据交换格式,json有两种结构:对象与数组
        //1.对象:
        var person={
            name:'zhangsan'};

        var packJSON={
            "name":"alex",//字符串键值对需要加上引号
            "pwd":123};
        console.log(packJSON);//是个对象

        //2.数组 是值的有序的集合
        var packJSON=[{ "name":"alex","pwd":123},{ "name":"wu","pwd":123}];
        console.log(packJSON);
        //json对象和json字符串转换,在数据传输中,JSON通常是字符串形式传递的
        //js常见操作json对象,所有json对象和json字符串转换非常重要的,用parse内置函数
        var jsonStr = '{"name":"alex","pwd":123}';
        var jsonobject = JSON.parse(jsonStr);//json要大写
console.log(jsonobject);

        //(2).将json对象 转为 json字符串
        var jsonStr2 =JSON.stringify(jsonobject);
        console.log(jsonStr2);//{"name":"alex","pwd":123}

        //3.遍历JSON对象与JSON数组
        //(1).遍历json对象,使用for in
        var packJson = {"name":"alex","pwd":123};
        for (var k inpackJson){
            //k指的是键值对的key值
            console.log( k + ' ' +packJson[k])
        }
        //(2).遍历JSON数组
        var packJson = [{"name":"alex","pwd":123},{"name":"wusir","pwd":123}];
        for (var i inpackJson){
            console.log(i + ' '+ packJson[i].name+' '+packJson[i].pwd);
        }

正则表达式:
对象 RegExp 正则表达式:检索字符串 用来规定文本检索的内容

//1.-----------创建正则表达式---
        //1.1构造函数 new RegExp(检测文本,修饰符) i 不区分大小写 g:全局匹配
        var str = "luffy 2018";
        var reg = new RegExp("l","ig");

        //1.2  字面量方式创建
        var reg1 = /y/ig;  //不区分大小写,全局匹配

        //2.检索方式:
        //2.1 test() 检索字符串中是否包含定义字符模式,返回布尔
        //要检索的字符在不在str中存在  在 返回true  不在 返回flase
console.log(reg1.test(str));

        //2.2 exec()  是检测字符串中正则表达式 的匹配
        //如果匹配到了  那么就返回一个存放有结果的数组,如果没有匹配就返回一个null
        console.log(reg1.lastIndex);//0  保存一次匹配时开始的下标
        console.log(reg1.exec(str)); //返回个数组结果,若无,则返回null
        console.log(reg1.lastIndex);//5


        //常用方法:
        //1.match  字符串.match(正则)
        var str = "hello world";
        var reg = /o/g;
        //使用 正则表达式模式对字符串执行查找,并将包含查找的的结果作为数组返回
        console.log(str.match(reg)); //["o","o"]


        //2.replace 替换  replace(被替换的,替换的)
        console.log(str.replace(reg,"*"));

        //3.search()
        console.log(str.search(reg));//查询字符串 在字符串中出现的下标

        //4. split 以匹配的规则分割
        console.log(str.split(reg));

元字符:一些匹配的规则

 //1  . 匹配除换行符以外的任意字符
        window.onload=function(){
            var str = "luffyCity 2018";
            var reg = /./g; //默认检索第一个字符
            console.log(reg.exec(str));//l
};

        //如果不想让字符有其他意义  转移  .代表匹配
        str = "www.baidu.com";
        var reg = /www.......com/g;
        console.log(reg.exec(str));//www.baidu.com

        //2. []:匹配[]里面的任意一个字符
        var str1 = "hello";
        var reg1 = /[a-zA-z0-9]/g;//a-z 小写,A-Z大写,0-9数字
        console.log(reg1.exec(str1));//h

        var str2= 'a1343';
        var reg2 = /[0-9][0-9][0-9]/g;
        console.log(reg2.exec(str2));//134
        //3. [^] 所有不在这个范围的字符
        var str3 = "abd123";
        var reg3 = /[^a-z][^A-Z]/g; //匹配条件 以外的字符,两个字符两个字符的匹配
        console.log(reg3.exec(str3));//12
        //4.d:匹配数字  对立 d:匹配非数字
        var str4="web";
        var reg4 = /d/g;  //匹配数字
        var reg5 = /D/g; //非数字
        console.log(reg4.exec(str4));//null
        console.log(reg5.exec(str4));//w

        //5.w:匹配数字 字母 下划线  w:匹配除数字、字母,下划线以外的任意字符
        var reg6 = /w/g; //匹配数字  字母 下划线
        var reg7 = /W/g; //匹配 w 以外的任意字符(非w)
        console.log(reg6.exec(str4));//w
        console.log(reg7.exec(str4));//null

        //6.s:匹配空格 trim()
        var str5 = ' luffy';
        var reg8 = /s/g;//空格
        var reg9 = /S/g; //非空白字符
        console.log(reg8.exec(str5)); //' '
        console.log(reg9.exec(str5));//l

        //7.^:以什么开头   $:是以什么结尾
        var str6 = "www.luffy.com";
        var reg10 = /^www/g; //^字符
        console.log(reg10.exec(str6));//www
        var reg11 = /^www.......com$/g; //字符$
        console.log(reg11.exec(str6));//www.luffy.com//-------------------------------------------------------------------
        //重复的字符
        //7. ?:匹配字符第一个字符 结果返回:空或'1';
        var str7 = "webr44546ere";
        var reg12 = /[0-9]?/g;
        console.log(reg12.exec(str7));//"1"

        //8.*:首位是否符合条件,不符合返回空;符合,则看首位一直向后符合的位数
        var reg13 = /[a-z]*/g; //匹配小写字母,0个或者多个
        console.log(reg13.exec(str7));//' ',

        //9.+:匹配数字,至少匹配一次
        var reg14 = /d+/g;
        console.log(reg14.exec(str7));//123

        //10.匹配连续的10个字符
        //11.{min,max} 至少min个最多max个

免责声明:文章转载自《JavaScript-基础知识》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于Centos 7 vue+nginx+docker 的前端项目部署黑盒测试中的一些小经验下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PostgreSQL 字符串操作函数 迎客

函数:string || string 说明:String concatenation 字符串连接操作例子:'Post' || 'greSQL' = PostgreSQL 函数:string || non-string or non-string || string说明:String concatenation with one non-string i...

Lua字符串及模式匹配

字符类基础函数举例介绍: string.len( ‘string’ ) string.lower( ‘string’ ) string.upper( ‘string’ ) string.rep( ‘a’ , 5 ) ==> aaaaa string.sub( ‘string’ , I , j ) string.sub(...

.Net程序员学用Oracle系列(9):系统函数(上)

1、字符函数 1.1、字符函数简介 1.2、语法说明及案例 2、数字函数 2.1、数字函数简介 2.2、语法说明及案例 3、日期函数 3.1、日期函数简介 3.2、语法说明及案例 3.3、日期函数补充 4、总结 Oracle 中系统函数特别多,有好几百个,其中大部分函数对开发者而言,似乎永远都用不到,本文将要介绍 Ora...

AWK命令简介

原文:未知。 一、AWK简介        AWK名字来源于三位创造者Aho、Weinberger和Kernighan统称。        AWK擅长处理文本数据。二、AWK的调用方式        awk [-Ffs] [-v var=value] [program | -f progfile ...] [file ...]        1、命令行方式...

TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)

注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): 其中TWinControl对TControl有10个消息进行了覆盖(红色标记),其中有2个是WM_消息,8个是CM_消息。 TWinControl = class(TControl) private //41个windows消息,几乎全部消息都是私有函数(...

暴雪HASH算法(转)

暴雪公司有个经典的字符串的hash公式 先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做? 有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能...