ECMAScript 6.0
(以下简称 ES6)是 JavaScript
语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言
关于ES6:
JavaScript
的创造者 Netscape 公司,决定将 JavaScript
提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript
,这个版本就是 1.0 版。ES6的支持情况:
作用域
作用域分为
局部作用域分为函数作用域和块作用域。
函数作用域
块作用域
<script>
标签和.js
文件的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问。全局作用域中声明的变量,任何其它作用域都可以被访问
作用域链本质上是底层的变量查找机制。
垃圾回收机制(Garbage Collection)简称GC
内存的生命周期
两种常见的浏览器垃圾回收算法:
引用计数
标记清除法
闭包
jsfunction outer(){
const a = 1
function f(){
console.log(a) //内部函数使用到了外部函数的变量
}
f()
}
outer()
jsfunction outer(){
let i = 1
function fn(){
console.log(i)
}
return fn
}
const fun = outer()
fun() // 1
// 外层函数使用内部函数的变量
// 简约写法
function outer(){
let i = 1
return ()=>{
console.log(i)
}
}
const fun = outer()
fun()
javascript中允许变量声明前被访问(仅存在于var声明变量)
注意
函数提升
js// 调用函数
foo()
// 声明函数
function foo(){
console.log('声明之前即被调用')
}
// 不存在提升现象
bar() //错误
var bar = function(){
console.log('...')
}
arguments
是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参
js// 求和函数,计算所有参数的和
function sum(){ // 动态参数不需要指定参数
let s = 0;
for(let i = 0;i< arguments.length;i++){
s += arguments[i]
}
console.log(s)
}
// 调用求和函数
sum(5,10)
sum(1,2,4)
剩余参数允许我们将一个不定数量的参数表示为一个数组
jsfunction getSum(...other) {
console.log(other)
}
getSum(1,2,3)
...
是语法符号,置于最末函数形参之前,用于获取多余的实参...
获取的剩余实参,是个真数组jsfuncyion config(baseURL,...other) {
}
//调用函数
config('http://baidu.com', 'get','json');
展开运算符(...
),将一个数组进行展开
jsconst arr = [1,5,3,8,2]
console.log(..arr) // 1 5 3 8 2
典型应用:求数组最大值(最小值)
jsconst arr = [1,2,3]
// ...arr === 1,2,3
console.log(Math.max(...arr))
典型应用:合并数组
jsconst arr1 = [1,2,3]
const arr2 = [3,4,5]
const arr = [...arr1,...arr2] // 1,2,3 , 3,4,5
剩余参数
展开运算符
箭头函数
语法1:普通形式
js// 普通函数
const fn = function() {
console.log('普通函数')
}
fn()
// 箭头函数
const fn = () => {
console.log('箭头函数')
}
fn()
语法2:只有一个参数可以省略小括号
jsconst fn = function (x) {
return x + x
}
console.log(fn(1))
// 箭头函数
const fn = x => {
return x + x
}
console.log(fn(1))
语法3:如果函数体只有一行代码,可以写到一行上,并且无需写return直接返回值
jsconst fn = (x,y) => x + y
console.log(fn(1,2))
语法4:加括号的函数体返回对象字面量表达式
jsconst fn = uname => ({uname: uname})
console.log(fn('箭头函数'))
arguments
动态参数arguments
动态参数,但是有剩余参数...args
以前this
的指向
this
就指向谁js//
console.log(this) // window
function fn() {
console.log(this) // window
}
fn()
// 对象
const obj = {
uname: '对象',
whichThis: function() {
console.log(this) // obj
}
}
obj.whichThis()
箭头函数不会创建自己的this
,它只会从自己的作用域链的上一层沿用this
。
jsconst fn = () => {
console.log(this) // window
}
fn()
// 对象方法this
const obj = {
uname: '对象',
whichThis: () => {
console.log(this) // 指向window
}
}
obj.whichThis()
// 对象成员函数中嵌套箭头函数
const obj = {
uname: '对象',
whichThis: function() {
let i = 10
const count = () => {
console.log(this) // obj, 箭头函数寻找上层函数指向的this 即obj
}
}
}
在开发中【使用箭头函数前需要考虑函数中this 的值】,事件回调函数使用箭头函数时,this为全局的window,因此DOM事件回调函数为了简便,还是不太推荐使用箭头函数
js// 箭头函数
btn.addEventListener('click', () => {
console.log(this) // this指向window
})
// 普通函数
btn.addEventListener('click', function () {
console.log(this) // this指向DOM对象
})
数组解构
基本语法:
js// 赋值
const arr = [100,60,80]
const [max,min,avg] = arr
// 等价于
const max = arr[0]
const min = arr[1]
const avg = arr[2]
典型应用:交换两个变量
jslet a = 1
let b = 3; // 必须加分号
[b,a] = [a,b]
console.log(a) // 3
console.log(b) // 1
javascript必须加分号的情况
js// 1. 立即执行函数
(function t() { })();
// 或者
;(function t() { })()
// 2. 数组解构
;[b,a] = [a,b]
jsconst [a,b,c,d] = [1,2,3]
console.log(a) // 1
console.log(b) // 2
console.log(c) // 3
console.log(d) // undefined
// 防止underfined传递
const [a=0,b=0] = []
console.log(a) // 0
console.log(b) // 0
jsconst [a,b] = [1,2,3,4]
console.log(a) // 1
consloe.log(b) // 2
// 剩余参数
const [a,b,...c] = [1,2,3,4]
console.log(a) // 1
consloe.log(b) // 2
console.log(c) // [3,4] 真数组
js// 按需导入
const [a,,c,d] = [1,2,3,4]
console.log(a) // 1
console.log(c) // 3
console.log(d) // 4
支持多维数组解构
jsconst [a,b,c] = [1,2,[3,4]]
console.log(a) // 1
console.log(b) // 2
console.log(c) // [3,4]
const [a,b,[c,d]] = [1,2,[3,4]]
console.log(a) // 1
console.log(b) // 2
console.log(c) // 3
console.log(d) // 4
对象解构
基本语法:
赋值运算符=左侧的0用于批量声明变量,右侧对象的属性值将被赋值给左侧的变量
对象属性的值将被赋值给与属性名相同的变量
注意解构的变量名不要和外面的变量名冲突否则报错
对象中找不到与变量名一致的属性时变量值为undefined
jsconst {uname, age} = {uname: 'zhangsan', age: 18}
// 等价于 const uname = obj.uname
console.log(uname,age); // zhangsan 18
// 解构变量名要与对象成员属性名相同
const {vname,age} = {uname:'zhangsan',age:18}
console.log(vname,age); // underfined 18
// 但也可以重新改名
const { uname: username, age } = { uname: 'zhangsan', age: 18 }
console.log(username, age); // zhangsan 18
js// 解构数组对象
const obj = [
{
uname: 'zhangsan',
age: 18
}
]
const [{uname,age}] = obj
console.log(uname,age);
js// 多级对象解构
const obj = {
a: {
b: {
c: 1
}
}
}
const { a: { b: { c } } } = obj
console.log(c) // 1
js// 处理后台数据
const obj = {
"code": 20041,
"msg": "查询成功",
"data": [
"娱乐",
"其他活动",
"学习",
"工作区",
"视频"
]
}
const { data } = obj //获得data对象
// 将解构的对象传递给函数
// 方式一:
function render(obj) {
const { data } = obj
// 处理data
console.log(arr)
}
render(obj)
// 方式二:参数直接解构
function redner({ data }) {
// 处理数据
console.log(data)
}
render(obj)
forEach
forEach()
方法用于调用数组的每个元素,并将元素传递给回调函数jsconst arr = ['red','green','pink']
arr.forEach(function(item,index){
console.log(item) // red green pink
console.log(index) // 索引
})
map
jsconst arr = ['red','green','pink']
arr.map(function(item,index){
console.log(item) // red green pink
console.log(index) // 索引
})
jsconst arr = ['red', 'green', 'pink']
const arrMap = arr.map(function (item, index) {
return item + ' pig' // 处理数组元素
})
console.log(arrMap); // [ 'red pig', 'green pig', 'pink pig' ]
const arr = [10,20,30]
const newArr = arr.map(function(item){
return item + 10
})
console.log(newArr); // [20,30,40]
join
join(分割符)
,join的参数为转换成的字符串的分隔符jsconst arr = [1, 2, 3, 4, 5];
console.log(arr.join('-')); // 1-2-3-4-5
filter
filter()
方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素jsconst arr = [30, 20, 12, 10, 5, 1];
const newArr = arr.filter(item => {
return item > 10;
})
console.log(newArr); // [30, 20, 12]
reduce返回累计处理的结果,经常用于求和等
js// 没有初始值
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const total = arr.reduce(function(prev,curr){
return prev + curr
})
console.log(total); // 55
// 有初始值
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const total = arr.reduce(function(prev,curr){
return prev + curr
},20) // 初始值
console.log(total);
实现过程
jsconst obj = {
a: 1,
b: 2,
c: 3
}
jsconst obj = new Object()
console.log(obj)
构造函数∶
使用场景:
{...}
语法允许创建一个对象。比如我们创建了佩奇的对象,继续创建乔治的对象还需要重新写一遍,此时可以通过构造函数来快速创建多个类似的对象。js// 构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
const p = new Person('张三', 20);
console.log(p.name); // 张三
本质
约定
new
操作符来执行new
创建对象this
指向新对象this
指向的对象,添加新的属性实例成员:
js// 实例成员
function Person(name, age) {
this.name = name
this.age = age
}
// 实例成员
var p1 = new Person('zs', 18)
var p2 = new Person('ls', 20)
// 实例属性
p1.name = 'zs'
p1.age = 18
p2.name = 'ls'
p2.age = 20
// 实例方法
p1.say = function () {
console.log('...')
}
p2.say = function () {
console.log('...')
}
静态成员
js// 静态成员
function Person(name,age) {
// 省略实例成员
}
// 静态属性
Person.eyes = 2
Person.arms = 2
//静态方法
Person.walk = function() {
console.log('...')
console.log(this.eyes)
}
说明
静态成员只能构造函数来访问
静态方法中的this指向构造函数
比如 Date.now()
Math.PI
Math.random()
在JavaScript中最主要的数据类型有6种:
基本数据类型
引用类型
字符串、数值、布尔等基本类型也有专门的构造函数,这些我们称为包装类型
Object是内置的构造函数,用于创建普通对象
jsconst user = new Object({name: '小明',age: 15})
Object.keys(对象)
获得所有的属性名jsconst o = { name: 'zhangsan', age: 6 }
console.log(Object.keys(o)); // [ 'name', 'age' ]
Object.values(对象)
获得所有的属性值jsconst o = { name: 'zhangsan', age: 6 }
console.log(Object.values(o)); // [ 'zhangsan', 6 ]
Object.assign(对象)
静态方法,常用于对象拷贝js// 拷贝对象 把 o 拷贝给 obj
const o = {name: 'zhangsan', age: 6}
const obj = {}
Object.assign(obj,o)
console.log(obj) // {name: 'zhangsan', age: 6}
jsconst o = {name: 'zhangsan',age: 18}
Object.assign(o,{gender: '女'})
console.log(o) // { name: 'zhangsan', age: 18, gender: '女' }
方法 | 作用 | 说明 |
---|---|---|
forEach | 遍历数组 | 不返回数组,经常用于查找遍历数组元素 |
filter | 过滤数组 | 返回新数组,返回的是筛选满足条件的数组元素 |
map | 迭代数组 | 返回新数组,返回的是处理之后的数组元素,想要使用返回的新数组 |
reduce | 累计器 | 返回累计处理的结果,经常用于求和等 |
join
数组元素拼接为字符串,返回字符串(重点)find
查找元素,返回符合测试条件的第一个数组元素值,如果没有符合条件的则返回undefined
(重点)every
检测数组所有元素是否都符合指定条件,如果所有元素都通过检测返回true
,否则返回false
(重点)some
检测数组中的元素是否满足指定条件如果数组中有元素满足条件返回true
,否则返回false
concat
合并两个数组,返回生成新数组sort
对原数组单元值排序splice
删除或替换原数组单元reverse
反转数组findIndex
查找元素的索引值length
用来获取字符串的度长(重点)split('分隔符')
用来将字符串拆分成数组(重点)substring (需要截取的第一个字符的索引[,结束的索引号])
用于字符串截取(重点)startsWith(检测字符串[,检测位置索引号])
检测是否以某字符开头(重点)includes(搜索的字符串[,检测位置索引号])
判断一个字符串是否包含在另一个字符串中,根据情况返回true或 false(重点)toUppercase
用于将字母转换成大写toLowerCase
用于将就转换成小写indexOf
检测是否包含某字符endsWith
检测是否以某字符结尾replace
用于替换字符串,支持正则匹配match
用于查找字符串,支持正则匹配正则表达式
使用场景
/^[a-z0-9_-]{3,16}$/
语法
jsconst reg = /表达式/
/ /
是正则表达式字面量jsreg.test('正则表达式')
jsconst reg = /表达式/
console.log(reg.test('正则表达式')); // true
jsconst reg = /表达式/
console.log(reg.exec('正则表达式'));
// [ '表达式', index: 2, input: '正则表达式', groups: undefined ]
普通字符:
元字符(特殊字符)
abcdefghijklm.....
[a-z]
分类
\d
表示0~9)边界符 | 说明 |
---|---|
^ | 表示匹配行首的文本(以谁开始) |
$ | 表示匹配行尾的文本(以谁结束) |
js// 边界符
console.log(/^你/.test('你好')); // true
console.log(/$你/.test('你好')); // false
console.log(/^你$/.test('你')); // true
console.log(/^你$/.test('你你')); // false
量词 | 说明 |
---|---|
* | 重复零次或更多次 >=0 |
+ | 重复一次或更多次 >=1 |
? | 重复零次或一次 `1 |
{n} | 重复n次 n |
{n,} | 重复n次或更多次 >=n |
{n,m} | 重复n到m次 n<= x < =m |
jsconsole.log(/你{3}/.test('你你')); // false
console.log(/你{3}/.test('你你你')); // true
console.log(/你{3,}/.test('你你')); // false
console.log(/你{3,}/.test('你你你')); // true
console.log(/你{3,4}/.test('你你')); // false
console.log(/你{3,4}/.test('你你你')); // true
字符类 | 说明 |
---|---|
[] | 后面的字符串只要包含[] 中任意一个字符,都返回true在 [] 中可以使用连字符- 例如: [a-z] 表示a到z 的26个英文字母[a-zA-Z] 表示大小写英文字母[0-9] 表示0~9的数字都支持在 [] 中加上^ 表示取反比如: [^a-z] 匹配除了小写字母以外的字符,注意要写到[] 里面 |
. | 匹配除换行符之外的任何单个字符 |
` | ` |
jsconsole.log(/^[abc]$/.test('a')); // true
console.log(/^[abc]$/.test('b')); // true
console.log(/^[abc]$/.test('c')); // true
console.log(/^[abc]$/.test('d')); // false
console.log(/^[abc]$/.test('ab')); // false
console.log(/^[abc]{2}$/.test('ab')); // true
console.log(/^[A-Z]$/.test('a')); // false
console.log(/^[A-Z]$/.test('A')); // true
console.log(/^[a-zA-Z0-9]$/.test(2)); // true
预定义
预定类 | 说明 |
---|---|
\d | 匹配0-9 之间的任一数字,相当于[0-9] |
\D | 匹配所有0-9 以外的字符,相当于[^0-9] |
\w | 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_] |
\W | 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_] |
\s | 匹配空格(包括换行符、制表符、空格符等),相等于[\t\r\n\v\f] |
\S | 匹配非空格的字符,相当于[^\t\r\n\v\f] |
例如
jsconst dateFormat = /^\d{4}-\d{1,2}-\d{1,2}/
console.log(dateFormat.test('2019-01-01')); // true
修饰符约束正则执行的某些细节行为,如是否区分大小写、是否支持多行匹配等
js// 语法
/表达式/修饰符
jsconsole.log(/^java$/.test('java')); // true
console.log(/^java$/.test('Java')); // false
console.log(/^java$/i.test('Java')); // true
jslet str = 'java是世界上最好的语言.Java'
str = str.replace(/java/ig, 'js') // 使用g,全局修改
console.log(str);
本文作者:peepdd864
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!