【九层之台】Web开发教程:4. JS

2024-03-18 22:30
文章标签 教程 开发 web js 九层 之台

本文主要是介绍【九层之台】Web开发教程:4. JS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JS

目录

  • 4. JS
    • 开始之前
    • 控制台
    • 页面引入
    • 对象
    • 控制结构
      • 分支结构
      • 循环结构
    • 函数
    • 异步
    • 操作浏览器
      • URL
      • 存储
      • DOM操作
    • JS库

4. JS

开始之前

在正式开始JS的学习之前,我希望各位能够通过具体的实践对前几章的应用进行一次复习。从理论上讲,使用HTML和CSS技术已经可以做出任何想做的精美的网页了。你可以尝试给自己做一个好看的个人主页,或者去“临摹”一些做的比较好看的网页。当你对构建一个网页有了一定的自信以后,就可以进入本章的学习了。

JS是Javascript的缩写,是一门脚本编程语言,也是传说中“属于Web时代的语言”。我们通过HTML和CSS代码做出的网页,跟“应用”两个字是不沾边的,它只是一个显示信息的网站而已。如何把网页变成网页应用呢,这就需要JS这门正经的编程语言出场了。

本章的内容可能对完全没有编程基础的同学有些困难,毕竟JS是一门真正的编程语言,我也不会从零基础的编程入门开始讲解。如果有不懂的,可以多多尝试或者寻求网上编程入门教程的帮助,也可以看一看W3School和菜鸟教程上关于JS的教程。

如今,JS代码可以作用于几乎所有地方,但本章所讲的JS仅仅是JS在浏览器上的冰山一角,也仅仅是把大家带进JS庞大的生态系统之中而已。我不是很推荐大家去学习纯净的原生JS,因为本教程后面的章节会讲很多关于网页应用的更先进的JS库,所以本章只是带大家简单了解以下JS的基本语法。

控制台

打开浏览器的调试控制台,在元素控制台标签的右侧,点击控制台标签,就可以看到我们浏览器的脚本控制台了。

试一试,输入这行代码并敲击回车键:

console.log("Hello!");

在JS的代码中,console.log()函数用于输出内容到控制台。就网页来说,想要显示信息还有以下两种方法:

document.write("Hello");
alert("Hello");

第一个是在网页页面上打印文字,第二个是弹框。

在网页JS代码的调试过程中,我们通常使用输出到控制台的方式来了解脚本运行当中的一些过程数据。控制台可以自动组织各种对象、数组的显示形式,非常方便。

页面引入

在HTML代码中,可以通过script元素直接写入JS代码。它可以出现在body元素的任何位置。你可以尝试在body元素中插入以下代码:

<script>alert("JS is here!");
</script>

但是,这样做通常会影响HTML代码的整洁,因此,我们可以在index.html文件旁边新建文件index.js并写入alert("here!");
然后在body元素中写入

<script type="text/javascript" src="./index.js"></script> 

就可以引入外部的JS文件啦!

对象

在JS中,所有数据内容都是“对象”,包括函数、变量等。最基础的对象形如:

{key: "value",key2: 100
}

对象内部包含若干个不重名的变量名,对应有各种类型的值。注意,JS是一种弱类型语言,对于数字、字符串等类型可以自动转换。对象内的值也可以是另一个对象,因此对象可以嵌套。

在声明变量的时候,我们可以用var或者let,它们之间有一些差异,请自行学习。在声明常量的时候,我们可以使用const关键字。例如:

let myObject = {key: "value"
}

注意到,变量名myObject使用驼峰命名法(除了第一个单词以外,各个单词首字母大写)。

通过.来访问对象的成员,例如myObject.key的值就是value

还有一个特殊的对象:数组。数组中的数据包含在中括号中,并且通过下标引用。例如:

let myArray = ["value1", "value2", 100];
console.log(myArray[0]);
console.log(myArray);

在对象内,this指代的是对象本身。通过this可以在对象内访问对象的其他变量和函数。

各位可以在控制台上摸索一下。

控制结构

对于一门编程语言,核心就在控制结构上。我们主要用到下面几种控制结构。

分支结构

C/C++一样,使用ifelse结构,例如:

if (12 > 10) {console.log("12 > 10");
} else {console.log("12 <= 10");
}

注意,在条件表达式里面,不同类型的变量会自动转换类型比较。如果要强制全等(包括类型),需要使用===运算符。

循环结构

C/C++一样,使用for,例如:

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

