Javascript学习笔记
是一门程序设计语言
基于对象和事件驱动语言(点击之类的),用于客户端,不同于jsp是用在服务端的。
特点:
1,交互性
2,安全性(不允许直接访问硬盘)
3,跨平台(只要能解释JS的浏览器就可以执行,和平台无关)
Javascript和Java之间的关系
Java和Javascript就像雷锋和雷峰塔的关系一样
1,Javascript基于对象,Java面向对象
2,Javascript解释执行,Java要先编译在执行。
3,Javascript弱类型,Java强类型。
Javascript和html结合方式
1,将javascript代码封装到<script>标签中
1 <script type="text/javascript"> 2 alert("Hello Javascript"); 3 </script>
2,将javascript代码封装到js文件中,并通过<script>标签中的src属性进行导入,在这个js文件中的函数,当前页面的其他函数都可以使用
注意:通过<script>中的src属性指定导入js之后,当前标签内部的js代码将不会执行,但是后续标签内部的代码不受影响。
1 <script type="text/javascript" src="demo.js"></script>//通常用来导入工具包
Javascript语法
1,关键字
2,标识符
3,注释
4,变量:标记一片内存空间
5,运算符
6,语句
7,函数
8,对象
变量
全局变量
在<script type="text/javascript"></script>标签中定义的变量,在该页面中都是有效的
<script type="text/javascript">
for(var x = 0 ;x<3;x++)
{
document.write("x="+x);
}
document.write("x="+x);//此时作为x仍然可以输出,是一个在该页面全局有效的全局变量
</script>
局部变量是在函数内部定义的,只在函数中有效。
变量的一些命名规则
var bX = true;//boolean类型
var iN = 3;//整型
var sStr = "abc";//字符串类型
var oMap = {};//实体类型,数组,集合之类的
运算符
1 <script type="text/javascript"> 2 //算术运算符 3 var x = 4235;//弱类型 4 alert(x/1000*1000);//输出为4235,并不是4000 5 alert("12"+1);//121 6 alert("12"-1);//11 7 alert(true+1);//2 js中false就是0或者null,非0非null就是true,默认用1表示。 8 //逻辑运算符 && || 9 //位运算符 & | >><< >>>按位运算 10 var c = 6; 11 alert(c&3);//2 12 alert(5^3^3);//5 异或同一个数,等于本身 13 alert(c>>1);//3 右移1位 除以2的1次方 14 alert(c<<2);//24 左移2位 乘以2的平方 15 //三元运算符 16 </script>
一些细节:
a.undefined:未定义,就是一个常量
var x;//定义一个变量,但是不对其进行赋值的话,如果下面使用到该变量,就会出现undefined,说明x的值就是undefined,如果变量x未定义就直接使用的话,会报未定义错误
//一个是值未定义,一个是变量未定义
b.获取变量类型:
1 <script type="text/javascript"> 2 typeof("abc");//string 为什么是小写 3 typeof('9');//string 4 typeof(true);//boolean 5 typeof(2.5);//number 6 typeof(78);//number 7 </script>
语句
1 <script type="text/javascript"> //with语句,为了简化对象对象调用内容的书写 with(对象){ 在这里调用该对象方法时,不用写 对象.方法,直接写方法 } //for in 语句用于对对象进行遍历的语句,一般是对一些自定义的对象遍历 for( 变量 in 对象){ } 2 //顺序结构 3 //if语句 4 var x = 3; 5 if(4 == x)//这样写可以预防错误 6 { 7 alert("no"); 8 }else 9 { 10 alert("yes") 11 } 12 //switch语句 13 var x = "abc"; 14 switch(x) { 15 case "kk": 16 alert("a"); 17 break; 18 case "abc": 19 alert("b"); 20 break; 21 default: 22 alert("c"); 23 break;//可省略 } 24 //循环结构 25 //while语句 26 var x = 3; 27 while(x<3){ 28 alert("x="+x); 29 //将数据直接写到当前页面中 如果输出的字符串是html标签,此时浏览器就可以进行解析 30 document.write("x="+x+"<br/>"); 31 x++; 32 } 33 //for语句 34 for(var x = 0;x<3;x++){ 35 document.write("x="+x); 36 } 37 //break:跳出选择结构,跳出循环结构 38 //continue:结束本次循环,执行下次循环 39 //带标号的循环。直接break w所表示的循环 40 w:for(var x = 0;x<3;x++){ 41 for(var y = 0;y<4;y++){ 42 document.write("x="+x); 43 break w;//跳出w表示的循环 continue w; 跳出w的当前循环,并进行下一次循环 44 } 45 } 46 47 </script>
数组
1,数组长度是可变的
2,数组的元素类型是任意的
建议在使用数组时使用同一类型的数据,操作方便
<script type="text/javascript"> //定义方式1 var arr = []; var arr1 = [1,2,3,5]; alert(typeof(arr)); alert("len="+arr.length); //定义方式2 var arr = new Array();//与第一种一样 var arr1 = new Array(5);//定义数组长度为5 var arr2 = new Array(4,5,6);//定义一个数组,元素是4,5,6 //遍历 for(var x = 0;x<arr.length;x++){ document.write("arr[x]") } </script>
函数
定义函数的格式
通过关键字来定义
function 函数名(参数列表){}
细节问题
1,只要使用了函数名称,就是对函数的调用
2,函数中有一个数组在对传入的参数进行存储,数组就是arguments,遍历该数组就可以拿到所有的传入参数
3,函数名就是函数对象的引用变量,如果直接把函数对象用字符串输出的话,那输出的结果就是函数的代码,如果把函数名赋值给另一个变量的话,那么就会有两个引用变量指向同一个函数对象。
1 <script type="text/javascript"> 2 //定义一个函数 3 function demo() 4 { 5 alert("demo run"); 6 return; 7 } 8 demo();//函数调用 9 //定义加法 10 function add(x,y) 11 { 12 return x+y; 13 } 14 var sum = add(4,5); 15 alert("sum="+sum); 16 //相关细节问题 17 function show(x,y) 18 { 19 alert("len="+arguments.length) 20 alert("x="+x+"..y="+y); 21 } 22 show(4,5,6,7,8);//调用时,传入5个实参,而函数只有两个形参,所以只有前两个有作用,但是所有的参数都会传入到函数中,存放在arguments参数中 23 24 function getSum()//函数名就是函数对象的引用变量,如果直接把函数对象用字符串输出的话,那输出的结果就是函数的代码 25 { //如果把函数名赋值给另一个变量的话,那么就会有两个引用变量指向同一个函数对象 26 return 100; 27 } 28 var sum1 = getSum(); 29 alert("sum1="+sum1);
30 function show1() 31 { 32 alert("show1 run..."); 33 } 34 alert(show1());//这个语句会先运行show1(),所以会先弹窗 show1 run... 然后再显示 show1 这个函数的运行结果 由于show1没有返回值,所以会再输出undefined 36 alert(show1);//show1 是一个引用变量,指向了show1函数对象,这个语句会将 show1的函数代码弹出 37 38 39 </script>
动态函数
使用较少
使用的是js中的一个内置对象Function
Function中的参数全是字符串,可以通过外部赋值来改变函数的形参列表和具体函数功能
1 <script type="text/javascript"> 2 var add = new Function("x,y","var sum; sum = x+y; return sum;") 3 var he = add(4,8); 4 alert("he="+he); 5 </script>
匿名函数
函数的简写形式
<script type="text/javascript"> var add3 = function() { return a+b; } alert(add3(4,5)); </script>
对象
java中强调一类对象,js中强调某个对象(将js中的对象理解为java中的类?)
A-,自定义对象(理解为java中的类?)
如果想要自定义对象,应该先对对象进行描述,而Javascript是基于对象,不是面向对象的,不具备描述对象的能力,我还想按照面向对象的思想来编写Javascript。
在Java中用类来描述一类事物,而在Javascript中可以用函数来模拟对象的描述。
//定义方法一 用js来描述人,使用无参对象 function Person(){ //相当于构造器 alert("Person run..."); }
//用描述进行对象的建立 new
var p = new Person();//这个函数在建立的时候就直接运行了,所有上面的函数相当于构造器
//动态给p对象添加属性,直接使用 p.属性名即可
p.name = "zhangsan";
p.age = 23;
//定义成员函数
p.show = function(){
alert("show run...");
alert("name:"+this.name+"....age:"+this.age);
}
p.show();//调用p对象的show()方法
//定义方法二 使用有参函数来描述,注意this关键字不省略
function Person1(name,age){
this.name = name;
this.age = age;
this.setName = function(name){
this.name = name;
}
this.getName(){
return this.name;
}
}
var p1 = new Person("Jack",23);
alert(p1.name);
//定义方法三 封装一些实体,一个集合,封装一系列键值对,用逗号隔开,键值也可以不加引号
var p2 = {
"name":"Jack","age":23,
"getName":function(){
return this.name;
}
}
//对象调用成员两种方法
alert("name:"+p2.name+"...age:"+p2["age"]);//注意引号不能少,中括号中应该是一个属性值,用字符串代表的属性值
for(x in p2){
document.write(x+":"+p2[x]);//这里需要用中括号这种引用方式,x代表这个集合中的键值
}
这三种定义方法都是建立了一系列的键值对集合,只是建立形式不同,对于成员变量来说,键就是变量名,值就是变量的值;对于成员函数来说,键就是函数名,值就是函数的具体代码,如果直接将函数名输出,那么输出结果是函数的代码,如果输出的函数名后面跟有小括号,那么输出的是函数的运行结果。
另外,第三种方式可以用来实现map集合,模拟Java中的map集合
var map = {"name1":"xiaoming","name2":"xiaoqiang","name3":"zhangsan"};//键值不加引号也是可以的
var val1 = map["name1"];//但是引用的时候一定要加引号
alert("val1:"+val1);
//键值对中的值也可以是一个数组
var oMap = {
names:["xiaoming","lisi","zhangsan"],ages:[23,34,45]
}
alert(oMap.names);//全部输出
alert(oMap.names[2]);//某个数据
A,Object对象的方法
不同对象有不同的toString方法
a,数组的toString()方法是将数组输出,用逗号隔开
b,函数对象的toSting()方法是将函数代码输出
//Object对象方法 //toString方法 function show(){ alert("show run..."); } alert(show.toString());//alert(show)默认也是调用show的toString()方法来输出 var arr = [1,2,3,4]; arr.toString();
valueof()方法和toString()方法类似
B,String对象
var str1 = new String("abc");//在java中,String str = "abc"; js中所有数据类型都可以通过var来定义 var str2 = "abcd"; //string的length属性 document.write(str2.length);//字符串长度 //给字符串加上一些html标签的方法 document.write(str2.bold);//在字符串两端加上<B></B>,如果直接输出到html页面中,就会被解析为加粗 alert(str2.bold);//弹窗显示内容为<B>abcd</B> document.write(str2.fontcolor("red"));//设置字体颜色 document.write(str2.link("http://www.baidu.com"));//将字符串设置为超链接 document.write(str2.sub(1,3));//子串,1是头,3是长度 document.write(str2.substring(1,3))//子串,包含头,不包含尾
除了使用string自带的方法,还可以自定义字符串操作方法
a,自定义一个外部函数,用来去除字符串两端的空格
//自定义去除字符串两端空格的方法
function mytrim(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); } var str = " abcde "; alert(trim(str));
b,将该函数定义为string对象的内部函数
使用字符串的原型来完成
原型就是该对象的一个描述,该描述中如果添加了一个新功能,那么该对象也会添加一个功能,类似于java中在类中添加了一个成员方法,该类对象也就有了一个该方法, 用prototype就可以获得该原型,通过prototype就可以对对象的功能进行扩展。
给string的原型添加一个属性,那么所有的字符串也就具备了这一属性,这个属性可以是成员变量,可以是成员函数
1,加成员变量
String.prototype.abc = 123;//给String的原型添加一个名为abc的成员变量,值为123,那么所有的字符串都会具有一个abc变量,可以直接调用输出
2,加成员函数
String.prototype.trim = mytrim;//给String的原型添加一个名为trim的成员函数,两个函数名不一定非要相同,mytrim就是一个已经定义好的函数
或者使用匿名函数的方式
String.prototype.trim = function(){ //这样的话就没有形参列表了,这里用this来代替str 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); }
C,Array对象
var arr = ["abc","cba","nba","aaa","bbb"];
var arr1 = ["qqq","xiaomi",20];
var new Arr = arr.concat("mm",arr2);//在arr后面加上一个mm元素,arr2作为后续元素加上来
arr.join();//以指定分隔符来分隔数组,默认为逗号分隔
arr.pop();//移除最后一个元素,并返回剩下的数组
arr.push();//添加一个元素并返回新数组长度,如果添加的元素为一个数组,就会形成一个二维数组
arr.shift();//删除并返回第一个元素
arr.unshift();//指定数组插入到开始位置并返回该数组
arr.sort();//字符串怎么排序?字典顺序排序
arr.splice(1,3,12,43,67,"xixi","haha");//从1开始删,删三个,并把后面所有的都加进去
D,Date对象
var date = new Date();//也可以以毫秒值为参数 document.write(date.toLocaleString()+"<br>");//日期对象转成字符串 年月日时分秒 document.write(date.getFullYear()+"<br>");//年份 document.write(date.getMonth()+"<br>");//月份 document.write(date.getTime()+"<br>");//毫秒值 1495174393709
//字符串转成日期对象 var time; var str_date = "9/28/2017";//格式固定 time = Date.parse(str_date);//time为毫秒值 date1 = new Date(time); document.write(date1.toLocaleString()+"<br>");
E,Math对象
该对象中的方法都是静态的,直接调用即可
var num1 = Math.ceil(12.34);//向上取整 var num2 = Math.floor(12.34);//向下取整 var num3 = Math.round(12.34);//四舍五入 var num4 = Math.random();//随机数
F,Number对象
var num = new Number(6); document.write(num.toString(2));//6按照2进制输出
全局方法
这些方法的调用不需要对象,直接调用即可,全局方法都放在global对象中。
parseInt();//字符串转换成整形 var val = parseInt("123");//转成整形数 var val = parseInt("123abc");//转成 123 var val = parseInt("abc123");//报错 NaN错误 //其他进制转成十进制 var val = parseInt("110",2);//按照二进制转成10进制 6 var val = parseInt("0x3C",16);//按照十六进制转成10进制 //十进制转成其他进制需要用到Number对象的toString()方法
待续。。。。。