JavaScript学习要点 | 青训营笔记

121 阅读12分钟

JavaScript学习要点 | 青训营笔记

这是我参与「第四届青训营」笔记创作活动的第1\color{Violet}这是我参与「第四届青训营 」笔记创作活动的第1天

在进行js的学习中发现:\color{LightCoral}在进行js的学习中发现:
若拥有c++的基础,学习js较易上手,相比较而言,js语法简单,更容易学习, 因而本篇笔记也从js的一些要点作为切入,即与c++相比较不一样的地方所在。

了解javascript\color{DeepPink}|了解javascript

JavaScript 是脚本语言,浏览器会在读取代码时,逐行地执行脚本代码。而对于传统编程来说,会在执行前对所有代码进行编译。

HTML 中的 Javascript 脚本代码必须位于 <script></script> 标签之间。 Javascript 脚本代码可被放置在 HTML 页面的 <body><head> 部分中。

老旧的实例可能会在 <script> 标签中使用 type="text/javascript"。现在已经不必这样做了。JavaScript 是所有现代浏览器以及 HTML5 中的默认脚本语言。

>JavaScript显示数据\color{DeepPink}>JavaScript 显示数据

JavaScript 可以通过不同的方式来输出数据:

  • 使用 window.alert()  弹出警告框。
  • 使用 document.write()  方法将内容写到 HTML 文档中。
  • 使用 innerHTML 写入到 HTML 元素。
  • 使用 console.log()  写入到浏览器的控制台。

>操作HTML元素\color{DeepPink}>操作 HTML 元素

从 JavaScript 访问某个 HTML 元素,可以使用document.getElementById(*id*)方法。 请使用 "id" 属性来标识 HTML 元素,并用 innerHTML 来获取或插入元素内容;
代码如下:

<!DOCTYPE html>
<html>
<body>
<h1>我的第一个 Web 页面</h1>
<p id="demo">我的第一个段落</p>
<script>
document.getElementById("demo").innerHTML = "段落已修改。";
</script>
</body>
</html>

document.getElementById("demo")  是使用 id 属性来查找 HTML 元素的 JavaScript 代码 。

innerHTML = "段落已修改。"  是用于修改元素的 HTML 内容(innerHTML)的 JavaScript 代码。

>JavaScript数据类型\color{DeepPink}>JavaScript 数据类型

JavaScript 有多种数据类型:数字,字符串,数组,对象等等:

var length = 16;                                  // Number 通过数字字面量赋值\
var points = x * 10;                              // Number 通过表达式字面量赋值\
var lastName = "Johnson";                         // String 通过字符串字面量赋值\
var cars = ["Saab", "Volvo", "BMW"];              // Array  通过数组字面量赋值\
var person = {firstName:"John", lastName:"Doe"};  // Object 通过对象字面量赋值

>声明变量类型\color{DeepPink}>声明变量类型

声明新变量时,可以使用关键词 "new" 来声明其类型:

var carname=new String;
var x=      new Number;
var y=      new Boolean;
var cars=   new Array;
var person= new Object;

JavaScript变量均为对象。声明一个变量时,就创建了一个新的对象。\colorbox{pink}{JavaScript变量均为对象。声明一个变量时,就创建了一个新的对象。}

声明一个对象,可以声明其属性与方法,如下例中person对象中申明了fullname()方法。

var person = {
    firstName: "John",
    lastName : "Doe",
    id : 5566,
    fullName : function() 
    {
       return this.firstName + " " + this.lastName;
    }
};

通常 fullName() 是作为 person 对象的一个方法, fullName 是作为一个属性。
如果使用 fullName 属性,不添加 () , 它会返回函数的定义\colorbox{pink}{如果使用 fullName 属性,不添加 () , 它会返回函数的定义}

>varletconst知识点总结\color{DeepPink}>var、let、const知识点总结

  1. 使用var\color{hotpink}var关键字声明的全局作用域变量属于\color{hotpink}属于window对象。
  2. 使用let\color{hotpink}let关键字声明的全局作用域变量不属于\color{hotpink}不属于window对象。
  3. 使用var\color{hotpink}var关键字声明的变量在任何地方都可以修改。
  4. 在相同的作用域或块级作用域中,不能使用let关键字来重置var关键字声明的变量。
  5. 在相同的作用域或块级作用域中,不能使用let关键字来重置let关键字声明的变量。
  6. let关键字在不同作用域,或不用块级作用域中是可以重新声明赋值的。
  7. 在相同的作用域或块级作用域中,不能使用const关键字来重置var和let关键字声明的变量。
  8. 在相同的作用域或块级作用域中,不能使用const关键字来重置const关键字声明的变量。
  9. const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的。
  10. var关键字定义的变量可以先使用后声明。\colorbox{pink}{var关键字定义的变量可以先使用后声明。}
  11. let关键字定义的变量需要先声明再使用。
  12. const关键字定义的常量,声明时必须进行初始化,且初始化后不可再修改。

