JavaScript | 青训营笔记

188 阅读17分钟

JavaScript 1

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天 JavaScript 是 web 开发者必学的三种语言之一:

  • HTML 定义网页的内容
  • CSS 规定网页的布局
  • JavaScript 对网页行为进行编程

改变html内容

“查找” id="demo" 的 HTML 元素,并把元素内容(innerHTML)更改为 "Hello JavaScript":

document.getElementById("demo").innerHTML = "Hello JavaScript";

改变html属性

< button onclick="document.getElementById('myImage').src='/i/eg_bulbon.gif'">开灯< /button>

每一个元素都有一个id,比如

<img id="xx">

getelementbyid('xx').src就可以改变图片

当然也可以.style 来去对某个id的元素改变属性

隐藏HTML元素

可通过改变display样式来隐藏html元素

document.getElementById("demo").style.display="none";

再来显示:

document.getElementById("demo").style.display="block";

script标签

在 HTML 中,JavaScript 代码必须位于 <script></script> 标签之间。

JavaScript函数可以被放置在页面的head部分,点击按钮时调用这个函数

<script>
function myFunction() {
    document.getElementById("demo").innerHTML = "段落被更改。";
}
</script>
<button type="button" onclick="myFunction()">试一试</button>

当然也可以放在body部分

提示: 把脚本置于 <body> 元素的底部,可改善显示速度,因为脚本编译会拖慢显示。

外部脚本

<script src="myScript.js"></script>

可以在head或body中放置外部脚本引用

该脚本的表现与它被置于 <script> 标签中是一样的。

注释: 外部脚本不能包含 <script> 标签。

在外部文件中放置脚本有如下优势:

  • 分离了 HTML 和代码
  • 使 HTML 和 JavaScript 更易于阅读和维护
  • 已缓存的 JavaScript 文件可加速页面加载

使用方法

显示方案

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

如需访问 HTML 元素,JavaScript 可使用 document.getElementById(id) 方法。

id 属性定义 HTML 元素。innerHTML 属性定义 HTML 内容:

  1. 使用innerHTML
  2. 使用document.write() 括号里面直接写内容即可
  3. window.alert() 使用警告框来显示数据
  4. 使用 console.log()方法显示数据 就是按了F12后会在控制台输出

提示: document.write() 方法仅用于测试。

JavaScript语法

关键词 var关键词告知浏览器创建新的变量

对大小写敏感

JavaScript中不能使用连字符,它是为减法预留的

可以使用下划线和驼峰式大小写

提示: 在脚本的开头声明所有变量是个好习惯!

作用域

通过 var 关键词声明的变量没有块作用域

在块 {} 内声明的变量可以从块之外进行访问。

可以使用 let 关键词声明拥有块作用域的变量。

在块 {} 内声明的变量无法从块外访问:

{ 
  let x = 10;
}
// 此处不可以使用 x

使用 let 关键字重新声明变量可以解决这个问题。

在块中重新声明变量不会重新声明块外的变量:

新关键词

let和const

通过const定义的变量与let变量类似,但不能重新赋值

const PI = 3.141592653589793;

const必须在声明时赋值

常量不可以改,但是可以改变常量对象

const car = { .... ... ... }

... = ......

也可以添加属性

// 您可以创建 const 对象:
const car = {type:"porsche", model:"911", color:"Black"};

// 您可以更改属性:
car.color = "White";

// 您可以添加属性:
car.owner = "Bill";

但是您无法重新为常量对象赋值:

  • 实例
const car = {type:"porsche", model:"911", color:"Black"};
car = {type:"Volvo", model:"XC60", color:"White"};    // ERROR
const cars = ["Audi", "BMW", "porsche"];
​
// 您可以更改元素:
cars[0] = "Honda";
​
// 您可以添加元素:
cars.push("Volvo");

但是您无法重新为常量数组赋值:

  • 实例
const cars = ["Audi", "BMW", "porsche"];
cars = ["Honda", "Toyota", "Volvo"];    // ERROR

JavaScript运算符

JavaScript数据类型

当数值和字符串相加时,JavaScript将把数值视作字符串

动态类型

JavaScript拥有动态类型,相同变量可用作不同类型

var x;               // 现在 x 是 undefined
var x = 7;           // 现在 x 是数值
var x = "Bill";      // 现在 x 是字符串值
  • JavaScript只有一种数值类型,用不用小数点都可以
  • 超大或超小的数值可以用科学计数法来写
  • JavaScript布尔值:True 和 false