同时,在JS中,循环语句还可以遍历数组和对象。有以下两种使用方式:

  • for (let i in a)在循环内部,变量i遍历对象a的所有键(key)。对于数组来说,变量i遍历数组a的所有下标。
  • for (let i of a)在循环内部,变量i遍历对象a的所有值(value)。对于数组来说,就是遍历数组中所有的值。

例子:

let myArray = ["value1", "value2", 100];
for (let i of myArray) {console.log(i);
}

函数

通常来说,JS的函数定义使用function关键字:

function myFunction(p1, p2) {console.log(p1 + p2);
}

请注意,函数的参数表不需要声明变量类型。

这种函数定义方法等效于把函数赋值给一个变量(因为函数也是对象):

let myFunction = function(p1, p2) {console.log(p1 + p2);
}

JS还支持一种特殊的函数定义方法,使用=>的箭头函数:

(p1, p2) => {console.log(p1 + p2);
}

箭头函数的特点是,在函数内部this指向的是函数定义的时候所指向的this,而不是函数调用的时候的this

异步

(这部分比较复杂)

JS最大的特性就是它的异步处理了。所谓异步,是指逻辑处理并不排成一条线,而是多个任务同时处理。例如,一个函数在等待网络请求响应的时候,其他函数还能够正常工作。但是,如何去调度异步逻辑呢?比方说,如果网络请求被响应了,需要进入下一步了,怎么引导脚本语言进入下一个函数呢?

JS大致有三种异步处理方法,按照出现时间排序是:

  • callback回调,即给需要等待结果的函数传入下一步的函数作为callback参数,当等待完成以后,调用这个callback函数。问题:很多个函数回调会导致“回调地狱”,代码会变得极其复杂,很难开发和维护。
  • promise结构,是JS标准ES6提出的新的解决方案。通过.then()调用下一个函数和.catch()处理错误的方式控制逻辑链。(如果想要深入学习请自行百度)
  • async/await结构,是JS标准ES7提出的最新的异步解决方案,它对promise结构进行了封装。对于需要控制异步逻辑的函数,在function前面加一个关键字async,即可在函数内部使用await关键字等待另一个函数的返回。

举个例子:

async function goodFunction() {await someFunction();await otherFunction();console.log("All done");
}

在这个例子中,如果someFunctionotherFunction都是需要等待的函数,则会等待它们完成以后,才会输出All done到控制台。如果不使用async/await结构,则会让两个需要等待的函数同时运行,同时执行输出语句到控制台。

操作浏览器

URL

可以通过设置变量window.location.href来设置当前访问的URL,从而实现跳转。当然也可以通过这个变量来获取当前访问的URL。

存储

浏览器提供多种存储方式,都可以在浏览器控制台的应用标签上查看:

  • 内存:直接创建和操作变量。
  • sessionStorage,页面关闭就会被清除的临时存储,只能存储字符串,可以通过直接操作window.sessionStorage对象的方式读写,也有几个操作函数。
  • localStorage,页面关闭也不会清除的缓存,只能存储字符串,可以通过直接操作window.localStorage对象的方式读写。也有操作函数。
  • indexedDB,储存在浏览器上的数据库,使用方法非常复杂,这里不做介绍了。

例子:

window.localStorage["key"] = "value";
console.log(window.localStorage["key"]);
// create a reference
let SS = window.sessionStorage;
SS["key"] = "another value";
console.log(SS["key"]);
SS.removeItem("key"); // remove

DOM操作

原生JS实现交互的原理是,通过操作document对象来操作网页的DOM,从而控制网页的显示内容。例如通过document.getElementById()函数来选定具有特定id属性的HTML元素进行操作。

原生JS对网页的操作比较繁琐,本篇教程不予介绍。

JS库

终于到了激动人心的时刻了。鉴于JS操作DOM的繁琐和复杂,在Web发展的这么多年里,有一大批对原生JS进行封装,从而方便我们使用JS实现网页交互的JS库,例如著名的Jquery,就是一个比较轻量级的JS库,通过利用与CSS选择器一样的语法操作网页上的元素。你可以自行学习它们的使用方法。

对于一些比较大型的网页,我们通常会使用一些比较体系化的前端JS框架。JS框架往往从根本上改变了代码的运行原理,可以说是在原生JS上添加了一层逻辑,让你可以通过比较简单的方式实现多样化的交互。当下流行的前端JS框架有:

  • Angularjs
  • Reactjs
  • Vuejs

本篇教程将循着笔者的技术栈,向大家介绍Vuejs的使用方法。

这篇关于【九层之台】Web开发教程:4. JS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/823875

相关文章

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服