>常见的HTML事件\color{deeppink}>常见的HTML事件

下面是一些常见的HTML事件的列表:

事件描述
onchangeHTML 元素改变
onclick用户点击 HTML 元素
onmouseover鼠标指针移动到指定的元素上时发生
onmouseout用户从一个 HTML 元素上移开鼠标时发生
onkeydown用户按下键盘按键
onload浏览器已完成页面的加载

>字符串属性\color{deeppink}>字符串属性

属性描述
constructor返回创建字符串属性的函数
length返回字符串的长度
prototype允许您向对象添加属性和方法

  • constructor 属性可用来查看对象是否为数组 (包含字符串"Array")\color{coral}(包含字符串 "Array"):
function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}
  • constructor 属性可用来查看对象是否为日期 (包含字符串"Date")\color{coral}(包含字符串 "Date"):
function isDate(myDate) {
    return myDate.constructor.toString().indexOf("Date") > -1;
}

>Date对象方法\color{deeppink}>Date对象方法

方法描述
getDate()从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay()从 Date 对象返回一周中的某一天 (0 ~ 6)。
getFullYear()从 Date 对象以四位数字返回年份。
getHours()返回 Date 对象的小时 (0 ~ 23)。
getMilliseconds()返回 Date 对象的毫秒(0 ~ 999)。
getMinutes()返回 Date 对象的分钟 (0 ~ 59)。
getMonth()从 Date 对象返回月份 (0 ~ 11)。
getSeconds()返回 Date 对象的秒数 (0 ~ 59)。
getTime()返回 1970 年 1 月 1 日至今的毫秒数。

>字符串方法\color{deeppink}>字符串方法

方法描述
charAt()返回指定索引位置的字符
charCodeAt()返回指定索引位置字符的 Unicode 值
concat()连接两个或多个字符串,返回连接后的字符串
fromCharCode()将 Unicode 转换为字符串
indexOf()返回字符串中检索指定字符第一次出现的位置
lastIndexOf()返回字符串中检索指定字符最后一次出现的位置
localeCompare()用本地特定的顺序来比较两个字符串
match()找到一个或多个正则表达式的匹配
replace()替换与正则表达式匹配的子串
search()检索与正则表达式相匹配的值
slice()提取字符串的片断,并在新的字符串中返回被提取的部分
split()把字符串分割为子字符串数组
substr()从起始索引号提取字符串中指定数目的字符
substring()提取字符串中两个指定的索引号之间的字符
toLocaleLowerCase()根据主机的语言环境把字符串转换为小写,只有几种语言(如土耳其语)具有地方特有的大小写映射
toLocaleUpperCase()根据主机的语言环境把字符串转换为大写,只有几种语言(如土耳其语)具有地方特有的大小写映射
toLowerCase()把字符串转换为小写
toString()返回字符串对象值
toUpperCase()把字符串转换为大写
trim()移除字符串首尾空白
valueOf()返回某个字符串对象的原始值

>对字符串和数字进行加法运算\color{deeppink}>对字符串和数字进行加法运算

两个数字相加,返回数字相加的和,如果数字与字符串相加,返回字符串。\colorbox{pink}{如果数字与字符串相加,返回字符串。}

代码如下:

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>数字与字符串相加</title> 
</head>
<body>

<p>点击按钮创建及增加字符串变量。</p>
<button onclick="myFunction()">点击这里</button>
<p id="demo"></p>
<script>
function myFunction()
{
	var x=5+5;
	var y="5"+5;
	var z="Hello"+5;
	var demoP=document.getElementById("demo");
	demoP.innerHTML=x + "<br>" + y + "<br>" + z;
}
</script>

</body>
</html>

如上的运行结果为x=10;y=55;z=hello5;

=====运算符\color{deeppink} == 与 === 运算符

运算符描述
==等于
===绝对等于(值和类型均相等)
!= 不等于
!== 不绝对等于(值和类型有一个不相等,或两个都不相等)

=== 为绝对相等,即数据类型与值都必须相等。\colorbox{pink}{=== 为绝对相等,即数据类型与值都必须相等。}

>undefinednull\color{deeppink}>undefined与null

