1、什么是JavaScript?

1.1、概述

  • JavaScript是一门流行的脚本语言

1.2、历史

ECMAScript可以理解为JavaScript的一个标准
最新版本是ES6,但大部分浏览器只支持ES5代码
这就导致,js开发环境和线上环境版本不一致。

1.3、ES6

ES6 = ECMAScript 这门标准的第 6 代版本(2015)。

  • ECMAScript 是语言的标准
  • 6 是版本号

ECMA:欧洲计算机制造商协会

具体内容:语法 + API

历史版本:ES1——>3、ES5——>6(ES4 被废弃了)

我们目前使用 JS 的大部分内容都是 ES3 的部分

ES 与 JS 的关系:JavaScript(浏览器端) = ESMAScript(语法+API) + DOM + BOM

ES6 的兼容性:

  • 主流浏览器的最新版本几乎都全部支持 ES6
  • IE 老版本等不支持的浏览器,可以使用 Babel 转码

2、快速入门

2.1、引入JavaScript

1、内部标签

<script>
    alert("hello world");
</script>

2、外部引入

HelloJs.js

alert('hello world');

HelloJs.html

<script src="js/HelloJs.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<!--    内部引入-->
    <script>
        alert('hello word');
    </script>
<!--    外部引入-->
    <script src="js/HelloJs.js"></script>
</head>
<body>

</body>
</html>

2.2、基本语法

<script>
        //1.定义变量
        var num = 1;
        alert(num);
        //2.条件控制
        if(2>1){
            alert("true");
        }
        //console.log(num) 在浏览器的控制台打印变量 ===> System.out.print();
</script>

2.3、数据类型

var

var就类似于Java中的Object,用于定义所有变量

number:

123 //整数123
123.4 //浮点数123.4
1.23e4 //科学计数法
-1234 //负数
NaN //not a number
Infinity //无穷大
//都属于 number 类型

字符串

‘abc’ , “abcd”

布尔

true , false

逻辑运算符

&& , || , !

比较运算符

=
== (类型不一样,值一样也会判断为true)
=== 绝对等于(类型一样,值一样)
NaN只能通过isNaN()函数来判断这个数是否是NaN

数组

var array = [1,2,3,4,5,6,7,8]

undefined

未定义
比如数组下标越界,就会报 undefined

对象

//创建对象
var Object = {
    name: "zzzzz",
    gender:"男",
}
//浏览器控制台输出对象中的属性
console.log(Object.name);
console.log(Object.gender);

2.4、严格检查模式

'use strict';

3、数据类型

3.1、字符串

正常字符串使用单引号或双引号

转译字符

\'
\n
\t
\u#### unicode字符
\x41   ASCII字符

字符串操作

var str = "asdf";
str.length; //字符串长度
str.toUpperCase() //转为大写
str.toLowerCase() //转为小写
str.indexOf('s') //获取字符对应的下标
str.substring(1,3) //截取字符串

3.2、数组

数组定义

var arr = [1,2,3,4];
var arrM = [[1,2],[3,4]]; //二维数组

数组操作

var arr = [1,2,3,4,5,6]
arr.length  //数组长度
arr.indexOf(2) //获取索引下标
arr.slice(1,3) //截取素组类似于substring
arr.push(1,3); //添加1和3,添加到尾部
arr.pop() //弹出尾部数据
arr.unshift(1,3) //添加数据到头部
arr.shift() //弹出头部的数据
arr.sort() //排序
arr.reverse() //元素反转
arr.join('--') //打印效果 ”1--2--3--4····

3.3、对象

对象声明

var 对象名 = {
    属性名1 : 属性值1,
    属性名2 : 属性值2,
    属性名3 : 属性值3
}

对象操作

var Object = {
    name: "zzzzz",
    gender:"男",
}
delete Object.name; //动态删除属性
Object.age = 1 ;  //动态添加属性
'age' in Object; //判断属性是否存在(继承的也返回true)
Object.hasOwnProperty('age') //判断该属性是否为该对象自身拥有的。

3.4、流程控制

if判断

var flag = 30;
if (flag>10){
    console.log("hhhh");
}else if (flag>5){
    console.log("sdsd");
}else {
    console.log("saaaa");
}

while循环

var age = 1;
while(age<100){
    console.log(age);
    age = age+1;
}

for循环

for (let i = 0; i < 100; i++) {
    console.log(i);
}

