JavaScript基础
简介
JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。被广泛应用于各种客户端Web程序尤其是HTML开发中,能给HTML网页添加动态功能,响应用户各种操作,实现诸如欢迎信息、数字日历、跑马灯,显示浏览器停留时间等特殊效果,提高网页的可观性。决定WEB页面的行为,具有客户端数据验证、用户交互等功能
1. JavaScript放置
1 2 3 4 5 6 7 8 9 10 11 12 <script > alert('JSnb') </script > <script src = "js1.js" > </script >
JavaScript代码放置有4种情形:
头部;
主体;
单独的js文件;
直接在事件处理代码中。
1 2 3 4 5 6 7 8 9 10 11 <html > <head > <title > 直接在事件处理代码中加入JavaScript代码</title > </head > <body > <form > <input type ="button" onclick ="alert('直接在事件处理代码中加入JavaScript代码')" value ="直接调用JavaScript代码" > </form > </body > </html >
JavaScript程序本身不能独立存在,它是依附于某个HTML页面,在浏览器端运行的。
注:如果引入引入了外部js文件,在< script> < /script>标记之间的所有JS语句都被忽略,不会执行
2. 消息对话框
JavaScript中的消息对话框分为告警框、确认框和提示框。
警告框
alert (message)
1 2 3 4 5 6 7 8 9 10 11 12 13 <!DOCTYPE html > <html > <head > <meta charset ="UTF-8" > <title > 告警消息框使用实例</title > </head > <body > <script > alert("这是告警消息框!" ); </script > </body > </html >
注:确定按钮必须响应,否则屏蔽一切操作。告警信息为纯文本信息或字符串,不能含有HTML标记
确认框
confirm (message)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <html > <head > <meta charset ="UTF-8" > <title > 确认框使用实例</title > <script > function show_confirm ( ) { var r=confirm("请选择按钮!" ); if (r==true ){ alert("您按了确定按钮!" ); } else { alert("您按了取消按钮!" ); } } </script > </head > <body > <input type ="button" onclick ="show_confirm()" value ="显示确认框" /> </body > </html >
注:确认按钮的返回值,类型为逻辑值,确定true,取消false
提示框
prompt (text, defaultText)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <html > <head > <meta charset ="UTF-8" > <title > 提示框使用实例</title > <script > function disp_prompt ( ) { var name=prompt("请输入您的姓名" ,"李大为" ); if (name!=null && name!="" ) { document .write("您好," + name + "!" ); } } </script > </head > <body > <input type ="button" onclick ="disp_prompt()" value ="单击显示提示框" /> </body > </html >
注:选择“确定”返回输入的值,选择“取消”返回null。
3. 命令规范
标识符
标识符是计算机语言中用来表示变量名、函数名等的有效字符序列,简单来说,标识符就是一个名字,JavaScript关于标识符的规定如下:
必须使用字母或者下划线开始。
必须使用英文字母、数字、下划线组成,不能出现空格或制表符。
不能使用JavaScript关键字与JavaScript保留字。
不能使用JavaScript语言内部的单词,比如Infinity,NaN,undefined等。
大小写敏感,如name和Name是不同的两个标识符。
关键字
关键字是JavaScript中已经被赋予特定意义的一些单词,关键字不能作为标识符来使用。
JavaScript的关键字
break
case
catch
continue
default
delete
do
else
finally
for
function
if
in
instanceof
new
return
switch
this
throw
try
typeof
var
void
while
with
JavaScript的保留字
abstract
boolean
byte
char
class
const
debugger
double
enum
export
extends
final
float
goto
implements
import
int
interface
long
native
package
private
protected
public
short
static
super
synchronized
throws
transient
volatile
4. 数据类型
所有的变量直接使用var声明就行 如 var a = 1; 输出是console.log();
js不区分小数和整数
1 2 3 4 5 6 123 123.1 1.23e3 -99 NaN //not a number Infinity //表示无限大
这里就是多了NaN (not a number类型和Infinity 无限大的类型, 再说一下比较运算符有点不一样
比较运算符
= 赋值
== 等于(类型不一样,值一样,也会判断为true)
=== 绝对等于(类型一样,值一样,结果为true)
须知
NaN===NaN 这个于所有的之都不相等,包括自己
只能通过isNaN(NaN)来判断是不是NaN
还有就是老生长谈的精度问题,不要直接比较浮点数
1 2 3 4 5 6 7 8 9 10 11 12 <script type ="text/javascript" > var i = 304 ; var f = 3.87 ; var s = 8.1e3 ; var o = 034 ; var h = 0x2A ; document .write("十进制整型数304的输出结果:" +i+"<br>" ); document .write("十进制浮点型数3.87的输出结果:" +f+"<br>" ); document .write("十进制数科学计数法8.1e3的输出结果:" +s+"<br>" ); document .write("八进制整型数034的输出结果:" +o+"<br>" ); document .write("十六进制整型数0x2A的输出结果:" +h+"<br>" ); </script >
5. 数组
基本和Java类似,不详谈,不一样的就是什么类型都可以装,有点像集合
1 2 3 var arr = [1 ,2 ,3 ,"hello" ,null ,true ];new array(1 ,2 ,3 ,"hello" ,null ,true );
数组越界会undefined
同时数组还有一些方法如sort(),reverse(),concat();都是 数组名.方法名();
来调用,就是多了一个join连接符
1 2 3 ["C" "B" "A" ] arr.join('-' )"C-B-A"
多维数组
1 2 3 arr = [[1 ,2 ],[3 ,4 ],["5" ,"6" ]]; arr[1 ][1 ]4
6. 对象
js是一个面向对象的语言,因此也有对象这个概念
声明一个对象
1 2 3 4 5 var person{ name :"niubi" , age :3 , tags :['js' ,'is' ,'niubi' ] }
这里注意,对象是大括号,数组是中括号.而且对象的前几个属性使用逗号隔 ( , ) 开,最后一个不用符号
调用的话直接person.age 就行了
严格检查模式
在< script > 标签里第一句 写上 'use strict’就行
这样局部变量就只能使用let声明 (局部变量推荐使用let声明)
7. 字符串
和Java类似,不同的多了一个多行字符串的编写
1 2 3 4 var msg = `chen shuai niu bi`
这个符号声明的符号就是tab键上面的那个键
字符串是不可以变的,就像是Java里的String一样
8. 流程控制
for-in循环
语法
1 2 3 4 for (变量 in 对象) { 在此执行代码 }
感觉就是for-each循环,这里的变量可以是数组元素,也可以是对象的属性
例如
1 2 3 4 5 var age = [1 ,2 ,3 ,4 ,5 ,6 ,7 ];for (var num in age){ console .log(num); }
9. map和set集合
和Java没啥区别
map集合
1 2 3 4 5 var map = new Map ([["tom" ,100 ],["jack" ,90 ],["haha" ,80 ]]);var name = map.get("tom" ); map.set("admin" ,123456 );console .log(name); map.delete("tom" );
set集合
set: 无序不重复的集合
1 2 3 4 5 6 7 8 9 var set = new Set ([3 ,1 ,1 ,1 ,1 ,1 ,1 ]); > Set (2 ) {3 , 1 } set.add(2 ); set.delete(1 ); > Set (2 ) {3 , 2 }console .log(set.has(3 )); true
遍历
同时遍历的方法多了个for-of循环…就是把 in 改成了 of 然后没有啥区别
1 2 3 4 5 6 7 8 var map = new Map ([["tom" ,100 ],["jack" ,90 ],["haha" ,80 ]]);for (let x of map){ console .log(x) } (2 ) [100 , 'tom' ] (2 ) [90 , 'jack' ] (2 ) [80 , 'haha' ]
10. 函数来一点点
函数相关
JavaScript函数分为系统内部函数和系统对象定义的函数及用户自定义函数。
函数就是完成一个特定的功能的程序代码。函数只需要定义一次,可以多次使用,从而提高程序代码的复用率,既减轻开发人员的负担,以降低了代码的重复度。
函数需要先定义后使用,JavaScript函数一般定义在HTML文件的头部head标记或外部JS文件中,而函数的调用可以在HTML文件的主体body标记中任何位置。
常用系统内部函数又称为内部函数(内部方法),与任何对象无关,可以直接使用。
基本语法
function 函数名(参数1, 参数2, … 参数N) {函数体;}
语法说明:
可以没有参数,但括号必须保留、以及包含在大括号内的由若干条语句构成的函数体。
不能在其他语句或其自身中嵌套function语句,也就是说,每个函数声明都是独立的。
函数名(参数),形参是用来接收函数调用者传递过来的实参。
调用实参与形参要一一对应,主要表现在类型、顺序、数量、内容要一致。
定义函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function abs (x ) { if (){ ... }else { ... } }var abs = function (x ) { if (){ ... }else { ... } }
调用
ES6引入的新特性
rest类似于Java中的可变参数
ES6引入的新特性,获取除了已经定义的参数之外的所有参数,ES6新特性中还可以使用const定义常量
1 2 3 4 5 function aaa (a,b...rest ) { console .log("a=>" +a); console .log("b=>" +b); console .log(rest); }
rest参数只能写在最后面,且必须使用…标示
11. 方法
定义一个方法
1 2 3 4 5 6 7 8 9 10 11 var chenshuai = { name :chen, age :19 , run :function ( ) { .... } } chenshuai.name
12. date对象的使用
1 2 3 4 5 6 7 8 9 10 11 12 var now = new Date (); now.getFullyear(); now.getMonth(); now.getDate(); now.getDay(); now.getHours(); now.getMinutes(); now.getSeconds(); now.getTime();console .log(new Date (1595555665 ))
13. 初识Json
这里只是简单的了解一下json,后面我会出专门的json篇
简单的三点
对象都使用{}
数组都使用[]
所有的键值对都是用key:value
来一点代码理解
1 2 3 4 5 6 7 8 9 10 11 12 var user = { name :"chenshuai" , age :3 , sex :'男' }var jsonUser = JSON .stringify(user);var obj = JSON .parse('{"name":"chenhsuai","age":3,"sex":"男"}' )
关于js和Json的区别
1 2 var obj = {a :'hello' ,b :'hellob' }; var obj = {"a" :"hello" ,"b" :"hellob" };
14. 原型
相当于Java中的继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var student = { name :"chenhsuai" , age :19 , run :function ( ) { console .log("student" ); } } var xiaoming = { name :"xiaoming" , age :19 , } xiaoming._proto_ = student;
小明的原型是student 然后就可以使用student的方法了.在这里student也是一个对象
原型链:不深入了解
15. 操作BOM对象
javascript由三部分组成
核心:描述了javascript的语法和基本对象。
文档对象模型(DOM):是处理网页内容的方法和接口,是HTML和xml的应用程序接口(API)。
浏览器对象模型(BOM):各个浏览器厂商根据DOM在各个浏览器上的实现。
bom对象就是浏览器的对象模型,核心是对window的操作,主要针对浏览器窗口交互,BOM包含了DOM
window对象
代表浏览器窗口
页面跳转和重定向
1 2 window .location.href = "url" ;window .location.replace("url" );
Navigator对象
封装了浏览器的信息(大多数时候不会使用这个对象,因为会被认为的修改
所以不建议使用这些属性来判断和编写代码
)
screen对象
screen.width 获取屏幕的宽度
screen.height 获取长度
location
代表当前页面的URL信息
1 2 3 4 5 6 host:"www.baidu.com" href :"https://www.baidu.com/" protocol :"https:" reload :f reload() location.assign('https://blog.mercury.com/' )
document
document对象是客户端JavaScript最为常用的对象之一,在浏览器对象模型中,它位于window对象的下一层级。
document对象包含一些简单的属性,提供了有关浏览器中显示文档的相关信息,例如:该文档的URL、字体颜色,修改日期等。
document对象还包含一些引用数组的属性,这些属性可以代表文档中的表单、图象、链接、锚以及applet。
同其他对象一样,document对象还定义了一系列的方法,通过这些方法,可以使JavaScript在解析文档时动态地将HTML文本添加到文档中。
获取具体的文档树结点
1 2 3 4 5 6 7 8 9 <dl id = "app" > <dt > java</dt > <dt > javaSE</dt > <dt > javaEE</dt > </dl > <script > var dl = document .getElementById('app' ); </script >
getElementById
getElementsByName
getElementsByName方法用于返回HTML元素中指定name属性的元素数组 ,而且仅用于像input,radio,checkbox等表单元素对象。
getElementsByTagName
定义多个P标记元素,通过getElementsByTagName(“p”)方法选中HTML标记是
的元素,返回是一个对象数组,可以通过下标访问这个数组。
appendChild
appendChild方法向当前节点对象追加节点,经常用于给页面动态的添加内容。
removeChild
removeChild方法是删除当前节点下的某个子节点,并返回被删除的节点。
其他方法
cloneNode();
replaceChild(newChild,oldChild);
inserBefore(newElement,targeElement);
获取cookie
例如: document.cookie
1 2 document .cookie"buvid3=C1B1E27B-2C84-63F6-4A26-B4E8B02E8F6161085infoc"
1 2 3 4 5 6 7 8 9 var h1 = document .getElementByTagName('h1' );var p1 = document .getElementByID('p1' );var p2 = document .getElementByclassName('p2' );var father = document .getElementByID('father' );var childrens = father.children;
获取页面标题
1 2 document .title"百度一下,你就知道"
注意
通过getElementById方法可以快速访问某个HTML元素,而不必通过DOM层层遍历。
使用getElementById方法时如果元素的ID不是唯一的,那么会获得第一个符合条件的元素。
getElementsByName方法用于返回HTML元素中指定name属性的元素数组。而且仅用于像input,radio,checkbox等表单元素对象
history
1 2 3 history.back() history.forward()
16. 操作DOM对象节点
DOM简介
DOM是一个发展中的标准,它指定了JavaScript等脚本语言访问和操作HTML或者XML文档各个结构的方法,随着技术的发展和需求的变化,DOM中的对象、属性和方法也在不断地变化
对于大多数HTML文档来说,主要由以下几个节点构成:
•元素节点 (Element Node ),元素节点构成了DOM基础。在文档结构中,<html>,<head>、<body>、<h1>、<p>,<ul>等标签都是元素节点。
•文本节点(Text Node),文本节点包含在元素节点内,如h1、p、li等节点就可以包含一些文本节点。
•属性节点(Attribute Node),属性节点总是被包含在元素节点当中,可以通过元素节点对象调用getAttribute( )方法来获取属性节点。
DOM应用实例
方法名
说明
createElement(tagname)
创建标记名为tagname的结点
createTextNode(text)
创建包含文本text的文本结点
creatDocumentFragment()
创建文档碎片
removeChild(node)
删除一个名为node的子节点
appendChild(node)
添加一个名为node的子节点
insertBefore(node B ,node A)
在名为nodeA节点前插入一个名为nodeB的节点
replaceChild(node B ,node A)
用一个名为nodeB节点替换另一个名为nodeA节点
cloneNode(boolean)
克隆一个节点,它接收一个boolean参数,为true时表示该节点带文字;false表示该节点不带文字
更新节点
在DOM中有两个很重要的属性,这两个属性分别是innerText和innerHTML,通过这两个属性,可以更方便的进行文档操作。
在DOM中,如果需要动态地获取及设置节点属性的话,可以通过getAttribute( )方法setAttribute( )方法来处理
先获取一个节点,然后进行相应的操作
1 2 3 4 5 6 7 8 9 10 11 <div id = "id1" > </div > <script > var id1 = document .getElementById("id1" ); id1.innerText = '456' id1.innerHTML = '<strong>123< strong>' </script >
删除节点
需要通过父节点来删除子节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <div id = "father" > <h1 > 标题</h1 > <p id = "p1" > p1</p > <p class = "p2" > p2</p > <div > <script > var self = document .getElementById('p1' ); var father = p1.getElementById; father.removechild(p1); father.removeChild(father.child[0 ]); father.removeChild(father.child[1 ]); </script >
插入节点
1. 追加
可以通过append方法来追加
1 2 3 4 5 6 7 8 9 10 11 12 <p id = "js" > JavaScript</p > <div id = "list" > <p id = "se" > JavaSE</p > <p id = "ee" > JavaEE</p > <p id = "me" > JavaME</p > </div > <script > var js = document .getElemntById('js' ); var list = document .getElementById('list' ); list.appendChild(js); </script >
2. 通过js创建一个新的节点
1 2 3 var newp = document .creatElement('p' ) newp.id = 'newp' ; newp.innerText = 'hello chengshuai'
插入到前面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <div id = "list" > <p id = "se" > JavaSE</p > <p id = "ee" > JavaEE</p > <p id = "me" > JavaME</p > </div > <script type ="text/javascript" > var list = document .getElementById("list" ); var newnode = document .createElement("p" ); newnode.innerHTML = "hello chengshuai" ; let ee = document .getElementById("ee" ); list.insertBefore(newnode,ee); </script >
3. 通过函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 创建节点举例</title > <script > function creatp ( ) { var op = document .createElement("p" ); var otext = document .createTextNode("hello world" ); op.appendChild(otext); document .forms[0 ].appendChild(op); } </script > </head > <body > <form name = "from1" > <input type = "button" value ="点击创建节点" onclick ="creatp()" > </form > </body > </html >
4. 操作css
1 2 3 id1.style.color = 'yellow' ; id1.style.fronSize = '20px' ; id1.style.padding = '2px' ;