<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>