JavaScript对象

用花括号写

对象属性时 name:value对。由逗号分隔

typeof 运算符

使用 typeof来确定JavaScript变量类型

typeof 运算符对数组返回 "object",因为在 JavaScript 中数组属于对象。

在 JavaScript 中,没有值的变量,其值是 undefined。typeof 也返回 undefined

空值与 undefined 不是一回事。

空的字符串变量既有值也有类型。

对象的属性与方法

image.png

对象的方法:

在这个对象的声明里面,一个属性的值就是一个方法的返回值

var person = {
  firstName: "Bill",
  lastName : "Gates",
  id       : 678,
  fullName : function() {
    return this.firstName + " " + this.lastName;
  }
};

两种方式访问属性:

person.lastName;
person["lastName"];

如果通过关键词 "new" 来声明 JavaScript 变量,则该变量会被创建为对象:

var x = new String();        // 把 x 声明为 String 对象
var y = new Number();        // 把 y 声明为 Number 对象
var z = new Boolean();       //	把 z 声明为 Boolean 对象

请避免字符串、数值或逻辑对象。他们会增加代码的复杂性并降低执行速度。

JavaScript事件

HTML 事件可以是浏览器用户做的某些事情

下面是 HTML 事件的一些例子:

  • HTML 网页完成加载
  • HTML 输入字段被修改
  • HTML 按钮被点击

JavaScript可以向HTML元素添加事件处理程序。

使用单引号:

<element event='一些 JavaScript'>

使用双引号:

<element event="一些 JavaScript">

常见的html事件:

事件描述
onchangeHTML 元素已被改变
onclick用户点击了 HTML 元素
onmouseover用户把鼠标移动到 HTML 元素上
onmouseout用户把鼠标移开 HTML 元素
onkeydown用户按下键盘按键
onload浏览器已经完成页面加载

JavaScript 能够做什么?

事件处理程序可用于处理、验证用户输入、用户动作和浏览器动作:

  • 每当页面加载时应该做的事情
  • 当页面被关闭时应该做的事情
  • 当用户点击按钮时应该被执行的动作
  • 当用户输入数据时应该被验证的内容
  • 等等

让 JavaScript 处理事件的不同方法有很多:

  • HTML 事件属性可执行 JavaScript 代码
  • HTML 事件属性能够调用 JavaScript 函数
  • 您能够向 HTML 元素分配自己的事件处理函数
  • 您能够阻止事件被发送或被处理
  • 等等

JavaScript字符串

字符串长度 length

var x ="123asdf";

var sln = x.length;

  • 使用转义字符
代码结果描述
''单引号
""双引号
\\反斜杠

indexOf() 方法返回字符串中指定文本首次出现的索引(位置):

lastIndexOf() 方法返回指定文本在字符串中最后一次出现的索引:

如果未找到文本, indexOf()lastIndexOf() 均返回 -1。

  • 第二个参数为检索起始位置
var pos = str.indexOf("China", 18);

lastIndexOf() 方法向后进行检索(从尾到头),这意味着:假如第二个参数是 50,则从位置 50 开始检索,直到字符串的起点。

search() 方法搜索特定值的字符串,并返回匹配的位置:

search() 方法返回字符串中指定文本第一次出现的位置

两种方法,indexOf()search(),是相等的

这两种方法是不相等的。区别在于:

  • search() 方法无法设置第二个开始位置参数。
  • indexOf() 方法无法设置更强大的搜索值(正则表达式)。

正则表达式!!!!

提取部分字符串

有三种提取部分字符串的方法:

  • slice(start, end)
  • substring(start, end)
  • substr(start, length)

slice() 提取字符串的某个部分并在新字符串中返回被提取的部分。

该方法设置两个参数:起始索引(开始位置),终止索引(结束位置)。

substring() 类似于 slice()

不同之处在于 substring() 无法接受负的索引。

substr() 类似于 slice()

不同之处在于第二个参数规定被提取部分的长度

替换字符串内容

replace() 方法用另一个值替换在字符串中指定的值:

str = "Please visit Microsoft!";
var n = str.replace("Microsoft", "W3School");

replace() 方法不会改变调用它的字符串。它返回的是新字符串。

默认地,replace() 只替换首个匹配

默认地,replace() 对大小写敏感。因此不对匹配 MICROSOFT:

如需执行大小写不敏感的替换,请使用正则表达式 /i(大小写不敏感):