1、定义

  • (1)undefined:是所有没有赋值变量的默认值,自动赋值。
  • (2)null:主动释放一个变量引用的对象,表示一个变量不再指向任何对象地址。

2、何时使用null?

当使用完一个比较大的对象时,需要对其进行释放内存时,设置为 null。

3、null 与 undefined 的异同点是什么呢?

共同点:都是原始类型,保存在栈中变量本地。

不同点

(1)undefined——表示变量声明过但并未赋过值。

它是所有未赋值变量默认值,例如:

var a;    // a 自动被赋值为 undefined

(2)null——表示一个变量将来可能指向一个对象。

一般用于主动释放指向对象的引用,例如:

var emps = ['ss','nn'];
emps = null;     // 释放指向数组的引用

>将字符串转换为数字\color{deeppink}>将字符串转换为数字

全局方法 Number()  可以将字符串转换为数字。

字符串包含数字(如 "3.14") 转换为数字 (如 3.14)。

空字符串转换为 0。

其他的字符串会转换为 NaN (不是个数字)。

Number("3.14")    // 返回 3.14
Number(" ")       // 返回 0
Number("")        // 返回 0
Number("99 88")   // 返回 NaN

其余方法如下:

方法描述
parseFloat()解析一个字符串,并返回一个浮点数。
parseInt()解析一个字符串,并返回一个整数。

>一元运算符+\color{deeppink}> 一元运算符 +

Operator + 可用于将变量转换为数字:

var y = "5";      // y 是一个字符串
var x = + y;      // x 是一个数字

如果变量不能转换,它仍然会是一个数字,但值为 NaN (不是一个数字):

var y = "John";   // y 是一个字符串\
var x = + y;      // x 是一个数字 (NaN)

>正则表达式\color{deeppink} >正则表达式

  • 正则表达式是由一个字符序列形成的搜索模式。
  • 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
  • 正则表达式可以是一个简单的字符,或一个更复杂的模式。
  • 正则表达式可用于所有文本搜索和文本替换的操作。

语法

/正则表达式主体/修饰符(可选)

其中修饰符是可选的。

正则表达式修饰符

修饰符可以在全局搜索中不区分大小写\color{Tomato}修饰符可以在全局搜索中不区分大小写:

修饰符描述
i执行对大小写不敏感的匹配。
g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m执行多行匹配。

正则表达式模式

方括号用于查找某个范围内的字符:

表达式描述
[abc]查找方括号之间的任何字符。
[0-9]查找任何从 0 至 9 的数字。
(x|y)查找任何以 | 分隔的选项。

元字符是拥有特殊含义的字符:

元字符描述
\d查找数字。
\s查找空白字符。
\b匹配单词边界。
\uxxxx查找以十六进制数 xxxx 规定的 Unicode 字符。

量词:

量词描述
n+匹配任何包含至少一个 n 的字符串。
n*匹配任何包含零个或多个 n 的字符串。
n?匹配任何包含零个或一个 n 的字符串。

使用字符串方法

在 JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。

  • search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
var str = "Visit Runoob!"; 
var n = str.search(/Runoob/i);

/runoob/i  是一个正则表达式。

runoob  是一个正则表达式主体 (用于检索)。

i  是一个修饰符 (搜索不区分大小写)。

  • replace() 方法用于在字符串中用一些字符串替换另一些字符串,或替换一个与正则表达式匹配的子串。

>浮点型数据使用注意事项\color{deeppink} >浮点型数据使用注意事项

JavaScript 中的所有数据都是以 64 位浮点型数据(float)  来存储。

所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定:

var x = 0.1;
var y = 0.2;
var z = x + y            // z 的结果为 0.30000000000000004\
if (z == 0.3)            // 返回 false

为解决以上问题,可以用整数的乘除法来解决:

var z = (x * 10 + y * 10) / 10;       // z 的结果为 0.3

