一、导论
1.1.什么是JavaScript语言?
Javascript是一种轻量级的脚本语言(script language,指不具备开发操作系统的能力,只能用来编写控制其他大型应用程序的脚本),是一种嵌入式(embedded)语言,仅可以用来左一些数学和逻辑运算,IO也主要靠宿主(host)环境提供。
最常见的宿主环境就是浏览器,另外还有服务器环境,即Node项目。
Javascript语言是一种“对象模型语言”,各种宿主环境通过这个模型来描述自己的功能和操作接口,从而通过Javascript控制这些功能,它也支持其他编程范式。
JavaScript的核心语法只包括两个部分:基本的语法构造(操作符、控制结构、语句)和标准库,除此之外还有宿主环境提供的额外API。
浏览器提供的API可分为三类:
- 浏览器控制类:操作浏览器
- DOM类:操作网页的各种元素
- Web类:实现互联网的各种功能
服务器还可以提供操作系统的API等。
1.2.引入方式
Javascript程序不能独立运行,它需要被嵌入HTML中,浏览器才能执行JavaScript代码。引入方式有两种:
- 行内引入
直接在行内使用js语句;
<body>
<input type="button" value="唐伯虎" onclick="alert('秋香姐');">
</body>
- 内部
在body里通过script
标签包裹js代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 引入方式</title>
</head>
<body>
<!-- 内联形式:通过 script 标签包裹 JavaScript 代码 -->
<script>
alert('学习前端技术!');
</script>
</body>
</html>
- 外部
把js代码写在独立的js文件中,通过script
标签的src
属性引用,此时标签内的代码就会被忽略。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 引入方式</title>
</head>
<body>
<!-- 外部形式:通过 script 的 src 属性引入独立的 .js 文件 -->
<script src="demo.js"></script>
</body>
</html>
1.3. 注释与结束符
单行注释://
多行蛛丝:/* */
结束符:可以使用;
也可以使用回车符
1.4. 输出与输入
输出:
-
alert()
弹窗输出; -
document.write()
页面输出; -
console.log()
控制台输出;
输入: -
prompt()
弹窗输入。
1.5.变量
1.声明:关键字 变量名
let
和var
都是声明关键字,推荐使用let
;
let
是只在let代码块中有效;var
是全局变量;
变量提升:JS引擎的工作方式:先解析代码,获取所有被声明的变量,然后再一行一行地运行,所以所有的变量的声明语句,都会被提升到代码头部。
标识符:即变量名或函数名;
命名规则:
不能以数字开头,可以使用$
和_
或者Unicode字母开头;区分大小写。
1.6.语句与运算符
if语句:
if(布尔值)
语句;
if(布尔值){
}
if(布尔值){}
else{}
if(布尔值){}
else if(布尔值){}
else{}
switch结构:
var fruit="apple";
switch(fruit){
case "banana":
//...
break;
case "apple":
//...
break;
default:
//...
}
三元运算符:
用于逻辑判断:
(条件)?表达式1:表达式2
while语句:
while(条件)
语句;
while(条件){}
for循环:
for (初始化表达式; 条件; 递增表达式)
语句
// 或者
for (初始化表达式; 条件; 递增表达式) {
语句
}
do……while循环:
do
语句
while (条件);
// 或者
do {
语句
} while (条件);
break语句用于跳出代码块或循环;continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。
1.7.标签
JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置。
label:
语句
可以break label
也可以continue label
。
二、数据类型
2.1.概述
JavaScript共六种数据类型(ES6又新增了一种Symbol类型)。
- 数值(number):整数和小数(比如1和3.14);
- 字符串(string):文本(比如Hello World);
- 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假);
- undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值;
- null:表示空值,即此处的值为空;
- 对象(object):各种值组成的集合。
2.2 获取数据类型
JavaScript 有三种方法,可以确定一个值到底是什么类型。
- typeof运算符
- instanceof运算符
- Object.prototype.toString方法
2.3 Null与Undefined
null
是一个表示“空”的对象,转为数值时为0
;undefined
是一个表示"此处无定义"的原始值,转为数值时为NaN
。
2.4 布尔值
下列运算符会返回布尔值:
前置逻辑运算符: ! (Not)
相等运算符:===
,!==
,==
,!=
比较运算符:>
,>=
,<
,<=
转换规则是除了下面六个值被转为false,其他值都视为true。
undefined
,null
,false
,0
,NaN
,""
或''
(空字符串)。
2.5 数值
JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。
JavaScript 会自动把64位浮点数,转成32位整数,然后再进行运算。
浮点数计算不精确,所以涉及小数计算要格外注意。
JavaScript 浮点数的64个二进制位:
- 第1位:符号位,0表示正数,1表示负数
- 第2位到第12位(共11位):指数部分
- 第13位到第64位(共52位):小数部分(即有效数字)
最大值是2047,正向溢出输出:Infinity
(表示“无穷”,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到Infinity),反向溢出输出:0
。JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
NaN:
是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。
parseInt方法:
用于将字符串转为整数。parseInt方法第一个参数为字符串,第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制。
parseFloat方法:
用于将一个字符串转为浮点数。
isFinite方法:
返回一个布尔值,表示某个值是否为正常的数值。
isNaN方法:
可以用来判断一个值是否为NaN。
2.6 字符串
字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。
- 字符串只能写在一行,换行就需在每一行的尾部使用反斜杠;
- 转义:\0 :null(\u0000)\b :后退键(\u0008)\f :换页符(\u000C)\n :换行符(\u000A)\r :回车键(\u000D)\t :制表符(\u0009)\v :垂直制表符(\u000B)’ :单引号(\u0027)" :双引号(\u0022)\ :反斜杠(\u005C);
- 字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始);
- length属性返回字符串的长度。
2.7 对象
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
var obj = {
foo: 'Hello',
bar: 'World'
};
- 对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以;
- 对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用;
var obj = {
p: function (x) {
return 2 * x;
}
};
obj.p(1) // 2
- 读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符;如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理;
- 如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量;
- 查看一个对象本身的所有属性,可以使用
Object.keys
方法; delete
命令用于删除对象的属性,删除成功后返回true(无法删除继承的属性);in
运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false;for...in
循环用来遍历一个对象的全部属性;
for (var i in obj) {}
2.8 函数
函数的声明:
- function命令:
function print(s) { console.log(s);}
- 函数式:
var print = function(s) { console.log(s);};
- Function构造函数:
var add = new Function( 'x', 'y', 'return x + y');
重复声明后面的声明就会覆盖前面的;
JavaScript 引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。
函数的属性与方法: - name属性:返回函数的名字;
- length属性:函数形参个数;
- toString方法:以字符串形式返回函数源码;
函数的参数设置: - 参数可以省略不传;
- 参数为值传递,内部修改不会妨碍外部。
argument对象:
arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。
闭包:
Javascript有链式作用域,即在函数f1内定义函数f2,f2可以使用f1的变量,f1不可以读f2的变量。
闭包就是函数f2,即能够读取其他函数内部变量的函数。由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包最大的特点,就是它可以“记住”诞生的环境,比如f2记住了它诞生的环境f1,所以从f2可以得到f1的内部变量。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的最大用处有三个,一个是可以读取外层函数内部的变量;另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在;还能封装对象的私有属性和私有方法。
eval:
注入代码
2.9 数组
数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。(任何类型的数据,都可以放入数组)
var arr = ['a', 'b', 'c'];
数组本质是对象,键名为0、1、2等整数数字,读取可以使用数字或字符串。
length属性: 返回数组的成员数量;
**in:**检查某个键名是否存在的运算符in,适用于对象,也适用于数组;
**for…in循环:**不仅可以遍历对象,也可以遍历数组。