如需替换所有匹配,请使用正则表达式的 g 标志(用于全局搜索):

转化大小写

通过 toUpperCase() 把字符串转换为大写:

var text1 = "Hello World!";       // 字符串
var text2 = text1.toUpperCase();  // text2 是被转换为大写的 text1

通过 toLowerCase() 把字符串转换为小写:

var text1 = "Hello World!";       // 字符串
var text2 = text1.toLowerCase();  // text2 是被转换为小写的 text1

concat() 连接两个或多个字符串:

所有字符串方法都会返回新字符串。它们不会修改原始字符串。

正式地说:字符串是不可变的:字符串不能更改,只能替换。

trim() 方法删除字符串两端的空白符:

示例:

var str = "       Hello World!        ";
alert(str.trim());

也可以自己使用replace方法加上一个正则表达式去替换

也可以把这个trim函数加到JavaScript string.prototype中

charAt() 方法返回字符串中指定下标(位置) 的字符串:

charCodeAt() 方法返回字符串中指定索引的字符 unicode 编码:

把字符串转换为数组

可以通过 split() 将字符串转换为数组:

var txt = "a,b,c,d,e";   // 字符串
txt.split(",");          // 用逗号分隔
txt.split(" ");          // 用空格分隔
txt.split("|");          // 用竖线分隔

搜索字符串的方法

  • String.indexOf()
  • String.lastIndexOf()
  • String.startsWith()
  • String.endsWith()

indexOf() 方法返回指定文本在字符串中第一次出现(的位置)的索引:

lastIndexOf() 方法返回指定文本在字符串中最后一次出现的索引:

如果未找到文本,indexOf()lastIndexOf() 都返回 -1:

这两种方法都接受第二个参数作为搜索的开始位置:

search() 方法在字符串中搜索指定值并返回匹配的位置:

match() 方法根据正则表达式在字符串中搜索匹配项,并将匹配项作为 Array 对象返回。

如果正则表达式不包含 g 修饰符(执行全局搜索),match() 方法将只返回字符串中的第一个匹配项。若未找到匹配项,则为 null。

对 "ain" 执行不区分大小写的全局搜索:

let text = "The rain in SPAIN stays mainly in the plain";
text.match(/ain/gi)   // 返回数组 [ain,AIN,ain,ain]

如果字符串包含指定值,includes() 方法返回 true。

let text = "Hello world, welcome to the universe.";
text.includes("world")    // 返回 true

如果字符串以指定值开头,则 startsWith() 方法返回 true,否则返回 false

let text = "Hello world, welcome to the universe.";
​
text.startsWith("world", 5)    // 返回 false
text.startsWith("world", 6)    // 返回 true

如果字符串以指定值结尾,则 endsWith() 方法返回 true,否则返回 false

JavaScript字符串模板

同义词:

  • Template Literals
  • Template Strings
  • String Templates
  • Back-Tics 语法

模板字面量使用反引号 (``) 而不是引号 ("") 来定义字符串:

通过使用模板字面量,您可以在字符串中同时使用单引号和双引号

模板字面量允许多行字符串:

插值

模板字面量提供了一种将变量和表达式插入字符串的简单方法。

该方法称为字符串插值(string interpolation)。

语法:

${...}

模板字面量允许字符串中的变量:

let firstName = "Bill";
let lastName = "Gates";

let text = `Welcome ${firstName}, ${lastName}!`;

模板字面量允许字符串中的表达式

let total = `Total: ${(price * (1 + VAT)).toFixed(2)}`;

完整的字符串参考:JavaScript String 参考手册 (w3school.com.cn)

html模板

< script>
    
let header = "Templates Literals";
let tags = ["template literals", "javascript", "es6"];
let html = `<h2>${header}</h2><ul>`;
for (const x of tags) {
  html += `<li>${x}</li>`;
}
html += `</ul>`;
//以上的工作都是在完成一个html变量的构建

document.getElementById("demo").innerHTML = html;

数值

始终是64位浮点数

JavaScript 数值始终以双精度浮点数来存储,根据国际 IEEE 754 标准。

  • 常见错误

常见的错误是认为结果应该是 102030:

实例

var x = 10;
var y = 20;
var z = "30";
var result = x + y + z;

在所有数字运算中,JavaScript 会尝试将字符串转换为数字

NaN 属于 JavaScript 保留词,指示某个数不是合法数。

尝试用一个非数字字符串进行除法会得到 NaN(Not a Number):

如:

