系列文章目录
在字符串中我们可以使用\作为转义字符,当表示一些特殊符号时可以使用\进行转义。
六、基本数据类型:Number, Null 和 Undefined
前言
JavaScript介绍
HTML:从语义的角度,描述页面结构
CSS:从审美的角度,描述样式(美化页面)
JavaScript(简称 JS):从交互的角度,描述行为(实现业务逻辑和页面控制)
JavaScript 既是前端语言,又是后端语言
当 JavaScript 运行在用户的终端网页,而不是运行在服务器上的时候,我们称之为“前端语言”。前端语言是服务于页面的显示和交互,不能直接操作数据库。
后端语言是运行在服务器上的,比如 Java、C++、PHP 等等,这些语言都能够操作数据库(对数据库进行“增删改查”),并在后台执行各种任务。
另外,Node.js 是用 JavaScript 开发的,我们也可以用 Node.js 技术进行服务器端编程。
#JavaScript 的组成
JavaScript 基础分为三个部分:
ECMAScript:JavaScript 的语法标准。包括变量、表达式、运算符、函数、if 语句、for 语句等。
DOM:Document Object Model(文档对象模型),JS 操作页面上的元素(标签)的 API。比如让盒子移动、变色、改变大小、轮播图等等。
BOM:Browser Object Model(浏览器对象模型),JS 操作浏览器部分功能的 API。通过 BOM 可以操作浏览器窗口,比如弹框、控制浏览器跳转、获取浏览器分辨率等等。
通俗理解就是:ECMAScript 是 JS 的语法;DOM 和 BOM 是浏览器运行环境为 JS 提供的 API。
一、 JavaScript书写方式
1,行内式:写在标签内部。
<input type="button" value="点我点我" onclick="alert('Hello')" />
2,内嵌式(内联式):写在 head 标签中。
在 HTML 页面的 <body> 标签里放入<script type=”text/javascript”></script>标签
3,外链式:引入外部 JS 文件。
依然是放到 body 标签里,可以和内嵌的 JS 代码并列。
script 标签已经引入了外部 JS 文件,所以这个标签里面,不可以再写 JS 代码。
<script src="utils.js"></script>
二、常量和变量
1,数字常量(数值常量)
直接写数字就行,不需要任何其他的符号。既可以是整数,也可以是浮点数
// 不需要加引号
alert(996); // 996是整数
alert(3.14); // 3.14是浮点数(即带了小数)
2,字符串常量
字符串常量就是用单引号或双引号括起来的内容。可以是单词、句子等,一定要加引号。
在JS中,只要是单引号或双引号括起来的内容,都是字符串常量。
console.log('996');
3,布尔常量
布尔常量就是表达真或者假,在JS中用 true 和 false 来表达。
if (true) {
console.log('如果为真,就走这里面的代码);
}
4,自定义常量
const
自定义常量是ES6中新增的语法。
const 常量名称 = 常量取值;
三、标识符、关键字、保留字
标识符:
在 JS 中所有的可以由我们自主命名的都可以称之为标识符。包括:变量名、函数名、属性名、参数名都是属于标识符。
必须遵守:
只能由字母(A-Z、a-z)、数字(0-9)、下划线(_)、美元符( $ )组成。
不能以数字开头。必须以字母(A-Z、a-z)、下划线(_)或者美元符( $ )开头。变量名中不允许出现空格。尤其注意,变量名中不能出现中划线-,很多人写了多年代码都不知道这一点,让人大跌眼镜。
严格区分大小写(JS 是区分大小写的语言)。
不能使用 JS 语言中保留的「关键字」和「保留字」作为变量名。
变量名长度不能超过 255 个字符。
关键字:
被JS赋予了特殊含义的单词。也就是说,关键字是 JS 本身已经使用了的单词,我们不能再用它们充当变量名、函数名等标识符。关键字在开发工具中会显示特殊的颜色。
JS 中的关键字如下:
if、else、switch、break、case、default、for、in、do、while、
var、let、const、void、function、continue、return、
try、catch、finally、throw、debugger、
this、typeof、instanceof、delete、with、
export、new、class、extends、super、with、yield、import、static、
true、false、null、undefined、NaN
保留字:
实际上就是预留的“关键字”。它们虽然现在还不是关键字,但是未来可能会成为关键字。同样不能用它们当充当变量名、函数名等标识符。
enum、await
abstract、boolean、byte、char、double、final、float、goto、int、long、native、short、synchronized、transient、volatile、
arguments eval Infinity
# 以下关键字只在严格模式中被当成保留字,在ES6中是属于关键字
implements、interface、package、private、protected、public
四、变量的数据类型:基本数据类型和引用数据类型
数据分类
数据分为:静态数据、动态数据。
#静态数据
静态数据是指一些永久性的数据。一般是以文件的形式存储在硬盘上,比如文档、照片、视频等文件。
电脑关闭后,静态数据仍然还在。只要不主动删掉数据或者硬盘没损坏,这些数据就一直都在。
#动态数据
动态数据是在程序运行过程中,动态产生的临时数据,这些数据可能随时发生变化。一般存储在内存中。
电脑关闭后,这些数据会被清除。为何不把应用程序的动态数据加载到硬盘中执行呢?这主要是因为,内存的访问速度比硬盘快无数倍。
JS 的变量数据类型,是在程序运行的过程中,根据等号右边的值来确定的。而且,变量的数据类型是可以变化的。比如说:
var name = 'yifeng';
name = 123; // 强制将变量 name 修改为 数字类型
JS 中一共有八种数据类型
基本数据类型(值类型):
String 字符串、Number 数值、BigInt 大型数值、Boolean 布尔值、Null 空值、Undefined 未定义、Symbol。
引用数据类型(引用类型):Object 对象。
注意:内置对象 Function、Array、Date、RegExp、Error 等都是属于 Object 类型。也就是说,除了那七种基本数据类型之外,其他的,都称之为 Object 类型。
基本数据类型:参数赋值的时候,传数值。
引用数据类型:参数赋值的时候,传地址。
栈内存和堆内存:
我们首先记住一句话:JS 中,所有的变量都是保存在栈内存中的。
然后来看看下面的区别。
基本数据类型:
基本数据类型的值,直接保存在栈内存中。值与值之间是独立存在,修改一个变量不会影响其他的变量。
引用数据类型:
对象是保存到堆内存中的。每创建一个新的对象,就会在堆内存中开辟出一个新的空间;
而变量保存了对象的内存地址(对象的引用),保存在栈内存当中。如果两个变量保存了同一个对象的引用,当一个通过一个变量修改属性时,另一个也会受到影响。
五、基本数据类型:String 和 Boolean
字符串:String
字符串型可以是引号中的任意文本,其语法为:双引号 "" 或者单引号 ''。
var a = 'abcde';
console.log(typeof a);
控制台输出如下:
string
布尔值:Boolean
布尔型有两个值:true 和 false。主要用来做逻辑判断: true 表示真,false 表示假。
var a = true;
console.log(typeof a);
控制台输出结果:
boolean
转义字符:
在字符串中我们可以使用\作为转义字符,当表示一些特殊符号时可以使用\进行转义。
\" 表示 " 双引号
\' 表示 ' 单引号
\\ 表示\
\r 表示回车
\n 表示换行。n 的意思是 newline。
\t 表示缩进。t 的意思是 tab。
\b 表示空格。b 的意思是 blank。
获取字符串的长度
通过字符串的 length 属性可以获取整个字符串的长度。
console.log(str1.length);
字符串拼接
多个字符串之间可以使用加号 + 进行拼接。
六、基本数据类型:Number, Null 和 Undefined
#数值型:Number
在 JS 中所有的数值都是 Number 类型,包括整数和浮点数(小数)。
Null:空对象
null 专门用来定义一个空对象。例如:let a = null,又例如 Object.create(null).如果你想定义一个变量用来保存引用类型,但是还没想好放什么内容,可以在初始化时将其设置为null。
你可以把 null 理解为:null 虽然是一个单独的数据类型,但null 相当于是一个 object,只不过地址为空(空指针)而已。
undefined:未定义类型
#case1:变量已声明,未赋值时
声明了一个变量,但没有赋值,此时它的值就是 undefined
case2:变量未声明(未定义)时
如果你从未声明一个变量,就去使用它,则会报错;
此时,如果用 typeof 检查这个变量时,会返回 undefined。
函数无返回值时
如果一个函数没有返回值,那么,这个函数的返回值就是 undefined。
或者,也可以这样理解:在定义一个函数时,如果末尾没有 return 语句,那么,其实就是 return undefined
函数无返回值时
如果一个函数没有返回值,那么,这个函数的返回值就是 undefined。
或者,也可以这样理解:在定义一个函数时,如果末尾没有 return 语句,那么,其实就是 return undefined。
七、typeof和数据类型转换
变量的数据类型转换:
将一种数据类型转换为另外一种数据类型。
通常有三种形式的类型转换:
转换为字符串类型
转换为数字型
转换为布尔型
typeof 运算符
typeof()表示“获取变量的数据类型”,它是 JS 提供的一个操作符。返回的是小写,语法为:(两种写法都可以)
// 写法1
typeof 变量;
// 写法2
typeof(变量);
typeof 这个运算符的返回结果就是变量的类型。返回结果的类型是字符串。
typeof 的代码写法 返回结果
typeof 数字 number
typeof 字符串 string
typeof 布尔型 boolean
typeof 对象 object
typeof 方法 function
typeof null object
typeof undefined undefined
变量的类型转换的分类
类型转换分为两种:显式类型转换、隐式类型转换。
#显式类型转换
toString()
String()
Number()
parseInt(string)
parseFloat(string)
Boolean()
#隐式类型转换
isNaN ()
自增/自减运算符:++、—-
正号/负号:+a、-a
加号:+
运算符:-、*、/
#隐式类型转换(特殊)
逻辑运算符:&&、||、! 。非布尔值进行与或运算时,会先将其转换为布尔值,然后再运算。&&、||的运算结果是原值,!的运算结果为布尔值。
关系运算符:<、> <= >=等。关系运算符,得到的运算结果都是布尔值:要么是 true,要么是 false。
八、运算符
JS 中的运算符,分类如下:
算数运算符
自增/自减运算符
一元运算符
逻辑运算符
赋值运算符
比较运算符
三元运算符(条件运算符)
算数运算符
算术运算符:
用于执行两个变量或值的算术运算。
常见的算数运算符有以下几种:
运算符 描述
+ 加、字符串连接
- 减
* 乘
/ 除
% 获取余数(取余、取模)
自增和自减
自增 ++
自增分成两种:a++和++a。
(1)一个变量自增以后,原变量的值会立即自增 1。也就是说,无论是 a++ 还是++a,都会立即使原变量的值自增 1。
(2)我们要注意的是:a是变量,而a++和++a是表达式。
那这两种自增,有啥区别呢?区别是:a++ 和 ++a的值不同:(也就是说,表达式的值不同)
a++这个表达式的值等于原变量的值(a 自增前的值)。你可以这样理解:先把 a 的值赋值给表达式,然后 a 再自增。
++a这个表达式的值等于新值 (a 自增后的值)。 你可以这样理解:a 先自增,然后再把自增后的值赋值给表达式。
#自减 --
原理同上。
开发时,大多使用后置的自增/自减,并且代码独占一行,例如:num++,或者 num--。
一元运算符
一元运算符,只需要一个操作数。
正号+
不会对数字产生任何影响
负号 -
负号可以对数字进行取反。
逻辑运算符
逻辑运算符有三个:
&& 与(且):两个都为真,结果才为真。
|| 或:只要有一个是真,结果就是真。
! 非:对一个布尔值进行取反。
注意:能参与逻辑运算的,都是布尔值。
赋值运算符
赋值:将符号右侧的值赋给符号左侧的变量。
#赋值运算符包括哪些
= 直接赋值。比如 var a = 5。意思是,把 5 这个值,往 a 里面存一份。简称:把 5 赋值给 a。
+=。a += 5 等价于 a = a + 5
-=。a -= 5 等价于 a = a - 5
*=。a _ = 5 等价于 a = a _ 5
/=。a /= 5 等价于 a = a / 5
%=。a %= 5 等价于 a = a % 5
比较运算符
比较运算符可以比较两个值之间的大小关系,如果关系成立它会返回 true,如果关系不成立则返回 false。
非数值的比较
对于非数值进行比较时,会将其转换为数字然后再比较。
特殊情况:如果符号两侧的值都是字符串时,不会将其转换为数字进行比较。比较两个字符串时,比较的是字符串的Unicode 编码。【非常重要,这里是个大坑,很容易踩到】
注意==这个符号,它是判断是否等于,而不是赋值。
===全等符号的强调
全等在比较时,不会做类型转换。如果要保证绝对等于(完全等于),我们就要用三个等号===
console.log('6' === 6); //false
console.log(6 === 6); //true
上述内容分析出:
==两个等号,不严谨,"6"和 6 是 true。
===三个等号,严谨,"6"和 6 是 false。
另外还有:==的反面是!=,===的反面是!==
三元运算符
三元运算符也叫条件运算符。
语法:
条件表达式 ? 语句1 : 语句2;
执行的流程:
条件运算符在执行时,首先对条件表达式进行求值:
如果该值为 true,则执行语句 1,并返回执行结果
如果该值为 false,则执行语句 2,并返回执行结果
如果条件的表达式的求值结果是一个非布尔值,会将其转换为布尔值然后再运算。
流程控制语句:选择结构(if和switch)
代码块
用{}包围起来的代码,就是代码块。
流程控制语句分类:
顺序结构
选择结构:if 语句、switch 语句
循环结构:while 语句、for 语句
顺序结构
按照代码的先后顺序,依次执行
if 语句
if 语句有以下三种。
1、条件判断语句
条件成立才执行。如果条件不成立,那就什么都不做。
格式:
if (条件表达式) {
// 条件为真时,做的事情
}
2、条件分支语句
格式 1:
if (条件表达式) {
// 条件为真时,做的事情
} else {
// 条件为假时,做的事情
}
格式 2:(多分支的 if 语句)
if (条件表达式1) {
// 条件1为真时,做的事情
} else if (条件表达式2) {
// 条件1不满足,条件2满足时,做的事情
} else if (条件表达式3) {
// 条件1、2不满足,条件3满足时,做的事情
} else {
// 条件1、2、3都不满足时,做的事情
}
3、if 语句的嵌套
switch 语句(条件分支语句)
switch 语句也叫条件分支语句。
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
...
default:
语句体 n+1;
break;
}
解释:switch 可以理解为“开关、转换” 。case 可以理解为“案例、选项”。
switch 语句的执行流程
执行流程如下:
(1)首先,计算出表达式的值,和 case 依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到 break 就会结束。
(2)然后,如果所有的 case 都和表达式的值不匹配,就会执行 default 语句体部分。
九、流程控制语句:循环结构(for和while)
循环语句:通过循环语句可以反复的执行一段代码多次。
for (var i = 1; i <= 100; i++) {
console.log(i);
}
while 循环语句
语法:
while(条件表达式){
语句...
}
如果有必要的话,我们可以使用 break 来终止循环。
do...while 循环
语法:
do{
语句...
}while(条件表达式)
while 循环和 do...while 循环的区别
这两个语句的功能类似,不同的是:
while 是先判断后执行,而 do...while 是先执行后判断。
也就是说,do...while 可以保证循环体至少执行一次,而 while 不能。
十、面向对象
简介:
面向对象:可以创建自定义的类型,很好的支持继承和多态。
面向对象的特征:封装、继承、多态。
对象的概念
在 JavaScript 中,对象是一组无序的相关属性和方法的集合。
对象的作用是:封装信息。比如Student类里可以封装学生的姓名、年龄、成绩等。
对象具有特征(属性)和行为(方法)。
为什么需要对象
保存一个值时,可以使用变量,保存多个值(一组值)时,可以使用数组。
var person = {};
person.name = '王二';
person.age = 35;
person.sex = '男';
person.height = '180';
对象的分类
1.内置对象:
由ES标准中定义的对象,在任何的ES的实现中都可以使用
比如:Object、Math、Date、String、Array、Number、Boolean、Function等。
2.宿主对象:
由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象。
比如 BOM DOM。比如console、document。
3.自定义对象:
由开发人员自己创建的对象
通过 new 关键字创建出来的对象实例,都是属于对象类型,比如Object、Array、Date等。
总结
干就完了!