企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# JavaScript JavaScript 是 web 开发者必学的三种语言之一: - *HTML* 定义网页的内容 - *CSS* 规定网页的布局 - *JavaScript* 对网页行为进行编程 ## 什么是JavaScript? ​ JavaScript:一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在[HTML](https://baike.baidu.com/item/HTML)(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。 ​ JavaScript的组成: - 核心(*ECMAScript*) - 文档对象模型(*DOM*) - 浏览器对象模型(*BOM*) ​ JavaScript的特点: - 脚本语言 - 基于对象 - 简单 - 动态性 - 跨平台性 JavaScript的引入方式: 在HTML文件中引入JS有两种方式:第一种:内嵌式.将JS代码直接嵌入HTML页面中。则该JS代码只对本页面有效。 使用方法:在HTML页面中使用<script></script>标签引入。如下: ```javascript <script> </script> ``` ​ 第二种:外联式。独立称为一个以.js为后缀的文件,并在HTML页面中引入. ```javascript <script src="../js/文件名.js" type"text/javascript" charset="utf-8"></script> ``` ## JS基本语法 ### 1 定义变量 #### 1)变量命名 ​ 与代数一样,JavaScript 变量可用于存放值(比如 x=2)和表达式(比如 z=x+y)。变量可以使用短名称(比如 x 和 y),也可以使用描述性更好的名称(比如 age, sum, totalvolume)。 - 变量必须以字母开头 - 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做) - 变量名称对大小写敏感(y 和 Y 是不同的变量) 提示:JavaScript 语句和 JavaScript 变量都对大小写敏感。 #### 2)变量的声明 var 变量名;//JS变量可以不声明,直接使用。默认值:undefined #### 3)变量的取值 var 变量名 =值;//JS变量是弱类型,即同一个变量可以洗存放不同类型数据。 ```javascript var num = 'string';//单引号与双引号都可以表示字符串 ``` ### 2 数据类型 #### 六种数据类型 - ***undefined***:Undefined类型只有一个值,即undefined.l  当声明的变量未初始化时,该变量的默认值是 undefined。 - ***Null类型*** :另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。 - ***Boolean类型*** :它有两个值 true 和 false (即两个 Boolean 字面量)。 - ***Number类型*** :任何数字都是number类型。 - ***String类型*** :字符或字符串。 - ***Object类型*** :对象类型, ``` String字符串: --在js中字符串需要使用引号引起来 --使用双引号或单引号都可以,但不能混着用 --引号不能嵌套,双引号不能放双引号,单引号不能放单引号,但两者可以相互嵌套 ``` ### 3 运算符 #### 1)算数运算符 | 运算符 | 描述 | | ------ | ------ | | + | 加 | | - | 减 | | * | 乘 | | / | 除 | | % | 求余数 | | ++ | 累加 | | -- | 递减 | #### 2)赋值运算符 | 运算符 | 描述 | | ------ | -------------- | | = | 赋值 | | += | 先加再赋值 | | -= | 先减再赋值 | | *= | 先乘再赋值 | | %= | 先求余数再赋值 | | /= | 先除再赋值 | #### 3)比较运算符 | 运算符 | 描述 | | ------ | ------------------------------- | | == | 判断是否等于 | | === | 不进行数据类型转换,判断是否相等 | | != | 判断不等于 | | > | 大于 | | < | 小于 | | >= | 大于等于 | | <= | 小于等于 | #### 4)逻辑运算符 | 运算符 | 描述 | | ------ | :---------------------------------------------: | | && | 逻辑与。两个表达式均为true则结果为true | | \|\| | 逻辑或。两个表达式只要有一个为true,则结果为true | | ! | 取反。 | ### 4 基本操作 #### 1) 获取页面元素 javascript主要是通过三种方法获取: ```javascript var id=document.getElementById("id") //根据元素ID值获取 var name=document.getElementsByName("name") //根据元素NAME属性值获取,得到一个数组,需遍历 var tarname=document.getElementsByTarName("tarname") //根据元素名获取,得到一个数组,需遍历 ``` #### 2) 输出操作 JavaScript 能够以不同方式“显示”数据: - 使用 window.alert() 弹出警告框 - 使用 document.write() 向页面中写内容 - 使用 innerHTML 输出HTML 元素 - 使用 console.log() 写入浏览器控制台 ```html <!DOCTYPE html> <html> <body> <h1>我的第一张网页</h1> <p>我的第一个段落</p> <p id="demo"></p> <script> document.getElementById("demo").innerHTML = 5 + 6; document.write(5 + 6); alert("你好!"); console.log("20")//日志会写入浏览器控制台,不会显示在页面上 </script> </body> </html> ``` ### 5 类型转换 #### 1) 其他类型转换为Number ```javascript /* * 将其他的数据类型转换为Number * 转换方式一: * 使用Number()函数 * - 字符串 --> 数字 * 1.如果是纯数字的字符串,则直接将其转换为数字 * 2.如果字符串中有非数字的内容,则转换为NaN * 3.如果字符串是一个空串或者是一个全是空格的字符串,则转换为0 * - 布尔 --> 数字 * true 转成 1 * false 转成 0 * * - null --> 数字 0 * * - undefined --> 数字 NaN * * 转换方式二: * - 这种方式专门用来对付字符串 * - parseInt() 把一个字符串转换为一个整数 * - parseFloat() 把一个字符串转换为一个浮点数 */ var a = "123"; //调用Number()函数来将a转换为Number类型 a = Number(a); a = '1358'; a=parseInt(a); /* * parseFloat()作用和parseInt()类似,不同的是它可以获得有效的小数 */ a = "123.456"; a = parseFloat(a); /* * 如果对非String使用parseInt()或parseFloat() * 它会先将其转换为String然后在操作 */ ``` #### 2) 强制转换 ```javascript /* * 强制类型转换 * - 指将一个数据类型强制转换为其他的数据类型 * - 类型转换主要指,将其他的数据类型,转换为 * String Number Boolean * */ a = undefined; a = String(a); // "undefined" 强制转换 ``` ### 6 进制 ```javascript <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //2 8 16 10 //0b 开头 0B 表示二进制 。 //0 开头 表示 8进制 //0x 开头 0X 表示16进制 var a = 12; var b = 070; //alert(b); 56 var date1 = new Date(); //alert(Boolean(date1)); //当一个字符串 做 - * / 运算的时候 也会自动转换成 number 类型 。 var str = "123"; result = str/1; //alert( typeof result) //alert(result) var result = 1 + +"2" +3 ; alert(result) //++ -- </script> </head> <body> </body> </html> ``` ### 7 超链接 超链接作用:1、跳转页面 2、找到锚点 3、发送邮件,打电话 4、触发JavaScript... ```javascript <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/test.js" type="text/javascript" charset="utf-8"> </script> <script type="text/javascript"> function cn(){ alert("内部的JS") } //超链接 1.跳转页面 2.找到锚点 3.发送邮件,打电话 4.触发javaScript... </script> </head> <body> <p id='#'>首部</p> <button onclick="alert('你点我了。!')">点我</button> <a href="javascript:on()">点我</a>// 触发js <a href="javascript:alert('点我了 。。走你')">点我</a> <a href="http://www.baidu.com">百度</a>// 跳转页面 <a href='#'>haha</a> //找到锚点 </body> </html> ``` ### 8 标识符 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> /* * 标识符 * - 在JS中所有的可以由我们自主命名的都可以称为是标识符 * - 例如:变量名、函数名、属性名都属于标识符 * - 命名一个标识符时需要遵守如下的规则: * 1.标识符中可以含有字母、数字、_、$ * 2.标识符不能以数字开头 * 3.标识符不能是ES中的关键字或保留字 * 4.标识符一般都采用驼峰命名法 * - 首字母小写,每个单词的开头字母大写,其余字母小写 * helloWorld xxxYyyZzz * * - JS底层保存标识符时实际上是采用的Unicode编码, * 所以理论上讲,所有的utf-8中含有的内容都可以作为标识符 */ /*var if = 123; var 小明 = 123; console.log(if);*/ </script> </head> <body> </body> </html> ``` ### 9 区分大小写 ```javascript /* var variable var a var A * 1.JS中严格区分大小写 * 2.JS中每一条语句以分号(;)结尾 * - 如果不写分号,浏览器会自动添加,但是会消耗一些系统资源, * 而且有些时候,浏览器会加错分号,所以在开发中分号必须写 * 3.JS中会忽略多个空格和换行,所以我们可以利用空格和换行对代码进行格式化 * */ ``` ## JS进阶用法 ### 1 创建对象 ```javascript <script type="text/javascript"> /* new 表示在堆中新开辟一个空间 。 * * */ //方式一 用new关键字创建obj对象 var obj = new Object(); obj.name = "tom"; obj.age = 20; //alert(obj.name) //方式二 直接用var创建对象,对象中也可以创建对象 //在js中,数组用[]裹起来,数组之间用,隔开 var obj2 = { name:"张三", age:20, friend:[{ name:"tom", age:30 },{ name:"tom2", age:30 },{ name:"tom3", age:30 },{ name:"tom4", age:30 }], var:"abc", play:function(a,b){ alert("玩游戏!"+(a+b)) } } //alert(obj2.name) //obj2.play(10,20) //alert(obj2.friend.name); //alert(obj2.var) //alert("haha" in obj2); var abc = "123"; var efg = "234"; efg = "hhh"; //alert(abc); //alert(efg); var jack = obj2; jack.name="杰克"; //alert(obj2.name); //alert(abc==efg); alert(jack == obj) </script> ``` ### 2 创建函数 **函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块** #### 1) 两种声明方法 ```javascript //在函数中 如果变量没有用var 声明 。 在调用完一次函数之后,会把这个变量 提升成全局变量。 //1、声明式函数 function 函数名(["参数列表"]){ //函数体 } <script> test(12); function test(age){ console.log(age);} //test(12) </script> //2、赋值式函数 var 函数名 = function(["参数列表"]){ //函数体 } <script> var gh = function(name) { alert(name) } gh("tim"); </script> ``` #### 2) 调用函数 ```javascript // 直接调用 函数名(实参列表); <script> function my (a, b) { return a * b; } my (10, 2); // my (10, 2) 返回 20 </script> //在方法中调用 定义名称.函数名(); <script type="text/javascript"> var myObject = { firstName: "zhang", lastName: "san", fullName: function() { return this.firstName+""+this.lastName; }} alert(myObject.fullName()); </script> //在构造函数中调用 用new关键字创造一个对象,这个对象继承了函数的方法和属性 <script type="text/javascript"> function Function(arg1, arg2) { this.firstName = arg1; this.lastName = arg2; } var x = new Function(“zhang", “san"); x.firstName; </script> //递归调用 在函数内部调用函数本身 function 函数名(){ 代码 函数名(); } <script type="text/javascript"> function sum(num) { if(num <= 1) { return 1; } else { return num + sum(num - 1); }} console.log(sum(5)); </script> ``` #### 3) 参数 参数类型 : 形参:定义函数时使用的参数,接收调用该函数时传递的参数 实参:调用函数时传递给函数的实际参数 #### 4) 直执行函数 ```javascript //( 函数 )( 函数的参数 。 ) 用括号括起来的函数表示直接调用自己,就会直接执行这个函数 // (function a(){ // alert("哈哈") // })(); (function b(c,d){ alert(c+d) })(10,20); ``` ### 3 continue break return ```javascript //return 1. 表示方法的返回值 。 2. 表示跳出方法 。 function sum(a,b,c){ return a+b+c; alert("123"); } //var r = sum(10,20,30); //alert(r); //continue 只能用在循环结构 。 结束本次循环回到循环头部继续下次循环。 //break 表示强制跳出本层循环 。 只跳一层循环。 //当return 用在循环结构中的时候,不管多少层循环 。 直接全部跳出 。 ``` ### 4 this用法 ```javascript <script type="text/javascript"> var a = 10; function fun(){ //this 谁调用方法,this就代表这个方法的调用者 。 alert( "哈哈" ); alert(this.a)//this 带指 window对象 。 } fun();//window. var obj = { name:"张三", play:function(){ alert("张三 play..."); alert(this.name) //this指obj这个对象 } } obj.play(); </script> ``` ### 5 原型函数prototype 构造函数constructor **构造函数,就是提供一个生成对象的模板,并描述对象的基本结构的函数** 构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写 构造函数和普通函数的区别在于:调用方式不一样 普通函数的调用方式:直接调用 person(); 构造函数的调用方式:需要使用new关键字来调用 new Person(); ```javascript <script type="text/javascript"> //构造函数 function Person(name){ this.name=name } //每个函数都有一个原型函数 Person.prototype.toString = function(){ return "这个对象的名字是:"+this.name; } var p1 = new Person("张三"); alert(p1); </script> <script type="text/javascript"> //JS类 。 function Person(){ } //prototype 类名.protorype 可以访问到类的原型对象 。 Person.prototype.a="哈哈"; var p1 = new Person(); var p2 = new Person(); //类拿到原型对象 。 类名(构造器名称).prototype // 对象.__proto__ 通过这个去拿到原型对象 。 // 10W 中国 alert(Person.prototype == p1.__proto__); p1.__proto__.a="呵呵"; alert(p2.__proto__.a); </script> ``` ### 7 数组 ```javascript //声明一维数组 需要用到 new Array() <script type="text/javascript"> var arr = new Array(); arr[0]=1; arr[1]=2; arr[2]=3; arr[3]=4; arr[4]=5; arr.length=10; for(var s in arr){ alert(s); } //alert(arr.length) </script> //声明二维数组 <script type="text/javascript"> //int [] arr = new int [5]; var obj = new Object(); obj.name = "张三。"; var arr = [10,120,32,23,12,true,false,"132",obj]; var arr2 = [[1,2,3],[4,5,6,7,8],[9,0]]; //alert(arr2[0].length) //alert(arr2[1].length) // for (var i=0;i<arr2.length;i++) { // for (var j=0;j<arr2[i].length;j++) { // alert(arr2[i][j]); // } // } var arr = ["孙悟空","猪八戒","沙和尚"]; var result = arr.push("唐僧","蜘蛛精","白骨精","玉兔精"); //push向数组后加入数据 var result2 = arr.pop(); //pop 删除并返回最后一个数组元素 //alert(result2); </script> //sort 进行排序操作 <script type="text/javascript"> arr = [5,4,2,1,3,6,8,7]; // arr.sort(function(a,b){ //升序排列 return a - b; //降序排列 //return b - a; }); console.log(arr); </script> ``` ## JS DOM操作 ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <button id="btn">我是一个按钮</button> <!-- 我们可以在事件对应的属性中设置一些js代码, 这样当事件被触发时,这些代码将会执行 这种写法我们称为结构和行为耦合,不方便维护,不推荐使用 <button id="btn" onmousemove="alert('讨厌,你点我干嘛!');">我是一个按钮</button> --> <!----> <script type="text/javascript"> /* * 浏览器已经为我们提供 文档节点 对象这个对象是window属性 * 可以在页面中直接使用,文档节点代表的是整个网页 */ //console.log(document); //获取到button对象 var btn = document.getElementById("btn"); // innerTEXT = // innerHTML = //修改按钮的文字 btn.innerHTML = "I'm Button"; //绑定一个单击事件 //像这种为单击事件绑定的函数,我们称为单击响应函数 btn.onclick = function(){ alert("你还点~~~"); }; </script> </body> </html> ``` ```html <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> /* * 浏览器在加载一个页面时,是按照自上向下的顺序加载的, * 读取到一行就运行一行,如果将script标签写到页面的上边, * 在代码执行时,页面还没有加载,页面没有加载DOM对象也没有加载 * 会导致无法获取到DOM对象 */ /* * onload事件会在整个页面加载完成之后才触发 * 为window绑定一个onload事件 * 该事件对应的响应函数将会在页面加载完成之后执行, * 这样可以确保我们的代码执行时所有的DOM对象已经加载完毕了 * */ window.onload = function(){ //获取id为btn的按钮 var btn = document.getElementById("btn"); //为按钮绑定一个单击响应函数 btn.onclick = function(){ alert("hello"); }; }; </script> </head> <body> <button id="btn">点我一下</button> <!--<script type="text/javascript"> /* * 将js代码编写到页面的下部就是为了,可以在页面加载完毕以后再执行js代码 */ //获取id为btn的按钮 var btn = document.getElementById("btn"); //为按钮绑定一个单击响应函数 btn.onclick = function(){ alert("hello"); }; </script>--> </body> </html> ``` ## JS BOM操作 ```javascript BOM DOM EcmaScript ... ECMAScript无疑是JavaScript的核心,但是要想在浏览器中使用JavaScript, 那么BOM(浏览器对象模型)才是真正的核心。 BOM 提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。 BOM将浏览器中的各个部分转换成了一个一个的对象,我们通过修改这些对象的属性,调用他们的方法,从而 控制浏览器的各种行为。 window對象是BOM的核心 ,它表示一个浏览器的实例。 在浏览器中我们可以通过window对象来访问操作浏览器,同时window也是作为全局对象存在的。 全局作用域: window对象是浏览器中的全局对象,因此所有在全局作用域中声明的变量、对象、函数都会变成window对象的属性和方法。 * - BOM对象 * Window * - 代表的是整个浏览器的窗口,同时window也是网页中的全局对象 * Navigator * - 代表的当前浏览器的信息,通过该对象可以来识别不同的浏览器 * Location - 代表当前浏览器的地址栏信息,通过Location可以获取地址栏信息,或者操作浏览器跳转页面 History * - 代表浏览器的历史记录,可以通过该对象来操作浏览器的历史记录 * 由于隐私原因,该对象不能获取到具体的历史记录,只能操作浏览器向前或向后翻页 * 而且该操作只在当次访问时有效 /* window.history * length * - 属性,可以获取到当成访问的链接数量 */ //alert(history.length); /* * back() * - 可以用来回退到上一个页面,作用和浏览器的回退按钮一样 */ //history.back(); /* * forward() * - 可以跳转下一个页面,作用和浏览器的前进按钮一样 */ //history.forward(); /* * go() * - 可以用来跳转到指定的页面 * - 它需要一个整数作为参数 * 1:表示向前跳转一个页面 相当于forward() * 2:表示向前跳转两个页面 * -1:表示向后跳转一个页面 * -2:表示向后跳转两个页面 */ * Screen * - 代表用户的屏幕的信息,通过该对象可以获取到用户的显示器的相关的信息 * * * 这些BOM对象在浏览器中都是作为window对象的属性保存的, * 可以通过window对象来使用,也可以直接使用 * * * window.location * /* * 如果直接将location属性修改为一个完整的路径,或相对路径 * 则我们页面会自动跳转到该路径,并且会生成相应的历史记录 */ //location = "http://www.baidu.com"; //location = "01.BOM.html"; /* * assign() * - 用来跳转到其他的页面,作用和直接修改location一样 */ //location.assign("http://www.baidu.com"); /* * reload() * - 用于重新加载当前页面,作用和刷新按钮一样 * - 如果在方法中传递一个true,作为参数,则会强制清空缓存刷新页面 */ //location.reload(true); /* * replace() * - 可以使用一个新的页面替换当前页面,调用完毕也会跳转页面 * 不会生成历史记录,不能使用回退按钮回退 */ location.replace("01.BOM.html"); ``` ## JSON ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <!-- 如果需要兼容IE7及以下的JSON操作,则可以通过引入一个外部的js文件来处理 --> <script type="text/javascript" src="js/json2.js"></script> <script type="text/javascript"> /* * JSON ... * * var obj = [{ * "name":"zhangsan1", * "age":"20" * },{ * "name":"zhangsan2", * "age":"20" * }] * * JSON * - JS中的对象只有JS自己认识,其他的语言都不认识 * - JSON就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别, * 并且可以转换为任意语言中的对象,JSON在开发中主要用来数据的交互 * - JSON * - JavaScript Object Notation JS对象表示法 * - JSON和JS对象的格式一样,只不过JSON字符串中的属性名必须加双引号 * 其他的和JS语法一致 * JSON分类: * 1.对象 {} * 2.数组 [] * * JSON中允许的值: * 1.字符串 * 2.数值 * 3.布尔值 * 4.null * 5.对象 * 6.数组 */ //创建一个对象 var arr = '[1,2,3,"hello",true]'; var obj2 = '{"arr":[1,2,3]}'; var arr2 ='[{"name":"孙悟空","age":18,"gender":"男"},{"name":"孙悟空","age":18,"gender":"男"}]'; /* * 将JSON字符串转换为JS中的对象 * 在JS中,为我们提供了一个工具类,就叫JSON * 这个对象可以帮助我们将一个JSON转换为JS对象,也可以将一个JS对象转换为JSON */ var json = '{"name":"孙悟空","age":18,"gender":"男"}'; /* * json --> js对象 * JSON.parse() * - 可以将以JSON字符串转换为js对象 * - 它需要一个JSON字符串作为参数,会将该字符串转换为JS对象并返回 */ var o = JSON.parse(json); var o2 = JSON.parse(arr); //console.log(o.gender); //console.log(o2[1]); var obj3 = {name:"猪八戒" , age:28 , gender:"男"}; /* * JS对象 ---> JSON * JSON.stringify() * - 可以将一个JS对象转换为JSON字符串 * - 需要一个js对象作为参数,会返回一个JSON字符串 */ var str = JSON.stringify(obj3); //console.log(str); /* * JSON这个对象在IE7及以下的浏览器中不支持,所以在这些浏览器中调用时会报错 */ var str3 = '{"name":"孙悟空","age":18,"gender":"男"}'; JSON.parse(str3); </script> </head> <body> </body> </html> ```