如果是走 java 路线,不管以后是否从事前端工作,js 都是一门必须学会的脚本语言

它相当于是前端静态页面的一个补充,它可以让一个普通的页面在后台执行一些程序,比如我们点击一个按钮,我们可能希望执行某些操作,比如下载文件、页面跳转、页面弹窗、进行登陆等,都可以使用 JavaScript 来帮助我们实现。

# 第一个 js 文件

先创建一个 static.js 文件:

const arr = [0, 2, 1, 5, 9, 3, 4, 6, 7, 8]
for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length - 1; j++) {
        if(arr[j] > arr[j+1]){
            const tmp = arr[j]
            arr[j] = arr[j+1]
            arr[j+1] = tmp
        }
    }
}
window.alert(arr)

然后将它放到 html 的头部,获取 html 页面时就会自动加载:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js章节</title>
    <link rel="icon" href="../static/images/旅行.svg" type="image/x-icon" />
    <script src="../static/js/static.js"></script>
</head>
<body>
    <b>慕青の迷途:https://cecilia.cool</b>
</body>
</html>

然后浏览器进入页面,就能看到弹窗将排好序的数组打印出来了(浏览器会在加载时自动执行 js 文件中编写的内容)。

# 基本语法

定义变量可以使用 let ,也可以使用 var ,IDEA 推荐使用 let ,后者存在缺陷。

基本数据类型:

  • Number:数字类型(包括小数和整数)

  • String:字符串类型(可以使用单引号或是双引号)

  • Boolean:布尔类型(与 Java 一致)

一些特殊值:

  • undefined:未定义 - 变量声明但不赋值默认为 undefined

  • null:空值 - 等同于 Java 中的 null

  • NaN:非数字 - 值不是合法数字

通过 console.info(typeof a) 查看 a 的类型

关系运算符除了正常的,还有全等 === ,不全等 !== ,而且可以关系运算符进行字符串的比较

console.info('10' == 10)  // true
console.info('10' === 10) // false

== 会在两边不是相同类型时,都转为 number 再比较,而全等就不会转换,数据类型不同直接报错。

逻辑运算中,0=false,非 0=true,空串 = false,非空串 = true。 console.info(7 || true) 打印的是 7,因为 7 是 true,然后就不会再去管那个 true 了。

其他的 for,while,switch 都和 java 差不多。

# 函数定义

直接看代码:

function f(a="666") {
    console.info("得到的实参为:"+a)
    return 666
}
f("aa");
// 函数本身也是一种类型,他可以被变量接收,所有函数类型的变量,也可以直接被调用
let k = f;
k();
// 匿名函数赋值给变量
let g = function (str) {
    console.info("实参为:"+str)
}

JS 是动态类型,因此我们不必指明参数 a 的类型,同时也不必指明返回值的类型,一个函数可能返回不同类型的结果,因此直接编写 return 语句即可。同理,我们可以在调用函数时,不传参,那么默认会使用 undefined

但是上面的代码指定了 a 的默认值,不传参就会使用 "666"。

函数作为参数传递:

function f(test) {
    test();
}

f(function () {
    console.info("这是一个匿名函数")
});

// 使用Lambda表达式简化匿名函数
f(() => {
    console.info("可以,不跟你多bb")
});

f(param => {
    console.info("接受到回调参数:"+param)
});

# 数组和对象

更像是 Python 的列表,每个元素不需要同样的类型:

let arr = [1, "lbwnb", false, undefined, NaN]

可以使用 push 和 pop 进行栈操作(弱类型真 tm 牛逼)

let arr = [1, "lbwnb", false, undefined, NaN]
arr.push("bbb")
console.info(arr.pop())
console.info(arr)

对象的使用也很随意:

let obj = {}
obj.name = "伞兵一号"
obj.f = function (){
    console.info("我是对象内部的函数")
}
obj.f()
console.info(obj)

this 关键字指定对象内的属性:

let name = "我是外部变量"
let obj = {
    val: "定义对象时指定成员"
}
obj.name = "我是内部变量"
obj.f = function (){
    console.info("name属性为:"+this.name)
}
// 如果使用 lambda 表达式,那么 this 并不会指向对象

# 事件

事件有很多种类型,其中常用的有:

  • onclick:点击事件

  • oninput:内容输入事件

  • onsubmit:内容提交事件

<input type="password" oninput="console.info('正在输入文本')">

这是直接写事件代码,也可以通过函数调用:

<b onclick="obj.f()">慕青の迷途:https://cecilia.cool</b>

# Document 对象

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model),它将整个页面的所有元素全部映射为 JS 对象,这样我们就可以在 JS 中操纵页面中的元素。

比如想要读取页面中某个输入框中的内容,那么我们就需要从 DOM 中获取此输入框元素的对象:

document.getElementById("pwd").value

举个🌰:

html 代码:

<body>
    <b id="123" onclick="obj.f()">慕青の迷途:https://cecilia.cool</b>
</body>

js 代码:

let obj = {}
obj.name = "伞兵一号"
obj.f = function (){
    console.info(document.getElementById("123"));
}

也可以在事件响应的时候将对象传给函数:

<body>
    <b id="123" onclick="f(this)">慕青の迷途:https://cecilia.cool</b>
</body>

通过 document 对象,还可以动态更改 html 元素的值,当我们从后端接收数据,就可以通过 js 改变前端 html 的元素的值。

这里不方便写后端代码,就简单的例子,点击按键,按键就改变显示的东西:

<button id = "b" onclick="f()">test</button>

js 代码:

function f() {
    document.getElementById("b").innerHTML = "new Name";
}

# XHR 请求

如何与后端进行交互,经典问题就是提交表单,怎么将信息发送过去:

// XMLHttpRequest 对象,来向服务器发送一个 HTTP 请求
function http() {
    let xhr = new XMLHttpRequest();
    xhr.open('GET', 'https://www.baidu.com');
    xhr.send();    
}

然后将该函数绑定到按钮的点击事件上:

<input id="button" type="button" onclick="http()">

我们可以在网络中查看我们发起的 HTTP 请求并且查看请求的响应结果,比如上面的请求,会返回百度这个页面的全部 HTML 代码。

实际上,我们的浏览器在我们输入网址后,也会向对应网站的服务器发起一次 HTTP 的 GET 请求。

在浏览器得到页面响应后,会加载当前页面,如果当前页面还引用了其他资源文件,那么会继续向服务器发起请求,直到页面中所有的资源文件全部加载完成后,才会停止。

之后如何使用 js 拿到后端传过来的数据(一般是 json),然后用这些数据改变前端展示呢?就可以使用 Ajax 请求,只不过是后话

# 参考 + 转载

https://www.yuque.com/qingkongxiaguang/javaweb/iiqwzl#c8971466