forEach循环遍历数组

var arr = [1,2,3,4,5];
arr.forEach(function (value) {
    console.log(value);
})

for in 遍历数组

var arr = [1,2,3,4,5,6];
for (var num in arr){
    console.log(arr[num]);
}

for of 遍历数组

var arr = [3,4,5]
for (var x of arr){
    console.log(x);
}

3.5、Map和Set集合

ES6新特性

Map

var map = new Map([['key1',1],['key2',2],['key3',3]]);
var value = map.get('key1'); //通过key获取value
console.log(value);
map.set('key4',4); //添加键值对
map.delete('key1') //删除键值对

Set

无序不重复集合

var set = new Set([1,1,1,1,2,3]); // set = [1,2,3] Set集合会自动去重
set.add(4); //添加数据
set.delete(1) //删除元素
set.has(1) //判断是否存在1

3.6、Iterator

迭代器遍历数组,集合

遍历Map

var map = new Map([['key1',1],['key2',2],['key3',3]]);
for(let x of map){
    console.log(x);
}

遍历Set

var set = new Set([1,1,1,1,2,3]);
for(let x of set){
    console.log(x);
}

4、函数

4.1、定义函数

function hanshu(x){
    return x;
}
//方式二 ,效果与方式一等效 类似于java中的匿名类
var hanshu = function (x) {
    return x;
}

如果函数没有return,也会返回结果 :undefined

参数问题

js函数可以传多个参数 用 arguments 获取。
不传参数不会报错,会显示结果 NaN。所以往往需要程序员手动规避不传参的问题。

function hanshu(x){
    if (typeof x !== 'number'){
        throw 'Not a Number';
    }
    return x;
}

获取除已定义参数外的其他传入的参数

ES6新特性

function hanshu(x,...rest){
    console.log(x);
    console.log(rest);
}

4.2、变量的作用域

var定义的变量有作用域:在函数体内定义的,只在函数内起作用

全局对象

相当于浏览器,全局变量都属于这个对象

var x = 'x';
console.log(x);
console.log(window.x); // x==>window.x; alert()==>window.alert();

在开发中,如果将全部的变量都绑定在window下会非常乱,如果不同的js文件,使用了相同的全局变量,会产生冲突

减少冲突

//定义唯一全局变量
var Mzj = {};
//向Mzj中添加变量
Mzj.name = 'hhh';
Mzj.fun = function (x) {
    return x
}

局部变量let

ES6新特性

常量const

ES6新特性

const PI = '3.1415926'; //只读变量不可修改

4.3、方法

定义方法

类中的函数叫做方法

var mmm = {
            //方法
            age : function (birth) {
                var now = new Date().getFullYear();
                return now-birth;
            }
        }

方式二

function getAge(){
    var now = new Date().getFullYear();
    return now-this.birth;
}
var mmm = {
            birth : 2002,
            //方法
            age : getAge
        }

/**
 * 调用 mmm.age();
 * getAge() NaN
 * this代表当前对象.
 */

在Java中,this是无法指向的,表示当前执行的对象
在JavaScript中,可以控制this指向

getAge.apply(mmm,[]); //this指向了mmm函数,参数为空

5、内部对象

标准对象

typeof 1
'number'
typeof '1'
'string'
typeof true
'boolean'
typeof NaN
'number'
typeof []
'object'
typeof {}
'object'
typeof Math.abs
'function'
typeof undefined
'undefined'

5.1、Date

基本方法

var now = new Date(); //获取当前时间
        now.getFullYear(); //年
        now.getMonth(); //月 0~11
        now.getDate(); //日
        now.getDay(); //星期几
        now.getHours(); //时
        now.getMinutes();//分
        now.getSeconds(); //秒
        now.getTime(); //时间戳  从1970 .1.1  0:00:00 ~ now的毫秒数
        
        //通过时间戳获取时间
        console.log(new Date(now.getTime()));

5.2、JSON

json是一种轻量级的数据交换格式

var user = {
           name : 'zzzzz',
           age : 18,
           gender : '男'
       }
       //对象转化为json字符串
       var jsonUser = JSON.stringify(user);
       //json字符串转化为对象
       var object = JSON.parse(jsonUser);

5.3、Ajax

  • 原生js写法,xhr异步请求
  • jQuery 封装好的方法
  • axios 请求

6、面向对象编程

定义一个类

