20. JavaScript

172 阅读4分钟

应项目的需求,我需要调用MediaPipe的face_mesh接口,然后实现我们要做的牙齿2D贴图项目。我是用Python写的脚本,目前需要转成JS语言。在这种情况下,我不得不重新再过一遍JS!

JS 显示

  • window.alert() 写入警告框
  • document.write() 写入HTML输入
  • innerHTML 写入HTML元素
  • console.log() 写入浏览器控制台

JS 变量

ES6不再建议使用 var 定义变量,而使用 let 定义变量,使用 const 定义常量。

  • let 定义的变量可以修改,不可重复定义。
  • var 定义的常量不可修改,不可重复定义。

JS 数据类型

  • 数字类型:var length = 7;
  • 字符串类型:var lastName = "Gates";
  • 数组类型:var cars = ["Porsche", "Volvo", "BMW"];
  • 对象类型:var x = {firstName:"Bill", lastName:"Gates"};
  • 空、Undefined、Null类型:var person; var car=""; var person=null;

JS 事件

HTML 事件是发生在 HTML 元素上的“事情”。

常见 HTML 事件:

  • onchange:HTML 元素已被改变。
  • onclick:用户点击了 HTML 元素。
  • onmouseover/onmouseout:用户把鼠标移到/移开 HTML 元素上。
  • onkeydown:用户按下键盘按键。
  • onload:浏览器已经完成页面加载。

更多 HTML DOM 事件,请点击。

使用事件的方式:

  • document 改变 id='demo' 元素的内容
<body>
	<p id="demo"></p>
	<button onclick="document.getElementById('demo').innerHTML=Date()">现在是几点?</button>
</body>
  • this 改变自身元素的内容
<body>
	<p id="demo"></p>
	<button onclick="this.innerHTML=Date()">现在是几点?</button>
</body>
  • 调用函数
<body>
	<p id="demo"></p>
	<button onclick='myData()'>现在是几点?</button>
	<script src="myScript.js"></script>
</body>

myScript.js:

function myData(){
	document.getElementById("demo").innerHTML=Date()
}

JS For 循环

  • for 循环
for(i = 0; i < cars.length; i++){
    text += cars[i] + "<br>"
}
  • for in 循环

数组:for in 遍历索引

对象:for in 能遍历对象

const person = {fname:"Bill", lname:"Gates", age:19}
for(let x in person){
    txt += person[x]
}
  • for of 循环

数组:for of 遍历值

对象:for of 只能遍历带接口的对象,如 Set,Map,String,Array

const cars = ["BMW", "Volvo", "Mini"]
let text = ""
for(let x of cars){
    text += x
}

JS 函数

  • JS 的普通函数
function add(a,b){
	return a+b;
}
  • JS 的箭头函数
add = (a,b) => a+b;

注:

带箭头的函数,只有1个参数可省略参数括号:

hello = (val) => "hello" + val;

hello = val => "hello" + val;

无参数:

hello = () => "Hello World!";
  • 调用:
const res = add(5,6);
//如果函数调用,没有返回值,则res为undefine

JS 类

class 关键字来创建一个类,类体在一对大括号中,打括号中定义类成员的位置,比如方法或构造函数。每个类中包含一个特殊的方法 constructor(),它是类的构造函数,这种方法用于创建和初始化一个由 class 创建的对象。

创建一个类的语法格式如下:

class ClassName{
 constructor(){...}
}

实例:

class robot{
 constructor(name, url){
  this.name = name;
 }
}

调用:创建对象时会自动调用构造方法。

let r1 = new robot("Lily")

JS 对象

  • JS中除了原始值(没有属性和方法的值),其余的都是对象。

  • 原始数据类型指的是拥有原始值的数据: string、number、boolean、null、undefined

对象声明

对象由属性和方法组成。

  • 法 1:
let 对象名 = {
 属性名 :属性值,
 方法名 : 函数
}
  • 法 2:
let 对象名 = new Object()

对象属性使用

对象名.属性名

  • 改/增

对象名.属性名 = 新值

对象名['属性名'] = 新值

  • 删:

delete 对象名.属性

对象方法使用

  • 查:

对象名.方法名()

  • 改/增:

在对象外部

对象名.方法名 = 函数

遍历对象

JS 的 Set、Map

  • 普通对象
obj = ['one', 'two', 'three']

for (let k in obj){
 console(obj[k])
 // 对于键值对的对象,这种方式拿到的是值
 // 不能用 obj.k 是因为 k 是一个字符串
}
  • Set 对象

创建 Set:

const letters = new Set(['a', 'b', 'c'])

增加元素:

letter.add('d')

遍历 Set:

<script>
    letters = new Set(['a', 'b', 'c'])
    let text = "";
    letters.forEach(function(value){
     text += value;
    })

    console.log(text) // abc
</script>
  • Map 对象

创建 Map:

const fruits =new Map([
 ["apples", 500],
 ["bananas", 300],
 ["oranges", 200]
])

增加元素:

// 创建一个 Map
const fruits = new Map();

// 设置 Map 的值
fruits.set("apples", 500);
fruits.set("bananas", 300);
fruits.set("oranges", 200);

得到元素:

fruits.get("apples");

遍历 Map:

<script>
    let text = "";
    fruits.forEach(function(key, value){
     text += key + ':' + value;
    })

    console.log(text) // abc
</script>

JS 模块

模块仅适用于 HTTP(s) 协议,通过 file:// 协议打开的网页无法使用导入/导出。

JS 模块允许您将代码分解成单独的文件,当需要使用的时候,可以使用 import 语句从外部文件导入的。

message.js:

const message = () => {
const name = "Bill";
const age = 19;
return name + ' is ' + age + 'years old.';
};

export default message;

从 message.js 中导入:

<script type="module">
import message from "./message.js"
</script>

JS JSON

JSON 指的是 JavaScript Object Notation

{
"employees":[
    {"firstName":"Bill", "lastName":"Gates"}, 
    {"firstName":"Steve", "lastName":"Jobs"},
    {"firstName":"Alan", "lastName":"Turing"}
]
}

JSON 语法规则

  • 数据是键值对
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

JSON 文本转 JS 对象

var obj = JSON.parse(text);

什么是 this?

在 JavaScript 中,this 关键字引用对象

引用哪个对象取决于调用(使用或调用)的方式。

根据其使用方式,关键字 this 引用不同的对象:

  • 在对象方法中,this 引用该对象
  • 单独使用时,this 引用全局对象
  • 在函数中,this 引用全局对象
  • 在函数中,在严格模式下,thisundefined
  • 在事件中,this 引用接收事件的元素
  • call()、apply() 和 bind() 等方法可以将 this 引用到任何对象

注意:this 不是变量。它是一个关键字。您无法修改 this 的值。