var x = 100 / "Apple";  // x 将是 NaN(Not a Number)

可使用全局 JavaScript 函数 isNaN() 来确定某个值是否是数:

var x = 100 / "Apple";
isNaN(x);     

Infinity (或 -Infinity)是 JavaScript 在计算数时超出最大可能数范围时返回的值。

typeof Infinity;        // 返回 "number"

JavaScript数字方法

toString() 以字符串返回数值。

toExponential() 返回字符串值,它包含已被四舍五入并使用指数计数法的数字。

toFixed() 返回字符串值,它包含了指定位数小数的数字:

  • toFixed(2) 非常适合处理金钱。

toPrecision() 返回字符串值,它包含了指定长度的数字:

valueOf() 以数值返回数值:

变量转换为数值

这三种 JavaScript 方法可用于将变量转换为数字:

  • Number() 方法
  • parseInt() 方法
  • parseFloat() 方法

这些方法并非数字方法,而是全局 JavaScript 方法。

NUMBER()返回数字,由其参数转换而来。
parseFloat()解析其参数并返回浮点数。
parseInt()解析其参数并返回整数。

Number() 还可以把日期转换为数字:

Number(new Date("2019-04-15"));    // 返回 1506729600000

如果无法转换数字,则返回 NaN

parseInt() 解析一段字符串并返回数值。允许空格。只返回首个数字:

parseInt("10.33");      // 返回 10

parseFloat() 解析一段字符串并返回数值。允许空格。只返回首个数字:

parseFloat("10.33");     // 返回 10.33
属性描述
MAX_VALUE返回 JavaScript 中可能的最大数。
MIN_VALUE返回 JavaScript 中可能的最小数。
NEGATIVE_INFINITY表示负的无穷大(溢出返回)。
NaN表示非数字值("Not-a-Number")。
POSITIVE_INFINITY表示无穷大(溢出返回)。

数组

数组元素可以是对象

数组是对象,通过数字访问其元素,对象通过名称访问其“成员”

  • 数组属性和方法
var x = cars.length;   // length 属性返回元素的数量
var y = cars.sort();   // sort() 方法对数组进行排序

遍历数组的最安全方法是使用 "for" 循环:

var fruits, text, fLen, i;

fruits = ["Banana", "Orange", "Apple", "Mango"];
fLen = fruits.length;
text = "<ul>";
for (i = 0; i < fLen; i++) {
     text += "<li>" + fruits[i] + "</li>";
} 

也可以使用 Array.foreach() 函数:

var fruits, text;
fruits = ["Banana", "Orange", "Apple", "Mango"];text = "<ul>";
fruits.forEach(myFunction);
text += "</ul>";
​
function myFunction(value) {
  text += "<li>" + value + "</li>";
}

向数组添加新元素的最佳方法是使用 push() 方法:

也可以使用 length 属性向数组添加新元素:

假如您使用命名索引,JavaScript 会把数组重定义为标准对象。

之后,所有数组的方法和属性将产生非正确结果。

var person = [];
person["firstName"] = "Bill";
person["lastName"] = "Gates";
person["age"] = 62;
var x = person.length;         // person.length 将返回 0
var y = person[0];              // person[0] 将返回 undefined
  • 数组和对象的区别

在 JavaScript 中,数组使用数字索引

在 JavaScript 中,对象使用命名索引

数组是特殊类型的对象,具有数字索引。

没有必要使用 JavaScript 的内建数组构造器 new Array()

新方法 Array.isArray(): 判断是否是一个数组

创建您自己的 isArray() 函数以解决此问题:

function isArray(x) {
    return x.constructor.toString().indexOf("Array") > -1;
}

JavaScript 数组的力量隐藏在数组方法中。

toString()把数组转换为数组值(逗号分隔)的字符串

