JavaScript 基础
认识 JavaScript
编程语言的发展阶段
机器语言
-
阶段一:机器语言
- 计算机的存储单元只有 0 和 1 两种状态,因此一串代码要让计算机“读懂”,这串代码只能由数字 0 和 1 组成
- 由数字 0 和 1 按照一定的规律组成的代码就叫机器码,也叫 二进制编码
- 一定长度的机器码组成了机器指令,用这些机器指令所编写的程序就称为机器语言
-
优点
- 代码能被计算机直接识别,不需要经过编译解析
- 直接对硬 件产生作用,程序的执行效率非常高
-
缺点
- 程序全是 0 和 1 的指令代码,可读性差,容易出错
- 不易编写
汇编语言
-
阶段二:汇编语言
- 为了解决机器语言的缺陷,人们发明了另外一种语言 — 汇编语言
- 这种语言用符号来 代替 0、1 代码(经过汇编器 ,汇编代码再进一步转成二进制)
-
优点
- 像机器语言一样,可以直接访问、控制计算机的各种硬件设备
- 占用内存少,执行速度快
-
缺点
- 不同的机器(CPU)有不同的汇编语言语法和编译器,代码缺乏可移植性
- 符号非常多,难以记忆
- 很容易产生 BUG ,难于调试
-
应用场景:操作系统内核、驱动程序、单片机程序
高级语言
- 阶段三:高级语言
- 高级语言接近自然语言,更符合人类的思维方式
- 优点
- 简单、易用、易于理解,语法和结构类似于普通英文
- 一个程序还可以在不同的机器上运行,具有可移植性
- 缺点
- 程序不能直接被计算机识别,需要经编译器翻译成二进制指令后,才能运行在计算机上
- 效率要低于机器语言和汇编语言
JavaScript 的定义
- 维基百科对 JavaScript 的定义
- JavaScript 是一种高级的、解释型的编程语言
- JavaScript 是 一门基于原型、头等函数的语言,是一门多范式的语言,它支持面向对象程序设计、指令式编程以及函数式编程
- JavaScript 是一门高级编程语言,是前端开发的重要组成部分
JavaScript 的历史
-
1994 年,网景公司(Netscape)发布了 Navigator 浏览器 0.9 版
- 这是历史上第一个比较成熟的网络浏览器
- 但是,这个版本的浏览器只能用来浏览网页,不具备与访问者交互的能力
- 网景公司急需一种网页脚本语言,使得浏览器可以与网页互动
-
网景公司当时想要选择一种语言来嵌入到浏览器中
- 采用现有的语言,比如 Perl、Python、Tcl、Scheme 等,允许它们直接嵌入网页
- 1995 年网景公司招募了 程序员 Brendan Eich,希望将 Scheme 语言作为网页脚本语言
-
就在这时,发生了另外一件大事:1995 年 Sun 公司将 Oak 语言改名为 Java,正式向市场推出
- Java 推出之后立马在市场上引起了轰动(write once run anywhere )
- 网景公司决定与 Sun 公司结成联盟,希望 将 Java 嵌入到网页 中来运行
-
Brendan Eich 本人非常热衷于 Scheme,对于 Java 不感兴趣,他用 10 天时间设计了 JavaScript
- 最初这门语言的名字是 Mocha
- 在 Navigator2.0 beta 版本更名为 LiveScript
- 在 Navigator2.0 beta 3 版本正式重命名为 JavaScript ,当时是为了给这门语言搭上 Java 这个热词
-
这门语言当时更像是一个多种语言的结合
- 借鉴 C 语言 的基本语法
- 借鉴 Java 语言 的数据类型和内存管理
- 借鉴 Scheme 语言 ,将函数提升到一等公民的地位
- 借鉴 Self 语言 ,使用基于原型(prototype)的继承机制
-
微软公司于 1995 年首次推出 Internet Explorer,从而引发了与 Netscape 的浏览器竞争
- 微软对 Netscape Navigator 解释器进行了逆向工程,创建了 JScript,以与网景产品进行竞争
- 这个时候对于开发者来说是一场噩耗,因为需要针对不同的浏览器进行不同的适配
-
1996 年 11 月,网景正式向 ECMA(欧洲计算机制造商协会)提交语言标准
- 1997 年 6 月,ECMA 以 JavaScript 语言为基础制定了 ECMAScript 标准规范 ECMA-262
- ECMA 262 是一份标准,定义了 ECMAScript,JavaScript 成为了 ECMAScript 最著名的实现之一
- 除此之外,ActionScript 和 JScript 也都是 ECMAScript 规范的实现语言
-
所以说,ECMAScript 是一种规范,而 JavaScript 是这种规范的一种实现
JavaScript 的组成
ECMAScript 是 JavaScript 的标准,描述了该语言的语法和基本对象
- JavaScript 是 ECMAScript 的语言层面的实现
- 因为除了语言规范之外,JavaScript 还需要对页面和浏览器进行各种操作
- 除了基本实现之外,还包括 DOM 操作和 BOM 操作
JavaScript 的应用
基本语法
编写方式
-
HTML 代码行内(不推荐)
<button onclick="alert(11)">保存</button> -
script 标签中
<script>
console.log(Date.now())
</script> -
外部的 script 文件:通过 script 元素的
src属性来引入外部文件<script src="./index.js"></script>
noscript 元素
-
noscript元素被用于给不支持 JavaScript 的浏览器提供替代内容 -
下面的情况下 , 浏览器将显示包含在
noscript元素中的内容-
浏览器不支持脚本
-
浏览器对脚本的支持被禁用
<noscript>
<p>您的浏览器不支持JavaScript或没有开启JavaScript支持</p>
</noscript> -
编写注意事项
script元素不能写成单标签- 在使用外部 js 文件时,script 标签中不可以写 JavaScript 代码(会被覆 盖),并且 script 标签不能写成单标签
- 省略
type属性- 在早期的代码中,script 标签中会使用
type=“text/javascript" - 现在不需要,因为 JavaScript 是所有现代浏览器以及 HTML5 中的默认脚本语言
- 在早期的代码中,script 标签中会使用
- 加载顺序
- 作为 HTML 文档内容的一部分,JavaScript 默认遵循 HTML 文档的加载顺序,即自上而下的加载顺序
- JavaScript 代码严格区分大小写
- HTML 元素和 CSS 属性不区分大小写,但是 在 JavaScript 中严格区分大小写
语句和分号
-
语句是向浏览器发出的指令,通常表达一个操作或者行为
alert(11);
console.log(22); -
通常每条语句的后面我们会添加一个分号,表示语句的结束
- 当存在换行符时,在大多数情况下可以省略分号
- JavaScript 会将换行符解释成“隐式”的分号
注释
-
JavaScript 的注释主要分为三种
-
单行注释
// 单行注释 -
多行注释
/*
多行注释
多行注释
*/ -
文档注释(JS Doc)
/**
* 是否为数组类型
* @param {*} variable 变量
* @returns {boolean}
*/
function isArray(variable) {
return Object.prototype.toString.call(variable) === '[object Array]';
}
-
-
JavaScript 也不支持注释的嵌套
变量
变量的命名格式
-
变量的声明:在 JavaScript 中声明一个变量使用
var、let、const关键字 -
变量的赋值:使用
=给变量进行赋值
const message = 'Hello World';
let a, b;
变量的命名规范
- 第一个字符必须是字母、下划线 或 美元符号($),其他字符可以是 字母、下划线、美元符号或数字
- 不能使用 关键字 和保留字命名
- 变量严格区分大小写
数据类型
- JavaScript 中的值都具有特定的类型
- 在 JavaScript 中有 8 种基本的数据类型(7 种原始类型和 1 种复杂类型)
- Number
- String
- Boolean
- undefined
- null
- Object
- BigInt
- Symbol
typeof 操作符
- ECMAScript 的类型系统是松散的,使用
typeof操作符可以获取变量的类型 - 对一个值使用 typeof 操作符会返回下列字符串之一
"undefined":未定义"boolean":布尔值"string":字符串"number":数值"object":对象(不是函数)或null"function":函数"symbol":符号
typeof(x):typeof 是一个操作符,并非是一个函数,括号只是将后续的内容当做一个整体
Number 类型
-
Number类型代表数字类型(不区分整数和浮点数)const num1 = 10;
const num2 = 12.34; -
除了常规的数字,还包括所谓的”特殊数值“
Infinity:类似于数学概念中的无穷大,也可以表示-Infinity- 比如 1/0 得到的就是无穷大
NaN:代表一个计算错误 ,它是一个错误的操作所得到的结果- 比如字符串和一个数字相乘
-
数字类型也有其他的进制表示方法
// 十进制
const num1 = 10;
// 十六进制
const num2 = 0xfff;
// 八进制
const num3 = 0o111;
// 二进制
const num4 = 0b0101; -
数字表示的范围
- 最小正数值
Number.MIN_VALUE,小于这个值的数字会被转化为 0 - 最大正数值
Number.MAX_VALUE
- 最小正数值
-
isNaN():用来确定一个值是否为NaN,返回一个布尔值const num = Number.isNaN(10 * '文字'); // NaN
String 类型
-
JavaScript 中的字符串必须被括在引号里,有三种包含字符串的方式
- 双引号:
"22" - 单引号:
'11' - 反引号:``
const str1 = '11';
const str2 = "22";
const str3 = `33`; - 双引号:
-
字符串中的转义字符
转义字符 表示符号 \'单引号 \"双引号 \\反斜杠 \n换行符
Boolean 类型
-
Boolean(布尔)类型用于表示真假 -
布尔是计算机科学中的逻辑数据类型,以发明布尔代数的数学家 乔治 · 布尔 为名
-
Boolean 类型仅包含两个值:
true和falseconst flag = true;
const isEqual = 1 === 1;
undefined 类型
-
undefined类型只有一个值,就是特殊值undefined -
声明一个变量,但是没有对其进行初始化时,它默认就是 undefined
let name;
console.log(name); // undefined
Object 类型
-
Object类型是一个特殊的类型,我们通常把它称为引用类型或复杂类型- 其他的数据类型我们通常称之为原始类型,它们的值只保存一个单独的内容
- Object 往往可以表示一组数据,是其他数据的一个集合
-
在 JavaScript 中使用 花括号
{}的字面量表示方式来表示一个对象const info = {
name: 'xx',
age: 18
}
null 类型
null类型同样只有一个值,即特殊值null- null 类型通常用来表示一个对象为空,所以通常我们在给一个对象进行初始化可以赋值为 null
- null 和 undefined 的关系
- undefined 通常只有在一个变量声明但是未初始化时,它的默认值是 undefined 才会用到
- 不推荐直接给一个变量赋值为 undefined
- null 值非常常用,当使用一个变量准备保存一个对象,但是这个对象不确定时,可以先赋值为 null
数据类型的转换
- 大多数情况下,运算符和函数会自动将赋予它们的值转换为正确的类型,这是一种隐式转换
字符串 String 的转换
-
隐式转换:一个字符串和另一个类型进行操作
- 如果运算符左右两边有一个是字符串,那么另一边会自动转换成字符串类型进行拼接
'' + 11; // '11' -
显式转换
- 调用
String()函数 - 调用
toString方法
String(true); // 'true' - 调用
数字类型 Number 的转换
-
隐式转换:在算数运算中,通常会将其他类型转换成数字类型来进行运算
- 比如
"6" / "3" = 2 - 但是如果是
+运算 ,并且其中一边有字符串,那么还是按照字符串来进行拼接
- 比如
-
显式转换:使用
Number()函数来进行显式的转换 -
其他类型转换数字的规则
值 转换后的值 undefined NaNnull 0 true 和 false 1 和 0 字符串 去掉首尾空格后的纯数字。如果剩余字符串为空,则转换为 0 ,否则将从剩余字符串中读取数字,当类型转换出现错误时,返回 NaN
布尔类型 Boolean 的转换
- 布尔类型的转换发生在逻辑运算中,也可以通过调用
Boolean()函数进行显式转换 - 转换规则
- 直观上为 “空” 的值(如 0、空字符串、null 、undefined 和 NaN)将转换为
false - 其他值变成
true - 字符串
"0"会转换为true
- 直观上为 “空” 的值(如 0、空字符串、null 、undefined 和 NaN)将转换为
运算符
算术运算符
算术运算符用在数学表达式中 , 是对数据进行计算的符号
| 运算符 | 运算规则 | 示例 |
|---|---|---|
+ | 加法 | 5 + 5 = 10 |
+ | 拼接字符串 | '中' + '国' = '中国' |
- | 减法 | 8 - 8 = 0 |
* | 乘法 | 4 * 8 = 32 |
/ | 除法 | 8 / 2 = 4 |
% | 取余数 | 5 % 2 = 1 |
** | 幂(ES7) | 2 ** 4 = 16 |
赋值运算符
-
使用
=可以对变量进行赋值 -
链式赋值:链式赋值从右到左进行计算,然后将值赋给左边的变量,最后所有变量共享一个值
let a, b, c;
a = b = c = 2;
原地修改
-
原地修改是对一个变量做运算的简写方式
-
原地修改只能用于变量,不能直接运用于数字
let a = 10, b = 5;
a += 10; // 20
b **= 2; // 25
自增、自减
-
自增:
++ -
自减:
-- -
自增、自减只能应用于变量,不能直接用于数字
let a = 10;
a++; // 11 -
自增、自减可以置于变量前,也可以置于变量后,区别主要在于当用于运算时取到的值是变化前还是变化后
- 前置形式:
++variable - 后置形式:
variable++
let a = 1, b = 1;
console.log(1 + a++); // 2
console.log(1 + --b); // 1 - 前置形式:
比较运算符
-
用于比较大小的运算符
-
比较运算符的结果都是 Boolean 类型
运算符 运算规则 示例 ==、===相等、严格相等 '3' == 3(true)、'3' === 3(false)!=、!==不相等、严格不相等 '3' != 3(false)、'3' !== 3(true) >、>=大于、大于等于 4 > 3(true)、3 >= 3(true) <、<=小于、小于等于 4 < 3(false)、3 <= 3(true) -
==与===区别- 严格相等运算符
===在进行比较时不会做任何的类型转换 - 相等运算符
==在比较时可能对不同类型先进行类型转换后再比较,比较规则
- 严格相等运算符
-
同样的,
!=表示不相等,!==表示严格不相等
三元运算符
-
用于简化
if else的分支语句 -
使用格式:计算条件结果,如果结果为真,则返回 value1,否则返回 value2
const result = condition ? value1 : value2; -
示例
const result = 4 > 3 ? 1 : 2; // 1
逻辑运算符
逻辑或
-
||:逻辑或运算符 -
计算规则