class User{
    constructor(name){
        this.name = name;
    }
    hello(){
        alert("你好");
    }
}
var mmm = new User('zzzzz');

继承

class webUser extends User{
    constructor(name,password){
        super(name)
        this.password = password;
    }
    display(){
        alert('我是 web用户');
    }
}

7、操作BOM对象

BOM:浏览器对象模型

navigator
navigator 中封装了浏览器的信息
screen
screen 封装了屏幕信息

screen.height
800
screen.width
1280

location
location 代表当前页面的URL信息

host: "www.baidu.com"
hostname: "www.baidu.com"
href: "https://www.baidu.com/?tn=15007414_8_dg"
origin: "https://www.baidu.com"
pathname: "/"
port: ""
protocol: "https:"

location.reload() //重新加载页面
location.assign("url")//设置新的地址

document
document 代表当前页面

document.title
'百度一下,你就知道'

获取具体的文档树节点

var dl = document.getElementById("id");

获取cookie

document.cookie

history
代表浏览器的历史记录

history.back();//后退
history.forward();//前进

8、操作DOM对象

DOM:文档树模型

获取DOM节点

<div id="parent">
    <h1>标题</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>
<script>
    //获取节点
    var h1 = document.getElementsByTagName("h1");
    var p2 = document.getElementsByClassName('p2');
    var p1 = document.getElementById('p1');
    //通过父节点获取所有的子节点
    var div = document.getElementById('parent');
    var divChlidren = div.children;
</script>

更新节点

var p1 = document.getElementById('p1');
p1.innerText = 'new p1' //修改文本值
p1.innerHTML = "<h1> p1 </h1>"; //修改html超文本
//操作js
p1.style.color = 'yellow'; //修改颜色
p1.style.fontSize = '20px' //修改字体大小

删除节点
步骤:

  • 获取父节点
  • 通过父节点删除子节点
var p1 = document.getElementById('p1');
var parent = p1.parentElement; //获取父节点
parent.removeChild(p1);

插入节点

<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 list = document.getElementById('list');
    var js = document.getElementById('js');
    var ee = document.getElementById('ee');
    list.appendChild('js'); //将js追加到div中
    //js创建新的节点
    var newP = document.createElement('p');
    newP.setAttribute('id','newP'); //设置id为newP
    newP.innerText = '我就学python';
    list.appendChild(newP);
    list.insertBefore(newP,ee); //将newP插入到ee前
</script>

9、操作表单

  • 文本框 text
  • 下拉框 select
  • 单选框 radio
  • 多选框 checkbox
  • 隐藏框 hidden
  • 密码框 password

获取表单数据

<from action="post">
        <p>
            <span>用户名</span><input type="text" id="username">
        </p>
        <p>
            <span>性 别</span>
            <input type="radio" id="boy" name="sex" value="man">男
            <input type="radio" id="girl" name="sex" value="women">女
        </p>
    </from>
    <script>
        var input_text = document.getElementById('username');
        var boy_radio = document.getElementById('boy');
        var girl_radio = document.getElementById('girl');

        //获取文本框的值
        input_text.value;
        //修改文本框的值
        input_text.value = '111';
        //单选框——查看返回结果如果选中 true
        boy_radio.checked = true;
    </script>

提交表单

<from action="#" method="post" onsubmit="f()">
        <p>
            <span>用户名</span><input type="text" id="username" name="username">
        </p>
        <p>
            <span>密 码</span><input type="password" id="password" name="password">
        </p>
        <button type="submit" >提交</button>
    </from>
    <script>
        function f() {
            var username = document.getElementById('username');
            var password = document.getElementById('password');
            console.log(username.value);
            console.log(password.value);
            return true;
        }
    </script>

10、jQuery

jQuery 封装了大量JavaScript的函数

导入jQuery

<script src="js_01/lib/jquery-3.6.1.js"></script>

选择器

$('p').click() //标签选择器
$('#id').click() //id选择器
$('.class').click() //class选择器

事件

鼠标事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="lib/jquery-3.6.1.js"></script>
    <style>
        #divMove{
            width:500px;
            height: 500px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
    mouse:<span id="mouseMove"></span>
    <div id="divMove">
        移动鼠标
    </div>
    <script>
        $(function () {
           $('#divMove').mousemove(function (e) {
               $('#mouseMove').text('x:'+e.pageX+'y:'+e.pageY)
           })
        });
    </script>
</body>
</html>