var fruits = ["Banana", "Orange", "Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits.toString(); 

join() 方法也可将所有数组元素结合为一个字符串。

似 toString(),但是可以规定分隔符:

var fruits = ["Banana", "Orange","Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits.join(" * "); 

pop() 方法从数组中删除最后一个元素:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.pop();              // 从 fruits 删除最后一个元素("Mango")

pop() 方法返回“被弹出”的值:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.pop();      // x 的值是 "Mango"

push() 方法(在数组结尾处)向数组添加一个新的元素:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.push("Kiwi");       //  向 fruits 添加一个新元素

push() 方法返回新数组的长度:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x =  fruits.push("Kiwi");   //  x 的值是 5

位移与弹出等同,但处理首个元素而不是最后一个。

shift() 方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。

unshift() 方法返回新数组的长度。

删除元素

使用 delete 会在数组留下未定义的空洞。请使用 pop()shift() 取而代之。

splice() 方法可用于向数组添加新项:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");

第一个参数(2)定义了应添加新元素的位置(拼接)。

第二个参数(0)定义应删除多少元素。

其余参数(“Lemon”,“Kiwi”)定义要添加的新元素。

concat() 方法通过合并(连接)现有数组来创建一个新数组:

  • 裁剪数组

slice() 方法用数组的某个片段切出新数组。

  • toString

如果需要原始值,则 JavaScript 会自动把数组转换为字符串。下面两个例子将产生相同的结果:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits.toString(); document.getElementById("demo").innerHTML = fruits; 
  • 数组排序

sort() 方法以字母顺序对数组进行排序:

reverse() 方法反转数组中的元素。

您可以使用它以降序对数组进行排序:

默认地,sort() 函数按照字符串顺序对值进行排序。该函数很适合字符串("Apple" 会排在 "Banana" 之前)。

不过,如果数字按照字符串来排序,则 "25" 大于 "100",因为 "2" 大于 "1"。

正因如此,sort() 方法在对数值排序时会产生不正确的结果。

我们通过一个比值函数来修正此问题:

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b}); 
  • 比值函数

比较函数的目的是定义另一种排序顺序

比较函数应该返回一个负,零或正值,这取决于参数:

function(a, b){return a-b}

sort() 函数比较两个值时,会将值发送到比较函数,并根据所返回的值(负、零或正值)对这些值进行排序。

以随即顺序排序:

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()}); 

您可以使用 Math.max.apply 来查找数组中的最高值:

function myArrayMax(arr) {
    return Math.max.apply(null, arr);
}

您可以使用 Math.min.apply 来查找数组中的最低值:

function myArrayMin(arr) {
    return Math.min.apply(null, arr);
}

数组迭代

forEach() 方法为每个数组元素调用一次函数(回调函数)。

Array.map()

map() 方法通过对每个数组元素执行函数来创建新数组。

map() 方法不会对没有值的数组元素执行函数。

map() 方法不会更改原始数组。

这个例子将每个数组值乘以2:

var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);
​
function myFunction(value, index, array) {
  return value * 2;
}

当回调函数仅使用 value 参数时,可以省略索引和数组参数:

实例

var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);

function myFunction(value) {
  return value * 2;
}

filter() 方法创建一个包含通过测试的数组元素的新数组。

还有许多方法:

JavaScript 数组迭代 (w3school.com.cn)

数组const

关键字 const 有一定误导性。

它不定义常量数组。它定义的是对数组的常量引用。

因此,我们仍然可以更改常量数组的元素。

日期

类型实例
ISO 日期"2018-02-19" (国际标准)
短日期"02/19/2018" 或者 "2018/02/19"
长日期"Feb 19 2018" 或者 "19 Feb 2019"
完整日期"Monday February 25 2015"

日期有一大堆gettime,getyear的方法

JavaScript math

ABS(X)返回 X 的绝对值
acos(x)返回 x 的反余弦值,以弧度计
asin(x)返回 x 的反正弦值,以弧度计
atan(x)以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。
atan2(y,x)返回从 x 轴到点 (x,y) 的角度
ceil(x)对 x 进行上舍入
cos(x)返回 x 的余弦
exp(x)返回 Ex 的值
floor(x)对 x 进行下舍入
log(x)返回 x 的自然对数(底为e)
max(x,y,z,...,n)返回最高值
min(x,y,z,...,n)返回最低值
pow(x,y)返回 x 的 y 次幂
random()返回 0 ~ 1 之间的随机数
round(x)把 x 四舍五入为最接近的整数
sin(x)返回 x(x 以角度计)的正弦
sqrt(x)返回 x 的平方根
tan(x)返回角的正切

JavaScript 随机

Math.random() 返回 0(包括) 至 1(不包括) 之间的随机数:

Math.random() 总是返回小于 1 的数。

Math.random()Math.floor() 一起使用用于返回随机整数。

Math.floor(Math.random() * 10);     // 返回 0 至 9 之间的数

这个 JavaScript 函数始终返回介于 min(包括)和 max(不包括)之间的随机数:

function getRndInteger(min, max) {
    return Math.floor(Math.random() * (max - min) ) + min;
}