JavaScript 基础知识总结
文章内容为本人在最初学习 JS 时整理的笔记
由于技术有限,知识点较为基础,也稍微有些杂乱
如有错误,欢迎指出
输入输出
1 | prompt(); //弹出输入框 |
变量
声明、赋值和变量的初始化
1 | var a; //声明 |
特殊情况
- 只声明 不赋值 -> undefined
- 不声明 不赋值 -> 使用时会报错
- 不声明直接赋值 -> 可以使用
变量命名规范
- 由字母、数字、下划线、美元符号$组成
- 严格区分大小写
- 不能以数字开头
- 不能是关键字、保留字
- 变量名必须有意义
- 遵守驼峰命名法
数据类型
typeof -> 返回数据类型
基本数据类型
Number 数字
Boolean 布尔值
String 字符串
undefined 未定义
null 空值
(ES6 新增)
Symbol 唯一标识符
引用数据类型
Object 对象
基本和引用类型的区别
JS 中的变量都是保存到栈内存中的
基本数据类型的值直接在栈内存中存储
值与值之间是独立存在的,修改一个变量不会影响其他变量
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间
而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,当通过一个变量修改属性时,另一个也会受到影响
当比较两个基本数据类型时,就是比较它们的值
当比较两个引用数据类型时,比较的是对象的内存地址
两个对象即使一模一样,如果地址不同,也会返回 false
数据类型转换
转换为字符串
变量.toString()
String(变量) 强制转换
‘+’拼接字符串(隐式转换,推荐)
转换为数字型
parseInt(string) 函数 将 string 类型转成整型
parseFloat(string) 函数 将 string 类型转成浮点型
Number() 强制转换函数 将 string 类型转成数字型
隐式转换 利用算术运算符隐式转换
转换为布尔型
Boolean() 函数:代表空、否定的值都会被转换为 false。
对象和函数
对象的分类
内建对象
由 ES 标准中定义的对象,在任何 ES 的实现中都可以使用
比如: Math String Number Boolean Function Object宿主对象
由 JS 的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
比如 BOM DOM自定义对象
由开发人员自己创建的对象
作用域
作用域指一个变量的作用范围
在 JS 中一共有两种作用域:
全局作用域
- 直接编写在 script 标签中的 JS 代码,都在全局作用域
- 全局作用域在页面打开时创建,在页面关闭时销毁
- 在全局作用域中有一个全局对象 window
它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用 - 在全局作用域中:
创建的变量都会作为 window 对象的属性保存
创建的函数都会作为 window 对象的方法保存 - 全局作用域中的变量都是全局变量,在页面的任意部分都可以访问到
函数作用域
- 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
- 没调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的
- 在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量
- 当在函数作用域中操作变量时,现在自身作用域中寻找,如果有就直接使用,没有则去上一级作用域中寻找
this
解析器在调用函数时会向函数内部传递一个隐含的参数,这个隐含的参数就是 this,
this 指向的是一个对象,这个对象我们称为为函数执行的上下文对象,
根据函数的调用方式的不同,this 会指向不同的对象,
主要有以下几个场景:
- 以函数的形式调用时,this 永远都是 window
- 以方法的形式调用时,this 就是调用方法的那个对象
- 以构造函数的形式调用时,this 就是新创建的那个对象
- 使用 call 和 apply 调用时,this 是传入的那个对象
构造函数
构造函数本质上就是一个普通的函数,创建方式和普通函数没有区别
构造函数命名上习惯首字母大写
构造函数需要使用 new 关键字来调用
构造函数的执行流程:
- 立刻创建一个新的对象
- 将新建的对象设置为函数中的 this,在构造函数中可以使用 this 来引用新建的对象
- 逐行执行函数中的代码
- 将新建的对象作为返回值返回
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类
我们将通过一个函数创建的对象,称为是该类的实例
this 的情况:
当以函数的形式调用时,this就是window
当以方法的形式调用时,谁调用方法谁就是this
当以构造函数的形式调用时,this就是新创建的那个对象
1 | /* 创建一个Person构造函数 |
原型
函数 prototype 属性 ==》 原型对象 (显式原型)
在定义函数时自动添加的,默认值是一个空的 Object 实例对象(Object 例外)
实例 __proto__ 属性 ==》 原型对象 (隐式原型)
在创建对象时自动添加的,默认值为构造函数的 prototype 属性值
即实例对象的隐式原型的值为其对应的构造函数显式原型的值
我们能直接操作显式原型,但不能操作隐式原型
- 原型对象 constructor 属性 ==》 函数对象
所有函数的 __proto__ 都是一样的(都是由构造函数 Function 创建的实例,包括 Function 本身)
Object 的原型对象是原型链的尽头(Object.prototype.__proto__ == null)
1 | /* |
1 | function MyClass() {} |
IIFE
Immediately-Invoked Function Expression 立即调用函数表达式、
1 | //匿名函数自调用 |
instanceof
- 表达式 A instanceof B
- 如果 B 函数的显式原型对象在 A 对象的原型链上,则返回 true
函数的方法
1 | function fun() { |
- this 的情况
- 以函数的形式调用时,this 永远都是 window
- 以方法的形式调用时,this 就是调用方法的那个对象
- 以构造函数的形式调用时,this 就是新创建的那个对象
- 使用 call 和 apply 调用时,this 是指的那个对象
arguments
1 | /* |
Date 对象
1 | //创建一个Date对象 |
Math 对象
Math 和其他对象不同,它不是一个构造函数,它属于一个工具类,不用创建对象,它里面封装了数学运算相关的属性和方法
属性 E,LN2,LN10,PI …
方法 abs(),sqrt(),max(),min() …
ceil() 向上取整
floor() 向下取整
round() 四舍五入
random() 生成一个 0-1 之间的随机数
1
2//生成一个x-y之间的随机数
Math.round(Math.random() * (y - x) + x);
数组
数组的四个常用方法
push()
- 该方法可以向数组的末尾添加一个或多个元素,并返回数组的新长度
- 可以将要添加的元素作为方法的参数传递,这些元素将会自动添加到数组的末尾
pop()
- 该方法可以删除数组的最后一个元素,并将被删除的元素返回
unshift()
- 向数组开头添加一个或多个元素,并返回新的数组长度
- 添加元素后,其他元素的索引会相应调整
shift()
- 可以删除数组的第一个元素,并将其作为返回值返回
数组的遍历
- for 循环
1 | var arr = ['张三', '李四', '王五', '马六']; |
- forEach *
1 | //forEach() 不支持IE9以下浏览器 |
slice()和 splice()
slice()
- 可以用来从数组中提取指定元素
- 参数:截取开始的位置索引,截取结束的位置索引 (前闭后开,第二个参数可以不写,默认取到最后一个元素)
- 索引可以是负值 -1 为最后一个元素
splice()
- 删除元素并向数组添加新元素
- 将指定元素从原数组中删除并返回
- 参数:
第一个:开始位置索引
第二个:删除的数量
第三个及以后:
可以传递一些新的元素,这些元素会自动插入到开始索引位置之前
数组去重
1 | //创建一个数组 |
数组其他方法
1 | /* 1 |
包装类
在 JS 中为我们提供了三个包装类,通过包装类可以将基本数据类型转换为对象
String()
Number()
Boolean()
但是我们在实际应用中不会使用基本数据类型的对象。
方法和属性只能添加给对象,不能添加给基本数据类型
当我们对一些基本数据类型去调用属性和方法时
浏览器会临时使用包装类将其转换为对象,然后再调用属性和方法
1 | var s = 123; |
字符串相关操作
在底层字符串是以字符数组的形式保存的
length 属性:获取字符串长度
方法
charAt() 可以返回字符串指定位置的字符
charCodeAt() 返回指定位置字符的 Unicode 编码
String.fromCharCode() 可以根据字符编码获取字符
concat() 连接字符串
indexOf()
检查一个字符串中是否含有指定内容,如果有则返回第一次出现的索引,没有则返回-1
可以指定第二个参数,表示开始查找的位置
lastIndexOf() 与从后往前找
slice() 从字符串中截取指定内容,同数组 slice()方法
substring()
和 slice()类似,不同的是此方法参数不接受负值,传递负值则默认使用 0
还会自动调整参数位置,如果前大于后,则交换位置
split()
可以将一个字符串拆分为一个数组
需要一个字符串作为参数,根据该字符串拆分数组
toUpperCase(), toLowerCase() 转大小写
正则表达式
创建正则表达式对象
语法:var 变量名 = new RegExp(“正则表达式”[,”匹配模式”]);
使用字面量来创建正则表达式
语法:var 变量名 = /正则表达式/匹配模式;
匹配模式: i 忽略大小写 g 全局匹配
正则表达式的方法:
test() 使用这个方法可以传入一个字符串来检查其是否符合正则表达式,返回布尔值
注意:使用构造函数创建正则表达式时,由于它的参数是一个字符串,而 \ 是字符串中的转义字符,如果要使用 \ 则需要使用 \\ 来代替
语法
方括号
用于查找某个范围内的字符
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
[a-z] | 查找任何从小写 a 到小写 z 的字符。 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
[A-z] | 查找任何从大写 A 到小写 z 的字符。 |
[adgk] | 查找给定集合内的任何字符。 |
[^adgk] | 查找给定集合外的任何字符。 |
(red|blue|green) | 查找任何指定的选项。 |
元字符
元字符(Metacharacter)是拥有特殊含义的字符:
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\0 | 查找 NUL 字符。 |
\n | 查找换行符。 |
\f | 查找换页符。 |
\r | 查找回车符。 |
\t | 查找制表符。 |
\v | 查找垂直制表符。 |
\xxx | 查找以八进制数 xxx 规定的字符。 |
\xdd | 查找以十六进制数 dd 规定的字符。 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
量词
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
n{X} | 匹配包含 X 个 n 的序列的字符串。 |
n{X,Y} | 匹配包含 X 至 Y 个 n 的序列的字符串。 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 |
n$ | 匹配任何结尾为 n 的字符串。 |
^n | 匹配任何开头为 n 的字符串。 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串。 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 |
字符串和正则表达式相关的方法
split() 可以将字符串拆分成一个数组
可以传递一个正则表达式作为参数
不需要设置全局匹配模式
search() 可以搜索字符串中是否含有指定内容
如果搜索到则返回第一次出现的索引,没有则返回-1
可以接收一个正则表达式作为参数
只会匹配第一个,即使设置了全局匹配模式
match() 可以根据正则表达式,将内容从字符串中提取出来
默认只会找到第一个符合要求的内容,我们可以设置全局匹配模式以匹配所有内容
该方法会将匹配到的内容封装到一个数组中返回,即使只有一个结果
replace() 可以将字符串中指定内容替换为新内容
参数:1.被替换内容(可以接收正则表达式) 2.新的内容
默认只会替换第一个匹配项
将新内容设置为空串可以用于删除指定内容