>JavaScript表单验证\color{#ff6a6a} >JavaScript 表单验证

JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证。

表单数据经常需要使用 JavaScript 来验证其正确性:

  • 验证表单数据是否为空?
  • 验证输入是否是一个正确的email地址?
  • 验证日期是否输入正确?
  • 验证表单输入内容是否为数字型?

>必填(或必选)项目\color{#ff6a6a} >必填(或必选)项目

下面的函数用来检查用户是否已填写表单中的必填(或必选)项目。假如必填或必选项为空,那么警告框会弹出,并且函数的返回值为 false,否则函数的返回值则为 true(意味着数据没有问题):

function validateForm() 
{ 
    var x=document.forms["myForm"]["fname"].value; 
    if (x==null || x=="") 
    { 
        alert("姓必须填写"); 
        return false; 
    } 
}

以上函数在 form 表单提交时被调用:

代码\colorbox{#ff6a6a} {代码}

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>表单验证</title>
</head>
<head>
<script>
function validateForm(){
var x=document.forms["myForm"]["fname"].value;
if (x==null || x==""){
  alert("姓必须填写");
  return false;
  }
}
</script>
</head>
<body>
	
<form name="myForm" action="demo-form.php" onsubmit="return validateForm()" method="post">
姓: <input type="text" name="fname">
<input type="submit" value="提交">
</form>
	
</body>
</html>

>Email验证\color{#ff6a6a} >E-mail 验证

下面的函数检查输入的数据是否符合电子邮件地址的基本语法。

意思就是说,输入的数据必须包含 @ 符号和点号(.)。同时,@ 不可以是邮件地址的首字符,并且 @ 之后需有至少一个点号:

function validateForm()
{ 
    var x=document.forms["myForm"]["email"].value; 
    var atpos=x.indexOf("@"); 
    var dotpos=x.lastIndexOf("."); 
    if (atpos<1 || dotpos<atpos+2 || dotpos+2>=x.length)
    { 
        alert("不是一个有效的 e-mail 地址"); 
        return false; 
    } 
}

下面是连同 HTML 表单的完整代码: \colorbox{#ff6a6a} {下面是连同 HTML 表单的完整代码: }

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>表单验证</title>
</head>
<head>
<script>
function validateForm(){
	var x=document.forms["myForm"]["email"].value;
	var atpos=x.indexOf("@");
	var dotpos=x.lastIndexOf(".");
	if (atpos<1 || dotpos<atpos+2 || dotpos+2>=x.length){
		alert("不是一个有效的 e-mail 地址");
  		return false;
	}
}
</script>
</head>
<body>
	
<form name="myForm" action="demo-form.php" onsubmit="return validateForm();" method="post">
Email: <input type="text" name="email">
<input type="submit" value="提交">
</form>
	
</body>
</html>

>Form提供的两种数据传输方式——getpost\color{#ff6a6a} >Form提供的两种数据传输方式——get和post

Form提供了两种数据传输的方式——get和post。虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响。虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但是了解二者的差异在以后的编程也会很有帮助的。
Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。二者主要区别如下:
1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。
4、Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。
5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
6、Get是Form的默认方法。
7、使用Post传输的数据,可以通过设置编码的方式正确转化中文;而Get传输的数据却没有变化。

href="#"与href="javascript:void(0)"的区别

#  包含了一个位置信息,默认的锚是 #top 也就是网页的上端。

javascript:void(0), 仅仅表示一个死链接。

在页面很长的时候会使用  #  来定位页面的具体位置,格式为: # + id

如果你要定义一个死链接请使用 javascript:void(0)

!易错点总结\color{DeepPink}!易错点总结

1、在标签中填写 onclick 事件调用函数时,不是 onclick=函数名, 而是 onclick=函数名+()\colorbox{Pink}{onclick=函数名+()},代码如下:

<script> 
function myfunction(){
    document.getElementById("demo").innerHTML="onclick事件触发";
}
</script>
</head>
<body>
    <h1 id="demo">一个段落</h1>
    <button onclick="myfunction()" type="button">点击这里</button>
</body>

2、外部 javascript 文件不使用 <script> 标签,直接写 javascript 代码。

3、HTML 输出流中使用 document.write,相当于添加在原有html代码中添加一串html代码。而如果在文档加载后使用(如使用函数),会覆盖整个文档\colorbox{pink}{而如果在文档加载后使用(如使用函数),会覆盖整个文档}

使用函数来执行document.write代码如下:

<script>
function myfunction(){
    document.write("使用函数来执行document.write,即在文档加载后再执行这个操作,会实现文档覆盖");
}
document.write("<h1>这是一个标题</h1>");
document.write("<p>这是一个段落。</p>");
</script>
<p>
您只能在 HTML 输出流中使用 <strong>document.write</strong>。
如果您在文档已加载后使用它(比如在函数中),会覆盖整个文档。
</p>
<button type="button" onclick="myfunction()">点击这里</button>

总结\color{skyblue}**总结**

js的语法相对较为简单,学过c或者c++之后,上手js便较为简单;但js的语法不如c或者c++的语法严谨,例如在c语言中,字符串与数字相加是不允许的,但在js中可进行相加,且相加后为字符串。虽然通过阅读相关语法文档掌握了js的基本使用,后续仍需要通过实践项目进行实践能力的锻炼。