学习 JavaScript 内容!
与使用加载 css 文件类似,在 HTML 页面中的任意想要执行 js 代码的位置加上<script type="module"></script>标签即可
引入 js 代码的方式
<script type="module"> 中的 type=“module” 的作用:会严格限制每个变量等在应有的作用域内,不会对作用域外其它部分 js 代码产生影响。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 方式1 -->
<script type="module">
let x = 3;
console.log(x);
</script>
</body>
</html>
js 代码,然后在页面任意位置引入 js文件即可。// /static/js/index.js文件中的内容为
console.log("Hello World")
<!-- <script type="module"></script>中的内容为: -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 方式2 -->
<script type="module" src="/js课/static/js/index.js"></script>
</body>
</html>
import 关键字引入到当前作用域(只希望用到 js 文件中的某些变量或函数)export 将其它文件可以调用的变量、函数、类等暴露出来。import 将 js 文件里暴露出来的内容引入到当前作用域。// /static/js/index.js文件中的内容为
let name = "yjx";
let age = 18
function print() {
console.log("My name is " + name);
}
export {
name,
print
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="module">
import { name, print } from "/js课/static/js/index.js";
console.log(name);
print();
</script>
</body>
</html>
js 与 C++ 和 Java 不同的地方在于 C++ 和 Java 执行从主函数的入口开始执行,而 js 代码没有明确的执行入口,按照在页面中从上到下的顺序依次执行与渲染 html 和 css 的顺序一样。css 可以操控 html,反之不行。js 可以操控 css 和 html。js 可以改变 html 的结构,在 html 里面随意添加和删除标签和内容,也可以通过 js 改变 css 对应样式。
变量的声明与定义
let a;let x = 3, name = "yjx";const y = 6;变量类型动态变化:let 定义变量时,不用申明类型,js 中的变量类型是动态的。
let name = "yjx", x = 6;
let d = {
name: "yjx",
age: 20,
}
基本数据类型
js 中不管是整数还是浮点数统一为 number 类型'' 和双引号 ""substr 函数,使用方法同 C++true,false引用数据类型
引用数据类型解释
object:对象,类似于C++中的指针
map 和 python 中的 字典let d = { name = "yjx", age = "18", };,关键字字符串可以加 "" 也可以不加d["name"] = 'lj'; 或 d['name'] = 'lj';d.name = "lj";d["school"] = "pku"; 或者 d.school = "pku";delete d.school;console.log(b);null 也是一个 object 类型undefined 未定义的变量类型,例如:let x;** 表示乘方=== 等于,!== ,会同时判断变量的类型和数值let fs = require('fs');
let buf = '';
// 当输入缓冲区内有内容时会执行下面的函数
process.stdin.on('readable', function() {
// 如果有输入从缓冲区中将内容读进来,将内容放到 buf 里
let chunk = process.stdin.read();
if (chunk) buf += chunk.toString();
});
// 当输入缓冲区内没有内容时(输入完成)会执行下面的函数
process.stdin.on('end', function() {
buf.split('\n').forEach(function(line) {
// 对于一行的输入内容用空格将其隔开,每一个数转换成整数放到 tokens 里。
let tokens = line.split(' ').map(function(x) { return parseInt(x); });
if (tokens.length != 2) return;
console.log(tokens.reduce(function(a, b) { return a + b; }));
});
});
与 C++ 的使用类似
for (let i = 0; i < 10; i++) {
console.log(i);
}
for-in 循环,可以枚举数组中的下标,以及对象中的 keyfor-of 循环,可以枚举数组中的值,以及对象中的 valuevalue 可以是变量、数组、对象、函数等。person.name;,对象函数的调用:person.add_money();person["name"];,对象函数的调用:person["add_money"]();// 方式1
let person = new Object();
person.name = "yjx";
person.age = 18;
console.log(person);
// 方式2
let person = {
name: "yjx",
age: 18
};
console.log(person);
let person = {
name: 'yjx',
age: 18,
money: 0,
friends: ['Bob', 'Alice', 'Lucy'], // 值为数组
clothes: {
color: "red",
price: 20,
},
// 值为函数。如果一个函数作为一个对象的属性保存,那么我们称这个函数是这个对象的方法,
// 调用这个函数就说调用对象的方法(method)。方法和函数只是名称上的区别,没有其它别的区别
add_money: function (x) {
this.money += x; // 函数定义中的this用来引用该函数的“拥有者”。
},
};
function main() {
// 调用方式 1
console.log(person.money);
person.add_money(10); // ():执行函数
console.log(person.money);
// 调用方式 2
console.log(person["money"]);
person["add_money"](10);
console.log(person["money"]);
}
export {
main
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="module">
import { main } from "/js课/static/js/index.js";
main();
</script>
</body>
</html>
let a = [1, 2, "yjx", [3, 4, 5]];
let b = []; // 空数组
let c = [
1, // 变量
"yjx", // 变量
['a', 'b', 3], // 数组
function () { // 函数
console.log("Hello World");
},
{ name: "yxc", age: 18 } // 对象
];
c[0];,c[0] = 2; 没有数组下标越界的概念。length:返回数组长度,注意不要加 ()push():向数组末尾添加元素pop():删除数组末尾元素splice(a, b):删除下标从 a 开始的 b 个数sort():将数组从小到大排序
let main = { a.sort(function(a, b)) { return b - a; });// 第一种方式,function 为函数修饰符
function add (a, b) {
return a + b;
};
js 中的函数名就是一个一般的变量名,可随便赋值。js 中函数和变量没有区别// 第二种方式:js 中的函数名就是一个一般的变量名,可随便赋值
let add = function (a, b) {
return a + b;
}
let a = 3;
function 换成 =>let add = (a, b) => {
return a + b;
}
// 函数声明
let add = (a, b) => {
return a + b;
}
// 函数调用
add();
如果没有 return,返回 undefined。

new 关键字来调用。this 来引用新建的对象当以函数的形式调用时,this是window
当以方法的形式调用时,哪个对象调用方法, this 就是哪个对象
当以构造函数的形式调用时,this 就是新创建的那个对象
//创建一个全局变量name
var name = "全局变量name";
//创建一个函数
function fun() {
console.log(this.name);
}
//创建一个对象
var obj = {
name: "孙悟空",
sayName: fun
};
//我们希望调用obj.sayName()时可以输出obj的名字而不是全局变量name的名字
obj.sayName();
继承用于实现一些比较类似的但又不是完全类似的东西
class Point {
constructor(x, y) { // 构造函数
this.x = x; // 成员变量,this 指当前类的实例
this.y = y;
}
toString() { // 成员函数
return `(${this.x}, ${this.y})`;
}
}
class ColorPoint extends Point { // 类的命名一般用驼峰命名:每个单词的首字母大写
constructor(x, y, color) {
super(x, y); // super()指父类的构造函数,先初始化父类的构造函数
this.color = color; // this 一定要在 super 后调用
}
toString() {
return `${this.color} ${super.toString()}`;// super指父类的实例
}
}
let main = function () {
let p = new ColorPoint(3, 4, 'red');
console.log(p.toString()); //当子类和父类的成员函数名称相同时,调用时当前的子类的成员函数会将父类的成员函数覆盖掉,类似于C++中多态
}
export {
main
}
class Point {
constructor(x, y) { // 构造函数
this.x = x; // this 指当前实例
this.y = y;
}
toString() {
return `(${this.x}, ${this.y})`;
}
static print_class_name() { // 静态成员函数
console.log('Ponit');
}
}
let main = function () {
let p = new ColorPoint(3, 4); // 初始化实例时不会将静态成员变量和函数初始化,只会将非静态成员变量和函数初始化
Point.print_class_name(); // 通过类名来访问静态成员函数
}
class Point {
constructor(x, y) { // 成员函数
this.x = x; // this 指当前实例
this.y = y;
Point.cnt++; // 静态变量通过类名来访问
}
toString() {
return `(${this.x}, ${this.y})`;
}
static print_class_name() { // 静态成员函数
console.log('Ponit');
}
}
Point.cnt = 0;
let main = function () {
for (let i = 0; i < 3; i++) {
new Point(3, 4); // 每次调用构造函数都会让静态变量 cnt ++
}
console.log(Point.cnt); // 输出为 3
}
export {
main
}
keydown:按下某个键就会触发,长按会连续触发,所有键都可以识别到keyup:某个按键是否被释放keypress:与 keydown 的实现功能类似,但 keypress 按下字符键时才会触发,按下功能键不触发作用:更方便的操作 html 和 css
示例:选取标签
// 原生 js 写法
let main = function () {
let div = document.querySelector('div');
console.log(div);
}
export {
main
}
// jQuery 写法
let main = function () {
let $div = $('div'); // jQuery 选取的标签一般会加一个$,可加可不加
console.log($div);
}
$(selector),可以将 $() 看成是一个函数;selector 是一个参数,类型是字符串。选择时候与 css 选择器写法类似,例如:$('div'); // 选取所有div
$('#big-div'); // 选取所有 id 为 big-div 的标签
$('.big-div'); // 选取所有 class 为 big-div 的标签
$('div > p')
let main = function () {
let $div = $('div');
// 方式 1
$div.on("click", function () {
console.log('click div');
})
// 方式 2
$div.click(function () {
console.log('click div');
})
}
export {
main
}
$(selector).off(event, func)click.name 来区分return fasleajax 的优势:在不刷新页面的情况下只从服务器端获取某些数据
GET 方法:从服务器端获取数据
$.ajax({
url: url, // url 写后端的链接
type: "GET",
data: { // 写向后端中传的各种参数
},
dataType: "json",
success: function (resp) { // 当后端成功返回内容后,从resp众解析出来内容
},
});
POST 方法:将表单数据传给服务器端
$.ajax({
url: url,
type: "POST",
data: {
},
dataType: "json",
success: function (resp) {
},
});
此函数经常用于显示动画效果
浏览器每秒会刷新 60 次,requestAnimationFrame(func),func 会在下次浏览器刷新页面之前执行一次,通常会用递归写法使其每秒执行 60 次 func 函数。
let main = function() {
// 调用时会传入一个参数 timestamp,表示函数调用的时刻(每帧页面刷新的时刻),单位为 ms
let step = (timestamp)=> {
$('div').width($('div').width + 1);
requestAnimationFrame(step);
}
}
requestAnimationFrame(step);
let map = new Map() {
}
操作(增删改查)
map.set(key, value); 插入键值对,如果 key 已存在,则会覆盖原有的 value
get(key); 查找关键字,如果不存在,返回 undefined
size; 返回键值对数量
has(key); 返回是否包含关键字 key
delete(key):删除关键字 key
clear():删除所有元素
C++ 中的 set,相对于 map 来说,set 只存 key,当哈希表,用于判重let set = new Set() {
}
操作(增删改查)
add(); 添加元素
has(); 返回是否包含某个元素
size(); 返回元素数量
delete(); 删除某个元素
clear(); 删除所有元素
在用户的浏览器中存键值对
很多函数只能传字符串,但是很多内容用字符串存并不方便,一般用 MAP 存比较方便
JSON.parse():将字符串解析成对象
JSON.stringify():将对象转化为字符串
let main = function () {
let obj = {
name: "yjx",
age: 18,
};
let str = JSON.stringify(obj);
let new_obj = JSON.parse(str);
}
export {
main
}
ajax 协议:例如 http,前端(client 端)向后端发送一个请求,后端(server 端)接受到之后再向前端返回一个请求,完成之后就结束,后端没有办法向前端主动发送请求。
websocket:例如:聊天工具,需要后端主动向前端发送请求,是一种全双工通信(两边都可以主动发送请求)
作用:画布,高效简介地实现在浏览器中画
学习 canvas 的方法:知道每个是干什么的即可,现用现查!
fill开头的函数:填充
stroke开头的函数:画边框
画路线:直线,圆等。步骤是跟正常画画一样,一步一步画