数组的应用
a.顺序查找
var a = [3,7,11,57,94,34,47,35,23,12];
var num = Number(prompt("请输入要查找的值"));
var index = -1;//最初认为要找的数不在数组中
for(var i in a){
if(a[i] == num){
index = i;
break;
}
}
alert(index);
这种查找方法最简单,但是查找次数与数据量成正比,效率不高。
b.折半查找(二分查找)
假设在一个已经有序的数组中,可以利用折半查找大幅提高效率。
<script>
/*
* 思路:
* (1)用start表示查找范围的起点,end表示终点
* (2)只要start<=end就重复步骤(3)
* (3)和中间(mid)的那个数进行比较
* a.相等:找到了,结束
* b.大于:在前半段找,即end=mid-1
* c.小于:在后半段找,即start=mid+1
* (4)输出查找结果
* log2n
* */
var a = [3,7,11,12,23,34,35,47,57,94];
var num = Number(prompt("请输入要查找的值"));
var index = -1;//最初认为要找的数不在数组中
var start = 0;
var end = a.length-1;
while(start<=end){
var mid = Math.ceil((start+end)/2);
if(num == a[mid]){
index = mid;
break;
}else{
if(num > a[mid]){
//在后半段找
start = mid+1;
}else{
//在前半段找
end = mid-1;
}
}
}
alert(index);
</script>
折半查找的最坏查找次数和数据量的关系是对数关系,所以说它的查找效率很高,但是任何事情往往都有两面性,它的高效率也是有代价的,也就是要求有序。
(2)排序(冒泡排序)
<script>
var a = [3,7,11,43,87,5,99,22,51,8];
for(var i=0; i<a.length-1; i++){
for (var j=0; j<a.length-1-i; j++) {
var temp;
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
alert(a);
</script>
冒泡排序的代价也是比较大的,很多时候做的是无用功,选择排序进行了优化。
选择排序
(3)队列
先进先出(FIFO),在头部出队(shift()),在尾部入队(push())
var a = [];
a.push(1);
document.write(a.toString()+"<br>");
a.push(2);
document.write(a.toString()+"<br>");
a.push(3);
document.write(a.toString()+"<br>");
a.shift();
document.write(a.toString()+"<br>");
a.shift();
document.write(a.toString()+"<br>");
a.shift();
document.write(a.toString()+"<br>");
(4)堆栈
先进后出(FILO),在尾部进栈(push()),在尾部出栈(pop())
var a = [];
a.push(1);
document.write(a.toString()+"<br>");
a.push(2);
document.write(a.toString()+"<br>");
a.push(3);
document.write(a.toString()+"<br>");
a.pop();
document.write(a.toString()+"<br>");
a.pop();
document.write(a.toString()+"<br>");
a.pop();
document.write(a.toString()+"<br>");
常用对象
2.1字符串
字符串的定义:定义一个变量,然后直接将字符串赋值给它。
var str = “abc123”;
字符串实际上是字符组成的数组,所以数组的方法它基本上都有。
(1)访问字符串里面的字符:
a.和数组的方式一样(str[i])
b.字符串特有的方式charAt(i)
(2)查找
a.数组方式:indexOf
b.字符串方式:search方法:传入参数(要搜索的子串),返回子串的第一个字符在父串的下标。这个方法对大小写敏感。
search()方法的功能比indexOf更强大,它可以使用正则表达式形式来查找
(3)取子串
a.数组方式:slice():传入参数开始下标和结束下标,并返回子串
b.字符串特有的方法:
substr(start,length):传入参数开始下标和截取长度,取子串,如果没有第二个参数,会截取到最后。
substring(start,end):传入两个参数,第一个参数,开始截取的下标,第二个是截取结束的下标。
(4)替换
a.数组方式:splice()
b.字符串方式:replace():替换字符串中的子串,有两个参数,第一个是要被替换的子串,第二个参数是替换的新的子串。
toUpperCase():小写字母转换为大写字母
var str = prompt("请输入一个英文字符串");//abc
Str = str.toUpperCase();
alert(str);//ABC
toLowerCase():大写字母转换为小写字母
charCodeAt():获取字符串某一个位置字符的Unicode编码
fromCharCode():将某个Unicode字符编码转换为对应的字符
<script>
var str = prompt("请输入一个英文字符串");
var result = "";
for(var i=0; i<str.length; i++){
var char = str.charAt(i);
var code = char.charCodeAt();//转成ASCII
alert(char);
if(code>=97 && code<=122){
code = code - 32;
char = String.fromCharCode(code);
}
result += char;
}
alert(result);
</script>
trim():去除字符串两边的空格符
var str = " 请输入一个英文字符串 ";
str = str.trim();
alert(str);
split(x):字符串的分割。用字符串“x”进行分割。分割之后是一个数组
数组有一个toString方法,将数组转换成字符串,元素之间用逗号隔开
var a = "a b c";
var result = a.split(" ");
alert(result);//["a","b","c"]
2.2日期
定义:
var d = new Date();
var d = new Date(2017,3,22,8,30,22;
不给参数,定义的日期为执行这条指令时那一刻的系统的时间,当然也可以指定年月日时分秒参数,但是要特别注意的是从0开始,即0表示1月
修改日期分量:
setYear()、setMonth()、setDate()……
获取日期分量:
getYear()、getMonth()
getMilliseconds()是获取毫秒分量
getTime()获取的是1970-1-1 00:00:00至指定日期所经历的毫秒数
日期转换成字符串
var d = new Date(2017,3,22,8,30,22);
document.write(d.toString()+"<br>");
document.write(d.toDateString()+"<br>");
document.write(d.toLocaleDateString()+"<br>");
document.write(d.toLocaleTimeString()+"<br>");
document.write(d.toTimeString()+"<br>");
document.write(d.toUTCString()+"<br>");
日期运算
d1>d2
d1-d2:两个日期相隔的毫秒数
便捷计算某月天数的方法
var month = 2;
var d = new Date(2017,month,0);
document.write(d.getDate()+"<br>");
2.3其它对象
Math对象
Math.max(n1,n2……):取得一组数据中的最大值
Math.min(n1,n2……):取得一组数据中的最小值
Math.PI:圆周率,π的值
Math.E:算术常量e,自然对数的底数
Math.pow(x,y):计算x的y次方
Math.sqrt(x):返回数的平方根
Math.abs(x):返回x的绝对值
Math.floor(x):对x向下取整
Math.ceil(x):x向上取整
Math.round(x):x四舍五入
Math.random():获取一个0~1的随机数
Number对象
toExponential():科学计数法表示,指数计数法,
var e = 10000;
var n = e.toExponential();
alert(n);//1e+4,string
toFixed(x):保留x位小数,并把数字转换为字符串,四舍五入
var e = 1.123;
e = e.toFixed(2);
alert(e);//1.12
toPrecision(x):将数字保留x位,并且返回的是string类型
var a = 1.23243;
var b = a.toPrecision(4);
alert(b);//1.232