Javascript_2_動態函數_匿名函數_String物件_原型屬性
<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.prototype objectName 参数是对象的名称。 说明 用 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>
以上就是Javascript_2_動態函數_匿名函數_String物件_原型屬性的內容,更多相關內容請注意PHP中文網(www .php.cn)!