JS学习资料来源:W3school-JavaScript + Runoob-JavaScript
1. JS 概述 JavaScript,简称JS,一门客户端脚本语言。
作用: 可以用来增强用户和 html 页面的交过过程,可以控制 html 元素,让页面有一些动态的效果,增强用户体验。
发展: 1992,Nombase开发,用于表单校验,ScriptEase 1995,Netscape(网景)开发LiveScript,SUN公司更名JavaScript 1997,ECMA协会制定标准ECMAScript,统一了所有客户端脚本语言的编码方式
总结:JavaScript = ECMAScript + BOM + DOM(xml Dom + html Dom)
2. JS 输出
使用 window.alert()
弹出警告框。
使用 document.write()
方法将内容写到 HTML 文档中。
使用 innerHTML
获取/写入到 HTML 元素,innerText
获取/写入到标签内的文本。
使用 console.log()
写入到浏览器的控制台。 使用 console.log() 方法在浏览器中显示 JavaScript 值。 F12 启用调试模式, 在调试窗口中点击 “Console” 菜单,可看到其输出。
console.log()的用处 : 主要是方便你调式 javascript 用的, 你可以看到你在页面中输出的内容。 相比 alert 他的优点是:他能看到结构化的东西,如果是alert,弹出一个对象就是[object object],但是console能看到对象的内容。console不会打断你页面的操作
,如果用 alert 弹出来内容,那么页面就死了以及会导致alert后面的 js 代码不执行,但是console输出内容后你页面还可以正常操作。
3. JS 基础语法 3.1 js 使用 ① 内部 JS: 定义<script>
标签,标签内就是js代码 ② 外部 JS: 定义<script>
通过src属性引入外部的js文件
1 2 3 <script src="${pageContext.request.contextPath}/xxx.js" > </script>
a. <script>可以定义在页面的任何地方,位置会决定执行顺序
b. <script>可以定义多个
3.2 js 注释
3.3 js 类型
基本数据类型:number
:数字,整数/小数/NaN(一个不是数字的数字类型)string
:字符串,”hello” ‘abc’boolean
:true 和 falsenull
:一个对象为空的占位符undefined
:未定义,变量没有初始化时的初始值
引用数据类型:基本对象
:Array / Boolean / Date / Number / String / RegExp / Functions(全局函数对象) / Math / EventsFunction对象
:var 方法名 = new Function(“形式参数列表”, “方法体”); // 基本不用
3.4 js 变量 Java是强类型语言,JavaScript是弱类型脚本语言
。 语法:var 变量名 = 初始化值;
获取变量类型:
1 2 3 4 5 6 7 8 9 10 <script> console .log (typeof 123 ); console .log (typeof "abc" ); console .log (typeof true ); console .log (typeof null ); console .log (typeof NaN ); console .log (typeof num); console .log (typeof [1 ,2 ,3 ]); console .log (typeof {"name" :"Jerry" , "age" :20 }); </script>
3.5 js 运算符 1 2 3 4 5 6 7 一元 : ++ -- 算术 : + - * / % 赋值 : = += -= 比较 : > < >= <= == ===(类型和值) !==(类型和值) 逻辑 : && || ! 三元 : 表达式 ? 值1 : 值2 流程 : if-else switch-case while do-while for try-catch
● 注意事项
特殊判断条件:
number:0
或 NaN
为false,其他为 true string:null
或 空字符串""
为false,其他为 trueundefined
:为false 对象:所有对象都是 true
● 比较方式
类型相同:直接比较,字符串按照字典顺序比较;
类型不同:先进行类型转换,再比较; (=== 全等于,类型和值都比较,先判断类型,类型不同,直接返回false)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <script type="text/javascript" > function print (s ){ document .write (s + "<br>" ); } var num = 1 ; var str = '1' ; var num2 = 1 ; print ("num == num2 : " + (num == num2)); print ("num === num2 : " + (num === num2)); print ("num !== num2 : " + (num !== num2)); print ("num == str : " + (num == str)); print ("num != str : " + (num != str)); print ("num === str : " + (num === str)); print ("num !== str : " + (num !== str)); print ("null == undefined : " + (null == undefined )); print ("null === undefined : " + (null === undefined )); </script>
● switch分支
Java中 switch 可接收的数据类型:byte int short char 枚举(jdk1.5) String(jdk1.7)
;
JS中 switch 可接收的数据类型:任意JS中的基本数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <script> var num1 = 1 ; var num2 = num1++; console .log (num1); console .log (num2); console .log (10 / "2" ); var num3 = 10 ; var num4 = 20 ; num3 += num4; console .log (num3); console .log (10 != "10" ); console .log (10 == "10" ); console .log (10 === "10" ); console .log (!true ); console .log (!0 ); console .log (!NaN ); console .log (!"" ); console .log (!null ); console .log (!undefined ); console .log (10 < 20 ? "结果正确" : "结果不正确" ); switch (true ) { case true : console .log ("是true" ); break ; case false : console .log ("是false" ); break ; } for (var i = 0 ; i < 10 ; i++) { console .log ("i=" +i); } </script>
JS中 switch 后可以跟其他类型,如 字符串。
3.6 js 函数 函数三种写法 + JavaScript 闭包 + 回调 + 系统函数:
parseInt(str) 字符串转 number 类型整数
parseFloat(str) 字符串转 number 类型小数
isNaN(str) 判断是否”不是一个数字”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <script > function 方法名(形参列表) { 方法体; } var 方法名 = function (形参列表 ){ 方法体; } var 方法体 = new Function ("形参列表" ,"方法体" ); var add = (function ( ) { var count = 0 ; return function ( ) { return count += 1 ; } })(); console .log (result ()); console .log (result ()); console .log (result ()); function operation (a, b, callback ) { console .log ("计算两个值: " + a + ", " + b); callback (a, b); } function add (x, y ) { console .log ("求和:" + (x + y)); } function mul (x, y ) { console .log ("求积:" + (x * y)); } operation (10 , 20 , add); operation (10 , 20 , mul); alert ("hello, 这是个弹窗" ); var result = confirm ("确定删除吗?" ); console .log (result); var input = prompt ("请输入您的内容:" ); console .log (input); console .log ( parseInt (input) ); console .log ( parseFloat (input) ); console .log ( isNaN (input) ); </script >
在方法中,有一个内置对象 arguments
,包含所有的实际参数。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <script > function method01 (msg1, msg2, msg3 ) { for (var i = 0 ; i < arguments .length ; i++) { console .log (arguments [i]); } return "hello js function1" ; } var method02 = function (msg1, msg2, msg3 ) { for (var i = 0 ; i < arguments .length ; i++) { console .log (arguments [i]); } return "hello js function2" ; } </script >
JS 特殊处理不跳转的 a 标签:
1 2 3 4 5 <a href ="#" > 跳转</a > // 死链接,点击跳转时页面和链接不会发生变化<a href ="javascript:void(0)" > 跳转</a > // 死链接,void中内容会执行但不会有任何返回<a href ="javascript:void(alert('Warning'))" > 跳转</a >
3.7 js 字符串转数字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <script type="text/javascript" > var a = "20" ; document .write ("结果:" + a + "<br/>" ); var a = "123abc123" ; var b = parseInt (a); document .write ("结果:" + b + "<br/>" ); var c = "3.14" ; c = parseFloat (c); document .write ("结果:" + c + "<br/>" ); document .write (isNaN (123 ) + "<br/>" ); document .write (isNaN ("abc123" )); </script>
4. JS 引用类型 - 对象 4.1 String 字符串对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <script type="text/javascript" > document .write ("第五章" .anchor ("five" ) + "<br/>" ); document .write ("abc" .charAt (1 ) + "<br/>" ); document .write ("第六章" .fontcolor ("red" ) + "<br/>" ); document .write ("abchellohehehello" .indexOf ("hello" ) + "<br/>" ); document .write ("第五章" .italics () + "<br/>" ); document .write ("百度" .link ("http://www.baidu.com" ) + "<br/>" ); document .write ("明天讲html" .replace ("html" , "DOM编程" ) + "<br/>" ); document .write ("abcdefg" .substr (1 , 3 )); document .write ("abcdefg" .substring (1 , 3 )); var str = "我们-大家-好" ; var arr = str.split ("-" ); for (var index = 0 ; index < arr.length ; index++) { document .write (arr[index] + "," ); } document .write ("<br/>" ); document .write ("abc" .toUpperCase () + "<br/>" ); document .write ("ABC" .toLowerCase () + "<br/>" ); </script>
1 2 3 document .write ("helloworld" .replace (/o/g , "O" ));document .write ("helloABChello" .replace (/hello/g , "o" ));
4.2 Array 数组对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <script> var arr = new Array ("a" , "b" , "c" ); console .log (arr); arr = [1 , 2 , 3 , 4 , 5 ]; console .log (arr); console .log (arr.length ); var str = arr.join ("" ); console .log (str); var lastElem = arr.pop (); console .log (lastElem); console .log (arr); var length = arr.push ("aa" , "bb" ); console .log (length); console .log (arr); function print (s ) { document .write (s + "<br>" ); } var arr = new Array (1 , 3 , 5 , 7 , 9 ); print (arr); arr[20 ] = 20 ; print (arr); print (arr.length ); var arrs = [10 , 30 , 50 , 70 , 90 ]; print (arrs.pop () + " arrs:" + arrs); print (arrs.push (110 ) + " arrs:" + arrs); print (arrs.reverse () + " arrs:" + arrs); print (arrs.shift () + " arrs:" + arrs); </script>
4.3 Date 日期对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <script> var date = new Date (); console .log (date.toLocaleString ()); console .log (new Date ().toLocaleDateString ()); var year = date.getFullYear (); var month = date.getMonth ()+1 ; var day = date.getDate (); var hour = date.getHours (); var minute = date.getMinutes (); var second = date.getSeconds (); var timeStr = year+"/" +month+"/" +day+" " +hour+":" +minute+':' +second; console .log (timeStr); timeStr = [year, month, day].join ("/" )+" " +[hour,minute,second].join (":" ); console .log (timeStr); console .log (date.getTime ()); </script><span id ="showTime" style ="font-weight: bold;" > </span > <script type ="text/javascript" > function zero (s ) { return s < 10 ? '0' + s : s; } function getTime ( ) { var date = new Date (); var span = document .getElementById ("showTime" ); var fullTime = date.getFullYear () +"-" + (date.getMonth ()+1 ) +"-" + date.getDate () + " " + date.getHours () +":" + zero (date.getMinutes ()) +":" + zero (date.getSeconds ()); span.innerText = fullTime; } getTime (); window .setInterval ("getTime()" , 1000 ); </script >
4.4 RegExp 正则对象
方法
描述
FF
IE
compile
编译正则表达式。
1
4
exec
检索字符串中指定的值。返回找到的值,并确定其位置。
1
4
test
检索字符串中指定的值。返回 true 或 false。
1
4
1 2 3 4 5 6 <script> var reg1 = /^[a]{3}$/ ; console .log (reg1.test ("1aaa" )); </script>
JS中正则表达式格式:/^正则表达式$/
4.5 Math 对象
Math.ceil(num) 向上取整
Math.floor(num) 向下取整
Math.round(num) 四舍五入
Math.random() 随机0~1之间的小数
1 2 3 4 5 6 7 8 9 10 <script type="text/javascript" > function print (s ) { document .write (s + "<br>" ); } print (Math .ceil (3.14 )); print (Math .floor (3.14 )); print (Math .round (3.14 )); print (Math .random ()); </script>
4.6 自定义对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <script type="text/javascript" > function print (s ) { document .write (s + "<br>" ); } function p1 ( ) {} var p1 = new p1 (); p1.id = 20 ; p1.name = "小姜" ; print (p1 + " " + p1.id + " " + p1.name ); function p2 (id, name ) { this .id = id; this .name = name; this .sayHello = function ( ) { print (id + " " + name + ":hello!" ); } } var p2 = new p2 (20 , "小姜" ); p2.sayHello (); var p3 = new Object (); p3.id = 20 ; p3.name = "小姜" ; p3.sayHello = function ( ) { print (p3.id + " " + p3.name + ":hey!!!" ); } p3.sayHello (); var p4 = { id : 20 , name : "小姜" , sayHi : function ( ) { print (this .id + " " + this .name + ": hi~~" ); } } p4.sayHi (); </script>
4.7 Functions 全局函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script> var num1 = 10 ; var num2 = "20" ; console .log (num1 + parseInt (num2)); var num3 = NaN ; console .log (num3 == NaN ); console .log (num3 === NaN ); console .log (isNaN (num3)); var jsonStr = '{"username":"root", "password":"1234"}' ; var obj = eval ("(" + jsonStr + ")" ); console .log (obj.username + "," + obj.password ); </script>
5. JS 事件 JavaScript 允许在事件被侦测到时执行代码。 事件源:html标签 监听器:js方法 绑定/注册:标签中的属性赋值 事件:具体的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <%--事件源 + 绑定方式①--%> // 监听器 function fn1() { console.log("按钮1点击了..."); } ...<button onclick ="fn1()" > 事件按钮1</button > <%--事件源 + 绑定方式②--%> // 获取 id 为 btn 的标签对象 var ele = document.getElementById("btn"); // fn2 使用方式 ① -- 最佳 ele.onclick = function () { console.log("按钮2点击了..."); } ...<button id ="btn" > 事件按钮2</button >
详细事件表:https://www.w3school.com.cn/jsref/dom_obj_event.asp
JS 事件示例:
1 2 3 4 5 <script > function fn1 ( ) { console .log (event.keyCode + " 键盘按下 " ); } function fn2 ( ) { console .log (event.keyCode + " 键盘松开 " ); } </script > <input type ="text" onkeydown ="fn1()" onkeyup ="fn2()" >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script > function fn1 ( ) { console .log ("表单提交了..." ); if (条件) { return true ; } else { return false ; } } </script > <%-- return fn1() --%><form action ="index.jsp" onsubmit ="return fn1()" > 消息:<input type ="text" name ="message" > <br > <button type ="submit" > 发送</button > </form >