二、js中基础知识
该篇文章主要是强化一下自己javaScript的基础,让写代码变得更轻松些。基础好的请忽略。
JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,
为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
1、在HTML中嵌入js代码的两种方式:
1)插入在标签内部,写在事件句柄后面 <input type="button" value="亲,点击我" onclick="window.alert('hello world!')window.alert('hello')> 2)在独立的脚本块,其中可以编写js代码 <script type="text/javascript"> window.alert("hello world"); </script> 备注:<script>标签不一定出现在head标签中,可以出现在HTML页面中的任何位置
2、语法规范和书写规范
2.1、javaScript语法规范说明: 1)区分大小写; 2)其中的变量是弱类型; 3)每行结尾的分号可有可无,如果没有浏览器会自动加上 4){} 括号用于代码块 5) 注释方式和java和c语言相同 2.2、变量的书写规范: 1)首字符必须是字母(大小写均可)、下划线、美元符号 2)其余字母可以使下划线、美元符号、任意字母或者数字字符 3)变量名不能是关键字或者保留字 a、变量声明:var 变量名; 变量在声明的时候,没有使用var关键字,那么这个变量不管是定义在哪个位置上,都是全局变量 b、变量赋值:变量名=值; js中的变量若没有显示的赋值,系统默认赋值underfined; underfined在js中是一个具体的值,表示未定义 c、一行上可以定义多个变量 var a,b,c=300;//变量a和变量b都是underfined,变量c是300 备注: JavaScript也遵守就近原则,全局变量作用域是整个js程序,局部变量只作用于某个函数; 变量没有定义,直接访问会报错。[结果不是underfined]; 变量定义之后没有赋值,系统默认赋值underfined;
3、函数语法格式:
第一种方式: function 函数名(形式参数列表){ 函数体由JavaScript语句构成; } 示例: function testFun(){ //JS的函数执行结果之后的返回值类型是任意的,而且也可以不返回任何数据 //return 100; //return false; //return "abc"; } 第二种方式: 函数名 = function(形式参数列表){ 函数体; } 备注: js中的函数没有重载机制,在统一个js代码中,函数名不能重名; 函数必须手动调用的时候才会执行;
4、js中的数据类型(5种):
4.1、String类型(字符串类型):包括具体的值:'a' 'bsdfasdfasef'
js中没有字符类型,只有字符串类型(字符串这种数据类型的数据又可以称为”字符串对象“,虽然被称为字符串对象,但是字符串对象不属于Object类型) String的属性 1)length属性: 字符串的名字.legth: 获取字符串长度 2)prototype属性:可以动态给String类型的数据扩展方法和属性 示例1:给所有String(字符串动态的扩展一个方法叫做doSome) var ename="abdcdf"; alert(ename.length);//获取字符串长度 //以下是给所有String(字符串动态的扩展一个方法叫做doSome) String.prototype.doSome=function(){ alert("dosome....."); }; //调用doSome方法 ename.doSome(); 3)String对象中的方法: toLocaleLowerCase() 把字符串转换为小写。 toLocaleUpperCase() 把字符串转换为大写。 substr() 从起始索引号提取字符串中指定数目的字符。 substring() 提取字符串中两个指定的索引号之间的字符。注意不包括结束下标 replace() 替换与正则表达式匹配的子串。 示例1: ename=ename.toUpperCase(); alert(ename); 示例2:以下替换的时候,只替换第一个”-“,如果想要全部替换的话,的多次使用replace。想要全部替换也可以,但是需要使用正则表达式 alert("1978-10-10".replace("-",",").replace("-",","));
4.2、Number类型:
Number数据类型的取值:包括具体的值:13、1.0、NaN,Infinity 1)1,3.0,123 2)NaN NaN表示Not a Number,不是一个数字,但是NaN本身是一种Number数据类型,计算结果应该返回数字,但是最终结果不是数字的时候, 结果就是NaN 3)Infinity infinity汉语意思是无穷无限大;除数是0的时候,结果一定是Infinity
4.3)Boolean 包括具体的值:ture false,
//boolean类型 var boo=true; //表示的是字符串true var boo="true"; var a=true; var b=true; alert(a==b);//true a="abc"; b="daf"; alert(a==b);//false a=true; b=1; alert(a==b);//true 1和true是等量关系 alert(a === b);//false 1和ture虽然是等量关系,但是数据类型不同 a=true; b=true; alert(a === b);//true
4.4)Object 包括具体的值:new Object(),new Date(), new Employee(),null.....
js也是面向对象的编程语言;js中自定义的函数,函数名本身就是类名; js中定义类的2种方法: 1)方法一: function User(id,name){ //属性 //id,name都是user类的属性 this.id=id; this.name=name; //方法 this.shopping=function(){ alert(this.name+"is shopping"); }; } //创建对象,类似java var user=new User(); user.shopping(); user=new User(110,"zhangsan"); user.shopping(); 2)js中定义类的第二种方法: Employee=function(id,name){ this.id=id; this.name=name; } var e=new Employee(111,"lisi"); alert(e.id+","+e.name); //给Employee动态扩展一个方法: Employee.prototype.work=function(){ alert(this.name+"is working!"); }; //调用扩展的方法 e.work();
4.5)Undefined 包括具体的值:underfined
Undefined数据类型只有一个值,这个值就是underfined;只声明没有给变量赋值或者手动赋值undefined,变量的值都是undefined;
5、运算符
5.1、typeof运算符:typeof运算符在程序运行阶段动态判断变量的数据类型
1)如何使用:typeof 变量名 2)typeof 运算符运算结果是以下六种结果之一: "undefined" "number" "string" "objcet" "boolean" "function" 备注:typeof运算结果是字符串类型 示例: function sum(a,b){ if((typeof a)!="number" || (typeof b)!="number"){ alert("参数必须提供数字类型"); return; } //执行到此处说明参数类型正常 return a+b; } typeof(1): number typeof(NaN): number typeof(Number.MIN_VALUE): number typeof(Infinity): number typeof("123"): string typeof(true): boolean typeof(window): object typeof(document): object typeof(null): object typeof(eval): function typeof(Date): function typeof(sss): undefined typeof(undefined): undefined 详述: a、常规数字和特殊的数字的 typeof 返回值为number javaScript中特殊的数字类型包括: Infinity 表示无穷大特殊值 NaN 特殊的非数字值 Number.MAX_VALUE 可表示的最大数字 Number.MIN_VALUE 可表示的最小数字(与零最接近) Number.NaN 特殊的非数字值 Number.POSITIVE_INFINITY 表示正无穷大的特殊值 Number.NEGATIVE_INFINITY 表 示负无穷大的特殊值 b、 对于字符串类型,typeof 返回的值是 string。比如typeof("123")返回的值是string。 对于布尔类型,typeof 返回的值是 boolean 。比如typeof(true)返回的值是boolean。 对于对象、数组、null 返回的值是 object 。比如typeof(window),typeof(document),typeof(null)返回的值都是object。 对于函数类型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。 如果运算数是没有定义的(比如说不存在的变量、函数或者undefined),将返回undefined。比如:typeof(sss)、typeof(undefined)都返回undefined。
5.2、JS中的= == ===的区别
= 赋值: == 比较值是否相当 === 比较值是否相同,同时要求数据类型也相同(更加严格) underfined,null,NaN各自的数据类型不同: alert(typeof underfined);//"underfined" alert(typeof null);//"object" alert(typeof NaN);//"number" underfined 和null属于:值相等 alert(underfined==null);//true alert(null==NaN);//false alert(underfined==NaN);//false
5.3void运算符
void 运算符对任何值返回 undefined。该运算符通常用于避免输出不应该输出的值。 例如,从 HTML 的 <a> 元素调用 JavaScript 函数时。要正确做到这一点,函数不能返回有效值,否则浏览器将清空页面,只显示函数的结果 示例: <a href="javascript:void(0);" onclick="alert('execute js code!')"> 只执行一段js代码,不进行页面跳转,还想保留超链接的样式,需要使用void运算符 </a>
6、常见函数、单引号和双引号的使用、流程控制
6.1、常见函数
1)isNaN():该函数的作用是用来判断数据是否是一个数字,不是数字是true,是数字是false
window.onload = function() { var iNumber=Number(prompt("输入一个5到100之间的数字","")); if(isNaN(iNumber)){ document.write("请确认您的输入正确"); }else if (iNumber>100||iNumber<5) { document.write("您的输入的数字不在5和100之间"); }else { document.write("您的输入的数字是"+iNumber); } }
2)parseInt():该函数将非数字转换成数字,不保留小数位
var price="100"; price=parseInt(price);//将字符串price转换成Number类型的数字 alert(price+1);//101 price="3.25"; price=parseInt(price); alert(price+1);//4 自动进行了四舍五入;
3)parseFloat():该函数可以将非数组转化为数字,但是保留小数
price="3.95"; price=parseFloat(price); alert(price);//3.95
6.2、单引号和双引号的使用
1)只使用字符的字符串,单引号和双引号没有区别 2)在单引号包括的字符串中可以直接用双引号,在双引号包括的字符串中可以直接用单引号 <input type="button" onclick="alert("1")">-------------------不正确 <input type="button" onclick="alert('1')">-------------------正确 3)如果在双引号包括的字符串中用双引号,需要用反斜杠转义,注意是"\" ;同样在单引号包括的字符串中用单引号,也需要转义“\” var str = "abc\"def\"ghi" 用反斜杠来禁止解析双引号 4)如果要用反斜杠,则输入‘\\’
6.3、流程控制
1)if else
window.onload = function() { var iNumber=Number(prompt("输入一个5到100之间的数字","")); if(isNaN(iNumber)){ document.write("请确认您的输入正确"); }else if (iNumber>100||iNumber<5) { document.write("您的输入的数字不在5和100之间"); }else { document.write("您的输入的数字是"+iNumber); } }
2)while
var i=isum=0; while(i<=100){ isum +=i; i++; } alert("isum-->"+isum);
7、数组的使用:初始化、赋值、遍历、数组中常用方法
1)静态初始化 var myArray=[1,2,3,44]; 2)动态初始化 var myArray=new Array(5);//动态分配5个控件,没有手动赋值,系统默认赋值underfined 遍历: for(var i=0;i<myArray.length;i++){ alert("elt:"+myArray[i]);//undefined } 赋值:[js数组中的数据类型不一定统一] myArray[0]=false; myArray[1]="abc"; myArray[2]=1.0; myArray[3]=new Object(); 3)遍历 for(var i=0;i<myArray.length;i++){ alert("elment:"+myArray[i]); } 4)数组中常用方法 a、join():以特殊符号链接数组中的每一个元素,最后生成一个字符串 var a=[1,'abc',false,3.0]; var str=a.join("-"); b、reverse():反转数组中的元素 a.reverse(); c、pop():其取值为:数组最后边的元素, 且执行后数组最右边的元素会被删除 d、push():添加元素 e、toString():取值为:数组的每个元素,且各个元素用, 隔开
8、JS对日期的处理
//获取系统当前日期 var nowTime=new Date(); alert("系统当前日期-->"+nowTime); //将系统时间转换成具有本地语言环境的时间 var strNowTime=nowTime.toLocaleString(); alert("本地语言环境的时间-->"+strNowTime); //可以获取日期的年月日时分秒,自己添加格式: var year=nowTime.getYear(); alert("year-->"+year); //避免千年虫问题 year=nowTime.getFullYear();//这个方法更通用 alert("FullYear-->"+year); //获取毫秒:getTime() 返回从 1970 年 1 月 1 日至今的毫秒数。 var time=nowTime.getTime(); alert(time);
9、js中的事件
9.1、onload事件
页面加载的时候就自动显示出当前系统的时间,并且每隔一秒钟刷新一下页面
<script type="text/javascript"> //onload事件句柄需要编写到body标签中 function displayTime(){ //1.获取div元素 var timeDiv=document.getElementById("timeDiv"); //2.获取系统时间 var nowTime=new Date(); var strNowTime=nowTime.toLocaleString(); //3.将系统时间设置到div元素中 //innerHTML属性用来 设置或返回行的开始标签和结束标签之间的 HTML timeDiv.innerHTML=strNowTime; } //4.每隔1秒调用displayTime函数 function start(){ //设置每隔特定时间执行特定函数 window.setInterval("displayTime()",1000); } </script>
9.2、onclick事件(涉及div和span、innerHTML和innerText区别)
<html> <head> <title>使用js的DOM操作div和span元素</title> <script type="text/javascript"> /* 1、innerHTML 用法一:将后面的字符串当做HTML代码解释并且执行 divElt.innerHTML="<font color='red'>hello World</font>"; 效果为将hello World字体颜色置为红色显示出来 用法二:显示标记之间得所有内容,包括代码本身 alert(divElt.innerHTML);效果为 <font color='red'>hello World</font> 2、innerText:即使后面指定的字符串是HTML代码,也只是当做普通字符串来处理 divElt.innerText="<font color='red'>测试</font>";效果为:<font color='red'>测试</font> 3、div会独占一行,span被用来组合行内元素 */ function setDiv(){ //获取div元素 var divElt=document.getElementById("myDiv"); //可以通过innerHTML属性设置元素中的HTML代码,也可以获取该元素中的HTML代码 //divElt.innerHTML="<font color='red'>hello World</font>"; divElt.innerText="<font color='red'>测试</font>"; //获取div元素中的HTML代码 alert(divElt.innerHTML);//当为:<div id="myDiv"></div> 结果为: <font color='red'>hello World</font> } </script> </head> <body id="body1"> <input type="button" value="设置div中的文本" onclick="setDiv();" /> <!-- <div id="myDiv"></div> --> <span id="myDiv"></span> </body> </html>
9.3、失去焦点事件onblur(涉及正则表达式简单应用)
<html> <head> <title>正则表达式</title> <script type="text/javascript"> /* 1、正则表达式是一门独立的学科,和任何编程语言无关, 最初使用在医学方面,表示神经传输符号,在现代计算甲编程中也可以使用大量的正则表达式 2、在编程中使用正则表达式最主要是用来做字符串模式匹配的。尤其在JavaScript中使用正则表达式居多 3、在正则表达式中规定了一些特殊的符号,每一个符号都具有特殊的含义 4、在实际开发中我们可以从网络中搜索相关的常用的正则表达式,直接使用 但是使用前,需要进行反复的测试;javaScript程序员更应该研究在js中如何使用正则表达式而不是研究正则表达式该如何写 5、常见的正则表达式符号: ^ 字符串的开始 & 字符串的结束 \s 空白 + 出现1-N次 * 出现0-N次 {2,5} 出现[2-5]次 ? 出现至少1次 [0-9] 0-9的数字任意出现一个 [0-9a-zA-Z]{3,} 0-9a-zA-Z 之前的字符至少出现3次 6、在js中怎么创建正则表达式对象?正则表达式对象中那个方法最常用? 创建正则表达式对象有两种方式: 第一种方式:【常用】 var regexp=/正则表达式/flag; 第二种方式: var regexp=new RegExp("正则表达式","flag"); 注:flag可选值:i、g、m i:忽略大小写 g:当前行所有数据 m:支持多行搜索 i,g,m 可以合并使用 正则表达式对象中有一个很重要的方法:叫做test 语法格式: var regexp=/正则表达式/; var retValue=regexp.test(字符串); retValue的值可能是true;true表示正则表达式符合正则表达式 retValue的值也可能是false;false表示正则表达式不符合正则表达式 */ function checkEmail(email){ //这个也是重点: var reg = new RegExp("^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$"); //正则表达式对邮箱地址格式验证 alert(email); var ok=reg.test(email);//正则表达式有一个test()方法 var emailError=document.getElementById("emailError"); if(ok){ emailError.innerHTML=""; }else{ emailError.innerHTML="<font color='red'>邮箱地址格式错误</font>"; } } </script> </head> <body> 邮箱地址<input type="text" name="email" onblur="checkEmail(this.value);" /> <span id="emailError"></span> </body> </html>
9.4、获取焦点事件onfocus(登录表单验证)
<!DOCTYPE html> <html> <head> <title>表单验证.html</title> </head> <body> <script type="text/javascript"> /* 验证功能描述: 1、用户名不能为空 2、用户名长度6-14 3、密码不能为空 4、密码至少6位 5、密码和确认密码必须一致 */ String.prototype.trim=function(){ return this.replace(/^\s+/,"").replace(/\s+&/,""); }; function checkName(username){ var ok=false; username=username.trim();//去除前后的空白 var nameError=document.getElementById("nameError"); if(username==""){ nameError.innerHTML="<font color='red'>用户名不能为空</font>"; ok=false; }else if(username.length<6 || username.length>14){ nameError.innerHTML="<font color='red'>用户名长度必须6-14</font>"; ok=false; }else{ nameError.innerHTML=""; ok=true; } return ok; } function clearNameError(){ var nameError=document.getElementById("nameError"); nameError.innerHTML=""; } function checkUserpswd(){ var ok=false; var pswdError=document.getElementById("pswdError"); if(pswd==""){ pswdError.innerHTML="<font color='red'>密码不能为空</font>"; ok=false; }else if(pswd.length<6){ pswdError.innerHTML="<font color='red'>密码不能少于6位</font>" ok=false; }else{ pswdError.innerHTML=""; ok=true; } return ok; } function clearPswdError(){ var pswdError =document.getElementById("pswdError"); pswdError.innerHTML=""; } function isSame(){ var ok=false; //获取密码 var userpswd=document.getElementById("userpswd").value; //获取确认密码 var confirmpswd=document.getElementById("confirmpswd").value; //比较 var confirmPswdError=document.getElementById("confirmPswdError"); if(userpswd != confirmpswd){ confirmPswdError.innerHTML("<font color='red'>密码和确认密码不一致"</font>); ok=false; }else{ pswdError.innerHTML=""; ok=true; } return ok; } function clearSameError(){ var confirmPswdError=document.getElementById("confirmPswdError"); pswdError.innerHTML=""; } function checkAll(){ var username=document.getElementById("username").value; var userpswd=document.getElementById("userpswd").value if(checkName(username) && checkUserpswd(userpswd) && isSame()){ document.forms["userForm"].action="http://localhost:8080/oa/register"; document.forms["userForm"].method="get"; document.forms["userForm"].submit(); } } </script> <form name="userForm"> 用户名 <input type="text" id="username" name="username" onblur="checkName(this.value);" onfocus="clearNameError();" /> <span id="nameError"></span> <br> 密码 <input type="password" id="userpswd" name="userpswd" onblur="checkUserpswd(this.value);" onfocus="clearPswdError();"/> <br> <span id="pswdError"></span> 确认密码 <input type="password" id="confirmpswd" name="confirmpswd" onblur="isSame();" onfocus="clearSameError()"/> <span id="confirmPswdError"></span> <br> <input type="button" value="注册" onclick="checkAll()"> </form> </body> </html>
9.5、表单提交事件onsubmit
<html> <head> <title>表单验证</title> <!-- 1、表单验证的时候,尽量不要在点击注册按钮的时候才验证,最好用户填写一个 验证一个,这样设计比较人性化。 2、表单提交事件:submit,事件句柄:onsubmit,这个事件句柄需要编写到form标签中 <form onsubmit="return true;">提交表单 <form onsubmit="return true;">不提交表单 --> </head> <body> <script type="text/javascript"> var usernameOk=false; function checkUsername(username){ //alert(username); //验证用户名不能为空 //if(username.length==0){} var usernameErrorMsg=document.getElementById("usernameErrorMsg"); } function checkUserName(username){ var usernameErrorMsg=document.getElementById("usernameErrorMsg"); if(username=="usernameErrorMsg"){ usernameErrorMsg.innerHTML="<font color='red'>用户名不能为空</font>"; }else if(username.lenght<6 || username.length>14){ usernameErrorMsg.innerHTML="<font color='red'>用户名长度必须在[6-14]之间</font>"; }esle{ usernameErrorMsg.innerHTML=""; usernameOk=ture; } } function cleckNameError(){ var usernameErrorMsg=document.getElementById("usernameErrorMsg"); usernameErrorMsg.innerHTML=""; } function checkAll(){ return false; } </script> <form name="username" method="get" action="http://localhost:8080" onsubmit="return checkAll();"> 用户名 <input type="text" name="username" onblur="checkUserName(this.value);" onfocus="cleckNameError();"/> <!-- 其中的this代表文本框对象, --> <span id="usernameErrorMsg"></span><br> <input type="submit" value="注册" /> </form> </body> </html>
10、js中的DOM对象和BOM对象
10.1、DOM对象:创建元素,并追加元素
<html> <head> <title>js中通过DOM创建元素,并追加元素</title> <script type="text/javascript"> function addElt(){ //alert("test"); //向div节点中追加一个子节点font //1、获取div节点 var myDiv=document.getElementById("myDiv"); //2、创建font节点 var fontElt=document.createElement("font");//重点方法 fontElt.innerHTML="测试"; fontElt.color="red"; //3、将font节点追加到div节点中 myDiv.appendChild(fontElt);//重点方法 } </script> </head> <body> <input type="button" value="给div添加font标签" onclick="addElt();" /> <div id="myDiv"> </div> </body> </html>
document.location.href="http://www.baidu.com";
document.location="http://www.baidu.com";
10.2、BOM对象:window是BOM对象(Browser Object Model),代表整个浏览器窗口
BOM对象:window是BOM对象(Browser Object Model),代表整个浏览器窗口
window对象中的函数:eval()、open()、setInterval()、window.alert()、window.confirm()、window.open()
window.location.href="http://www.baidu.com"
window.location="http://www.baidu.com"
1)eval函数
<!DOCTYPE html> <html> <head> <title>eval函数</title> <script type="text/javascript"> //eval函数的作用:将普通字符串当做js代码解释执行 window.eval("var i=100;") //以上的程序等同于 var i=100; alert(i); /* 重点: java程序连接数据库之后,查询数据然后拼接成一个json格式的字符串发送给浏览器,浏览器只是接受到一个普通的json格式的字符串,然后在js中 使用eval函数,将json格式的字符串转换成json对象 */ var javaSendStr="var o={\"usercode\":110,\"username\":\"zhangsan\"};"; window.eval(javaSendStr); alert(o.usercode+","+o.username); </script> </head> <body> </body> </html>
API地址: https://www.w3cschool.cn/javascript/js-window.html