Javascript_2_动态函数_匿名函数_String对象_原型属性

来源:互联网 发布:济南百度快照优化 编辑:程序博客网 时间:2024/06/08 19:22
<html xmlns="http://www.w3.org/1999/xhtml">    <head>    <meta http-equiv="Content-Type" content="text/html; charset=GBK" />    <title>javascript演示4</title>    </head>    <body>    <h1>javascript演示4</h1>    <script type="text/javascript" src="a.js">    </script>    <script type="text/javascript">    /*     * JS函数的其他表现形式:动态函数和匿名函数     1,动态函数,使用js内置对象Function对象     方法:new Function("参数列表","方法体");     */    var add=new Function("x,y","var sum;sum=x+y;return sum;");    println(add(6,7));//13    function add2(x,y){    var sum;    sum=x+y;    return sum;    }    /*     * 这两种究竟有何区别?     * 如果是function 函数名(){}这种写法就写死了!     * 而,new Function("参数列表","方法体")     * 参数列表和方法体 都是字符串,未知的,可变化     * 可以通过字符串动态指定!但很少使用!     */    //匿名函数:没有名字的函数 是种简写形式,    //这个在事件处理时,用得较多!    var add3=function (x,y){    return x+y;    }    println(add3(4,6));        function hehe(){    println("hehe run");    }    var xixi=hehe;//让xixi指向了hehe指向的函数对象    /*     * 上面这两段代码就可以简写成下面这一句代码:     * 即匿名函数     */    var xixi=function(){    println("hehe run");    }    //综合练习1:求数组最大值    var arr1=[2,4,6,7,133,244,67];    function getMax(arr){    var maxIndex=0;    for (var i=0; i < arr.length; i++) {            if(arr[i]>arr[maxIndex]){            maxIndex=i;            }        }        return arr[maxIndex];    }    println(getMax(arr1));//244    //综合练习2:选择排序    function sortArray(arr){    for (var i=0; i < arr.length-1; i++) {            for (var j=i; j < arr.length; j++) {            if (arr[i]>arr[j]) {                    var temp=arr[i];                    arr[i]=arr[j];                    arr[j]=temp;            }        }        }    }    println("排序前:"+arr1);    //排序前:2,4,6,7,133,244,67    sortArray(arr1);    println("排序后:"+arr1);//排序后:2,4,6,7,67,133,244/* * 函数对象被直接打印:字符串代码 * 数组对象被直接打印:逗号连接各个数组成员 *///综合练习3:查找 function searchElement(arr,value){        for (var i=0; i < arr.length; i++) {        if(arr[i]==value){                return i;        }        }        return -1;}println(searchElement(arr1,67));//折半查找:又称二分查找法(前提必须是有序的)function binarySearch(arr,value){        var min,mid,max;        min=0;        max=arr.length-1;        while(min<=max){        mid=(max+min)/2;        //也可以写成>>1        if (value>arr[mid]) {                min=mid+1;        }         else if (value<arr[mid]) {                max=mid-1;        }         else{                return mid;        };        }        return -1;//循环完了还有找到}println(binarySearch(arr1,67));println(binarySearch(arr1,68));/* * 综合练习4:对数组进行反转 */function reverseArray(arr){        for(var start=0,end=arr.length-1;start<end;start++,end--){        swap(arr,start,end);        }}function swap(arr,i,j){        var temp=arr[i];        arr[i]=arr[j];        arr[j]=temp;} println("反转前:"+arr1);    reverseArray(arr1);    println("反转后:"+arr1);    //反转前:2,4,6,7,67,133,244//反转后:244,133,67,7,6,4,2/* * JS变量的特点: * 1,只有在函数体内定义的变量是局部变量 * function 函数名(){ * var sum=0; * } */function show(){        var show_sum=1000;//这个是局部变量,函数体外不能使用!        alert(show_sum);}/* * 全局变量:在直接在script标签中定义的变量 * 在该页面的所有script标签都有效! */var test_1="abc";for (var i=0; i < 3; i++) {        println(i);}    </script>    <script type="text/javascript">    println(test_1);//abc    println(i);//3   在上一个script标签的for循环里定义的    println(arr1);//244,133,67,7,6,4,2    for (var i=0; i < 3; i++) {//这不是新定义变量,而是对已有i重新赋值        }        /*         * 下面这个例子将演示形参         */        var x=3;        function show(x){//形参,局部变量         x=8;        println("函数里面:"+x);        }        show(x);        println(x);//3        function show(){        println("show run");        }        println(show.toString());//相当于alert(show);        var arr=[2,4,6,7];        println(arr.toString());//相当于        println(arr);//相当于        println(arr.valueOf());        /*         * valueOf 方法返回指定对象的原始值。object.valueOf( )必选项 object 参数是任意固有 JScript 对象。 说明每个 JScript 固有对象的 valueOf 方法定义不同。对象 返回值 Array 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。 Boolean Boolean 值。 Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 Function 函数本身。 Number 数字值。 Object 对象本身。这是默认情况。 String 字符串值。 Math 和 Error 对象没有 valueOf 方法。          *          *          * toString 方法返回对象的字符串表示。objectname.toString([radix])参数objectname必选项。要得到字符串表示的对象。radix可选项。指定将数字值转换为字符串时的进制。说明toString 方法是所有内建的 JScript 对象的成员。它的操作依赖于对象的类型:对象 操作 Array 将 Array 的元素转换为字符串。结果字符串由逗号分隔,且连接起来。 Boolean 如果 Boolean 值是 true,则返回 “true”。否则,返回 “false”。 Date 返回日期的文字表示法。 Error 返回一个包含相关错误消息的字符串。 Function 返回如下格式的字符串,其中 functionname 是被调用 toString 方法函数的名称: function functionname( ) { [native code] }Number 返回数字的文字表示。 String 返回 String 对象的值。 默认 返回 “[object objectname]”,其中 objectname 是对象类型的名称。         */        var abc=function(){        println("abc run");        }        println(abc);        println(abc.valueOf());        println(arr.valueOf());        //String对象        var str1=new String("abc");        var str2="abc";        println(str1.length);        println(str1.bold());        println(str1.fontcolor("red"));        println(str1.link("http://www.baidu.com"));        /*         * 在Java中获取字符串长度是用方法()         * 而在JS当中,用的是属性!注意区别         * substr 方法返回一个从指定位置开始的指定长度的子字符串。stringvar.substr(start [, length ])参数stringvar必选项。要提取子字符串的字符串文字或 String 对象。start    必选项。所需的子字符串的起始位置。字符串中的第一个字符的索引为 0。length   可选项。在返回的子字符串中应包括的字符个数。说明如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到 stringvar 的最后。下面的示例演示了substr 方法的用法。function SubstrDemo(){   var s, ss;                // 声明变量。   var s = "The rain in Spain falls mainly in the plain.";   ss = s.substr(12, 5);  // 获取子字符串。   return(ss);               // 返回 "Spain"。}         *          *          * substring 方法返回位于 String 对象中指定位置的子字符串。 strVariable.substring(start, end)"String Literal".substring(start, end)参数start指明子字符串的起始位置,该索引从 0 开始起算。end指明子字符串的结束位置,该索引从 0 开始起算。说明substring 方法将返回一个包含从 start 到最后(不包含 end )的子字符串的字符串。substring 方法使用 start 和 end 两者中的较小值作为子字符串的起始点。例如, strvar.substring(0, 3) 和 strvar.substring(3, 0) 将返回相同的子字符串。 如果 start 或 end 为 NaN 或者负数,那么将其替换为0。 子字符串的长度等于 start 和 end 之差的绝对值。例如,在 strvar.substring(0, 3) 和 strvar.substring(3, 0) 返回的子字符串的的长度是 3。 下面的示例演示了 substring 方法的用法。function SubstringDemo(){   var ss;                         // 声明变量。   var s = "The rain in Spain falls mainly in the plain..";   ss = s.substring(12, 17);   // 取子字符串。   return(ss);                     // 返回子字符串。}         *          * charAt 方法返回指定索引位置处的字符。strObj.charAt(index)参数strObj必选项。任意 String 对象或文字。index必选项。想得到的字符的基于零的索引。有效值是 0 与字符串长度减 1 之间的值。说明charAt 方法返回一个字符值,该字符位于指定索引位置。字符串中的第一个字符的索引为 0,第二个的索引为 1,等等。超出有效范围的索引值返回空字符串。示例下面的示例说明了 charAt 方法的用法:function charAtTest(n){   var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 初始化变量。   var s;                                  // 声名变量。   s = str.charAt(n - 1);                  // 从索引为n – 1的位置处                                           // 获取正确的字符。   return(s);                              //返回字符。}         *          */        var str="abcde";        println(str.substr(1,3));//从下标为1开始取3个长度:bde        println(str.substring(1,3));//开始为1,结束为3,长度为2: bc        /*         * 练习1:自定义方法,去除字符串两端的空格         * 两个指针,一个从头找空格,一个从尾找空格,再取长度         * 同时提防 字符串全是空格的情况          */        function trim(str){        var start,end;        start=0;        end=str.length-1;        while(start<=end&&str.charAt(start)==' '){                start++;        }        while(start<=end&&str.charAt(end)==" "){                end--;        }        return str.substring(start,end+1);//关键!!!        }        str="      a   bc     ";        println("-"+trim(str)+"-");        /*         * prototype 属性返回对象类型原型的引用。objectName.prototypeobjectName 参数是对象的名称。 说明用 prototype 属性提供对象的类的一组基本功能。 对象的新实例“继承”赋予该对象原型的操作。 例如,要为 Array 对象添加返回数组中最大元素值的方法。 要完成这一点,声明该函数,将它加入 Array.prototype, 并使用它。 function array_max( ){   var i, max = this[0];   for (i = 1; i < this.length; i++)   {   if (max < this[i])   max = this[i];   }   return max;}Array.prototype.max = array_max;var x = new Array(1, 2, 3, 4, 5, 6);var y = x.max( );该代码执行后,y 保存数组 x 中的最大值,或说 6。所有 JScript 固有对象都有只读的 prototype 属性。可以象该例中那样为原型添加功能,但该对象不能被赋予不同的原型。然而,用户定义的对象可以被赋给新的原型。本语言参考中每个内部对象的方法和属性列表指出哪些是对象原型的部分,哪些不是。          */        //prototype属性,需求:将trim功能添加到String对象里面去        //第1种方法;先定义好函数,再指向引用,即函数名        //函数没参数,函数体使用this        //第2种方法:使用匿名函数        function trim2(){        var start,end;        start=0;        end=this.length-1;        while(start<=end&&this.charAt(start)==' '){                start++;        }        while(start<=end&&this.charAt(end)==" "){                end--;        }        return this.substring(start,end+1);//关键!!!        }        String.prototype.trim=trim2;        str1="      a   bc     ";        println("-"+str1.trim()+"-");        //第2种演示:        String.prototype.trim1=function(){        var start,end;        start=0;        end=this.length-1;        while(start<=end&&this.charAt(start)==' '){                start++;        }        while(start<=end&&this.charAt(end)==" "){                end--;        }        return this.substring(start,end+1);//关键!!!        }        str2="      ab   bc     ";        println("-"+str2.trim1()+"-");        String.prototype.len=199;        println("abc".len);        //原型练习1:将字符串变成字符数组        String.prototype.toCharArray=function(){        var chs=[];        for (var i=0; i < this.length; i++) {                chs[i]=this.charAt(i);        }        return chs;        }        str3="a      ab   bcd     z";        println(str3);        println(str3.toCharArray());        //原型练习2:将字符串反转        String.prototype.reverse=function(){        var arr=this.toCharArray();        for (var start=0,end=arr.length-1; start <end; start++,end--) {          swap(arr,start,end);        }        return arr.join();        }        str4="a      ab   bcd     z";        println(str4);        println(str4.reverse());        /*         * Java不允许在函数里面还有函数         * 但是,JS却可以,因为函数是封装体,是对象,相当于内部类         */    </script>    </body></html>