javascript是一门脚本语言
遵从ECMAScript规范
客户端JS:运行在自己的电脑上
服务端:node.js,运行于操作系统层面
浏览器中审查元素中console可以用来编写;
用VScode来编写前端代码
扩展包中live server(实时看到结果), prettier(格式化) 来编写
保存时即格式化 (ctrl+shift+p) ->输入settings->UI->输入formatsave(✔)
若要符号更改:http://github.com/tonsky/FiraCode打开ttf全部安装-> 打开settings
->Font Family(Fira Code)->ctrl+shift+p输入font ligature->Edit in settings.json
->加上一行editor.fontLigature:true,
(以上不是必要的)
新建html文件:输入!,按下tab键可以自动补全,右键Open with Live Server可以自动运行浏览器
打开浏览器后,右击inspect可以查看js文件
js为弱类型语言,没有编译阶段,一个变量可以随意赋值,若没有手动赋值,则系统默认赋值undefined
根据浏览器中f12中 查看器,控制台,网络进行调试(firefox 浏览器)
数据类型 var , 变量必须定义
var 变量名 = 值
可以一行中初始化+赋值
变量名:第一个单词小写,后面的大写
const 变量名 = 值 OR const 变量名 = 函数方式
标识符:字母,数字,$,下划线,不能使用关键字做标识符,不能以数字开头
关键字:。。。
boolean : var 变量名 = true OR False
number:var 数字 = 变量名(整数,浮点数)包括(NaN—(Not a number) 结果本该是一个数字,但是运算过程导致他不是一个数字是出现, Infinity-无穷大)
string :var 变量名 = ” “ , 可以是单引号,也可以是双引号。
定义
var x = "123";
var x1 = new String("abc");//内置类,为object子类
s.length // 获取长度
//具体类型参考帮助文档
substr与substring区别
undefined: var 变量名 = undefined,变量未定义为undefined
null: var 变量名 = null
引用类型:object及object的子类
prototype属性(常用,给类动态扩展属性和函数,所有都可以扩展)
JS定义类
//定义类,两种方式
function 类名(形参){
}
类名 = function(形参){
}
//创建对象的语法
new 构造方法名(实参);//构造方法名和类名一致
function sayhello()
{
}
sayhello();//这种方式就是当作普通函数
//这种方式表示把sayhello当作一个类创建对象
var obj = new sayhello();//obj是一个引用,保存内存地址指向堆中的地址
function user(a,b,c)
{
this.sno = a;
this.sname = b;
this.sage = c;
}
var u1 = new user(1,"son",20);
//访问
u1.sno OR u1["sno"]
//常用匿名函数
Emp = function(ename,salary)
{
this.ename = ename;
this.salary = salary;
this.getSalary = function()//函数
{
return this.price;
}
}
var e1 = new Emp("smith",800);
//动态扩展
Emp.prototype.getEname()
{
return this.ename;
}
var pname = e1.getEname();//调用
有一个新的类型symbol
变量名 可以查看变量数据类型,结果为上面6个小写的字符串之一
console.log(变量) 可以打印
number+string number会转换为string类型
parselnt():字符串转换为整数
parseFloat():字符串转换为小数
isNan(数据) 结果为true表示不是一个数字,为false表示是一个数字。
math.ceil(数字) 向上取整
Boolean(数据)将非布尔类型转化为布尔类型
// : 当行注释
/* 内容 */多行注释
/**
*内容
*内容
*/ 文档注释,之后可分离出来生成文档注释
-:负数
+:+在字符串前面,转换括号内字符串为数字
++, --:同C语言
+, -, *, /,%
**(指数)
== : 两边值转换为同一类型后
===: 值和类型都相同
&&, ||, ! : 同C,有短路特性
数字变为真假值
4-> true, !4->false
条件: 真 ? 假
既保留住超链接的样式,同时用户点击该超链接的时候执行一段JS代码,但页面不能跳转
<a herf = "javascript:void(0)” oncilick = "window.alert("hello")></a>
原理:执行表达式,但不返回任何结果
void()小括号中必须有表达式
前面的javascript不能省略
let创建的变量与const创建的常量只能在语句块中访问
var创建的变量可以在任何地方访问
与C语言相同(if,else if ,else)
switch case 也与C语言相同
switch(a){
case 1:
alert("aaa");
break;
default:
alert("bbb");
break;
}
while循环,do-while循环,for循环。
break终止循环,continue跳过此次循环
不需要指定返回值类型
function 函数名(形参){
函数体
}
函数名 = function (形参){
函数体
}
function Puttt(sth)
{
console.log("ba"+sth);
}
Puttt("aa");
与C相同, 不用形参类型,可以有返回值
调用时不用数据类型,若没赋值则系统默认传入undefined
调用时传递的参数没规定个数
将函数名赋给一个变量
var mutiply = function multi(a,b)
{
return a*b;
}
console.log(mutiply(2,6)); //返回12
multi可以去掉,为匿名函数。不影响操作结果
函数先调用在定义
有默认值的时候,调用函数时不用给形参
若有多个参数,想用默认值的地方用undefined代替
与C相同
用户传进多个参数,相当于不断传进数组中的每一个元素
function log()
{
for(let i = 0;i < arguments.length();i++)
{
console.log(arguments[i]);
}
}
log("abc","efg");//能打印出abc与efg
方法名或者函数名一样,形参不同(个数,类型,顺序)
若两个函数同名,后面的函数会覆盖前面的
局部变量只在局部有效,若局部与全局名字相同,局部可以覆盖全局的。
当一个变量定义时没用var关键字,则变量为全局变量
var和let都是定义全局与局部变量时作用域相同,
{}中定义的var出了大括号可以访问,let出了大括号不能访问
var gre = (name,weather) =>{
console.log("he" + name + "o" + weather);
}
var increament = x => x+1;
箭头函数为匿名函数
function squaresum(a,b)
{
function square(x){
return x * x;
}
return square(a)+square(b);
}
外部函数返回内部函数的函数名(外界只能访问他的值,而不能修改他的值)
变量一个个输入,固定前几个变量的值,更改最后一个变量的值
外部访问不到内部,防止数据被篡改,防止冲突
cb()
一段函数作为另一个函数的参数调用
自己把这个函数代码写出来了,但是这个函数不是自己负责调用,有其他程序负责调用该函数
可放不同数据类型
var arr = []
;
var arr2 = new Array()
一个数为长度,多个数为元素
自动扩容
遍历数组
for(var i = 0;i < arr.length;i++){
alert(arr[i]);
}
for(var i in arr){
alert(arr[i]);
}
for in 遍历对象
User= function(username,password)
{
this.username = username;
this.password = password;
}
user1 = new User("lili","123");
for(var u in user1){
alert(u) // u是属性名,string变量名
alert(user1["u"]);
}
join(’’) 将数组中元素取出来用” “中东西连接
push() 末尾添加一个元素
pop()弹出一个元素
reverse()反转
js中数组模拟栈的数据结构
Js是事件驱动型语言,依靠事件去驱动,然后执行对应的程序。
页面打开的时候,js代码并不会执行,只会把js代码注册到按钮的事件上,事件发生后,js代码会被浏览器自动调用。
<body>
<!--
1.要实现的功能,用户点击按钮,弹出消息框
2.有一个事件叫做单击:click。对应的事件句柄为:onclick。事件句柄是事件单词前加上on,事件句柄是以html标签属性存在的。
-->
<input type = "button" value = "hello" onclick = "window.alert('hello')"/>
</body>
js字符串可以使用双引号,也可以使用单引号。
window.alert("消息")
可以弹出消息框,window.
可以省略不写,会阻塞html页面
js语句结束可以使用分号,也可以不使用。
<body>
<script type = "text/javascript">
window.alert("hello")
</script>
</body>
暴露在脚本块当中的程序,在页面打开的时候执行,并且遵循自上而下,并且遵循自上而下的顺序执行,代码的执行事件为打开浏览器。
js脚本块在一个页面中可以多次出现,位置是随意的。
<body>
<script type = "text/javascript" src = "js1.js"></script>
</body>
window.alert("hello")//js1.js
引入外部的文件,js文件会自上而下执行
必须有结束标签
引入js文件中中代码块内容不会执行
(1)blur 失去焦点
(2)focus 获得焦点
(3)click 鼠标单击
(4)dblclick 鼠标双击
(5)change 下拉列表中项改变,或文本框内容改变
(6)keydown 键盘按下
(7)keyup 键盘弹起
(8)load 页面加载完毕★
(9)mousedown 鼠标按下
(10)mouseover 鼠标经过
(11)mousemove 鼠标移动
(12)mouseout 鼠标离开
(13)mouseup 鼠标弹起
(14)reset 表单重置
(15)submit 表单提交
(16)select 文本被选定
事件句柄通常在事件前加上on,事件句柄出现在一个标签的属性位置上(事件句柄以属性的形式存在)
直接在标签中使用事件句柄
<input type = "button" value = "hello" onclick = "sayhello"/>
以上将sayhello函数注册到按钮上,等待click事件发生后,发生回调
纯js代码完成事件的注册
<body>
<input type = "button" value = "hello" id = "mybtn"/>
<script type = "text/javascript">
var btnobj = document.getElementById("mybtn");//根据id获取对象
btnobj.onclick = 函数名字,匿名函数//不加小括号
document.getElementById("mybtn").onclick = function()
{
}//等同于上面一种
</script>
</body>
执行顺序:onload(页面加载完了才会发生)
<body>
<script type = "text/javascript"></script>
window.onload = function(){
document.getElementById("btn").onclick = function(){
alert("hello");
}
}
<input type = "button" value = "hello" id = "btn"/>
</body>
页面加载过程中,将函数注册给load事件
页面加载完毕后,load事件发生,执行回调函数
回调函数执行过程中,将函数注册给click事件
函数被调用
一个节点对象中只要有的属性都可以"." id.属性
//回车键键值13,esc 27
window.onload = function()
{
var usernameElt = document.getElementById("username");
usernameElt.onkeydown = function(event){
//获取键值
if(event.keyCode === 13)
{
alert("正在验证...")
}
}
}
<input type = "text" id = "username"/>
回调函数在实际上是浏览器调用函数
浏览器再调用函数的时候回传一个参数
event为刚刚发生的事件,为事件对象,获取当前发生事件的入口
对网页中的节点进行增删改,html文档是一颗DOM树
顶级对象:document
BOM包含DOM
window.document
= document
document是window下面一个分支
window.onload = function(){
alert(document.getElementById("username").value)
}
<input type = "text" id = "username">
修改则在value后面加上=赋值
this. 代表的是当前的节点对象。获取.后面的属性
都是设置元素内部的内容
<input type = "button" value = "设置div中内容" id = "mybtn">
<div id = "div1"></div>
<script type = "text/javascript">
window.onload = function(){
var btn = document.getElementById("mybtn");
btn.onclick = function(){
var divElt = document.getElementById("div1");
divElt.innerHTML = “<font color = "red"></font>”;
}
}
</script>
//innerHTML 会把后面字符串当作html代码解释
//innerTEXT 会把后面字符串当作普通字符串
字符串格式匹配
参考文档
var regExp = /正则表达式/flags;
var regExp = new RegExp("正则表达式","flags");
关于flags:
g:全文匹配
i:忽略大小写
m:多行搜索(当前面是正则表达式时,m不能用,只有普通字符串能用)
true OR flase = 正则表达式.test(用户填写的字符串)//true为匹配成功
username = username.trim()
window.onload = function(){
var Quan = document.getElementById("quanxuan");
Quan.onclick = function(){
var aihao = document.getElementsByName("aihao")//获取name,形成一个数组
if(Quan.checked){ //获取复选框的选中状态
for(car i = 0;i < aihao.length;i++){
aihao[i].checked = true;
}
}
else{
for(car i = 0;i < aihao.length;i++){
aihao[i].checked = false;
}
}
}
}
}
<input type = "checkbox" id = "quanxuan"/>
<input type = "checkbox" name = "aihao" id = "smoke"/>
<input type = "checkbox" name = "aihao" id = "drink"/>
onchange:下拉列表的改变
获取
var nowtime = new Date();
转化为本地时间
nowtime = nowtime.toLocaleString();
输出
document.write(nowtime);
参考帮助文档
打开浏览器窗口,关闭,前进,后退,浏览器地址栏上地址
顶级对象:window