==============================================================================
本文仅整理部分常用的知识点,完整请查看[阮一峰老师的文章][1],该文章也是源于其中
==============================================================================
1、let和const
() let声明变量,const声明常量,不允许重复声明
(2) let是块级作用域,不会挂载到window对象中
(3) let需要先声明再调用,不会存在变量提升的问题
2、变量的解构赋值
(1)多个变量赋值,并设置默认值
let [a=1,b,c] = [,2,3]
console.log(a) // 1
(2)json中提取变量
提取json中的data值,并赋值给新的变量number:
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(number);// [867, 5309]
(3)交互2个变量的值
let x = 1;
let y = 2;
[x, y] = [y, x];
console.log(x) //2
3、字符串的扩展
(1)判断一个字符串是否在另一个字符串
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
let s = 'Hello world!';
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
这三个方法都支持第二个参数,表示开始搜索的位置:
let s = 'Hello world!';
s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false
上面代码表示,使用第二个参数n时,endsWith的行为与其他两个方法有所不同。它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束。
(2)repeat()
repeat返回一个新的字符串,并将原字符串重复n次。
'hello'.repeat(2) // "hellohello"
(3)padStart(),padEnd()
自动补全字符串
'x'.padStart(5, 'ab') // 'ababx'
'x'.padEnd(4, 'xaba') // 'xaba'
(4)模板字符串
let tempString = 'hello'
console.log(`${tempString} world !`)
4、数值的扩展
- Number.parseInt(), Number.parseFloat()
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变,减少全局性方法,使得语言逐步模块化。。
- Number.isInteger() 判断一个数值是否为整数
- Math.trunc() 反正一个值的整数部分
-
Math.sign()
参数为正数,返回+1;
参数为负数,返回-1;
参数为 0,返回0;
参数为-0,返回-0;
其他值,返回NaN。
5、函数的扩展
- 函数参数的默认值
function add(x=1,y) {
console.log(x+y)
}
add(undefined,2) // 触发默认值x=1
add(null,2) // 没触发默认值
参数形成单独的作用域,等到初始化结束,这个作用域就会消失:
const x1 = 1;
function f1(x1, y = x1) {
console.log(y);
}
f1(2) // 指向参数形成的单独作用域
const x2 = 1;
function f2(y = x2) {
let x2 = 2;
console.log(y);
}
f2() // 在这个作用域中x2没有定义,所以指向外层的x2
-
reset参数
用于接收函数多余的参数,只能作为最后一个参数
function push(array,...values) {
values.map((item)=>{
array.push(item)
})
console.log(array)
}
let arr = []
push(arr,1,2,3,4) // [1,2,3,4]
-
箭头函数
本节不细述,详情请看阮一峰-箭头函数
(1)简化写法
(2)this指向定义函数时所在的对象,而不是调用函数时的对象,并且this指向无法改变。
6、数组的扩展
-
扩展运算符
将一个数组转为用逗号分隔的参数序列。
//数组的深度拷贝
const a1 = [1, 2];
const a2 = [...a1];
a1[0]=2
console.log(a2) // [1,2]
//合并数组(浅拷贝)
const arr1 = [1,2,3]
const arr2 = [4,5,6]
const arr3 = [...arr1,...arr2] // [1,2,3,4,5,6]
//将字符串转为数组(调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换)
const str = 'hello'
console.log([...str]) // ["h", "e", "l", "l", "o"]
-
Array.from()
用于将两类对象转为数组
// 1、类数组对象:任何length属性的对象
const obj = {
'0': 'gao',
'1': '26',
length:2
}
console.log(Array.from(obj)) // ['gao','26']
//2、可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)
-
Array.of()
将一组值,转换为数组,如果没有参数则返回空数组,用来替代Array()或new Array()
Array.of(2) // [2]
Array(2) // [,,]
- 数组实例的 find()和findIndex()
// find():返回第一个符合条件的成员,没有返回undefined
const arrFind = [1,4,-5,10].find(value => value<0)
console.log(arrFind) // -2
//findIndex():返回第一个符合条件成员的位置,没有返回-1
const arrFindIndex = [1,4,-5,10].findIndex(function (value,index,arr) {
return value < 0
})
console.log(arrFindIndex) // 2
-
数组实例的 fill()
替换数组中的元素
console.log([1,2,3].fill(4)) // 【4,4,4】默认从开始到结束都替换
console.log([1,2,3].fill(4,1,2)) // [1,4,3] 替换数组下标第1个到第2个
- 数组实例的 entries(),keys() 和 values()
for (let index of ['a', 'b'].keys()) {
console.log(index);
}
// 0
// 1
for (let elem of ['a', 'b'].values()) {
console.log(elem);
}
// 'a'
// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem);
}
// 0 "a"
// 1 "b"
-
数组实例的 includes()
返回一个布尔值,表示某个数组是否包含给定的值,替代es6之前的indexof
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
[1, 2, NaN].includes(NaN) // true
-
数组实例的 flat()
将嵌套的数组“拉平”,变成一维的数组
//默认拉平一层
console.log([1,2,[3,[4,5]]].flat()) // [1,2,3,[4,5]]
//传入要拉平的层数
console.log([1,2,[3,[4,5]]].flat(2)) // [1,2,3,4,5]
//传入Infility,全部拉平
console.log([1,2,[3,[4,5]]].flat(Infinity)) // [1,2,3,4,5]
7、对象的扩展
-
Object.assign()
对象的合并,将一个对象的所有可枚举属性复制到另一个对象,同名属性会直接替换。
//浅拷贝:如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
const objName = {name: {surname: 'gao'}}
const objAge = {age:26}
const person = Object.assign({},objName,objAge)
objName.name.surname = 'danny'
console.log(person.name.surname) // 'danny'
-
Object.setPrototypeOf()
设置原型对象
// 将proto设置为obj的原型对象
let proto = {};
let obj6 = { x: 10 };
Object.setPrototypeOf(obj, proto);
proto.y = 20;
proto.z = 40;
obj6.x // 10
obj6.y // 20
obj6.z // 40
-
Object.getPrototypeOf()
读取一个对象的原型对象
function Rectangle() {
// ...
}
const rec = new Rectangle();
Object.getPrototypeOf(rec) === Rectangle.prototype// true
Object.setPrototypeOf(rec, Object.prototype);
Object.getPrototypeOf(rec) === Rectangle.prototype// false
- Object.keys(),Object.values(),Object.entries()
//Object.keys():返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。
const obj6 = { foo: 'bar', baz: 42 };
Object.keys(obj6) // ["foo", "baz"]
//Object.values():方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。
const obj7 = { foo: 'bar', baz: 42 };
Object.values(obj7) // ["bar", 42]
//Object.entries() :返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。
const obj8 = { foo: 'bar', baz: 42 };
Object.entries(obj8) // [ ["foo", "bar"], ["baz", 42] ]
8、Symbol
-
介绍
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。 - 作为属性名的 Symbol
//Symbol 值作为对象属性名时,不能用点运算符
const mySymbol = Symbol();
const va = {};
va.mySymbol = 'Hello!';
va[mySymbol] // undefined
va['mySymbol'] // "Hello!"
-
属性名的遍历
Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。
const obj = {};
let a = Symbol('a');
let b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'World';
const objectSymbols = Object.getOwnPropertySymbols(obj);
objectSymbols// [Symbol(a), Symbol(b)]
//另一个新的 API,Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
let obj = {
[Symbol('my_key')]: 1,
enum: 2,
nonEnum: 3
};
Reflect.ownKeys(obj)// ["enum", "nonEnum", Symbol(my_key)]
9、Set和Map数据结构
1、Set
- Set()是个构造函数,用来生成类似数组的数据结构,但是成员值都是唯一的。
- 去重
const set = [...new Set([1,2,3,3,4,4])] // 1,2,3,4
- Set实例的属性和方法
const set = new Set([1,2,3])
// 添加值,并返回Set结构本身
set.add(4)
console.log([...set]) //[1,2,3,4]
//删除值,返回bool值表示是否成功
set.delete(4)
console.log(set) //[1,2,3]
//表示是该值是否为Set成员,返回bool值
console.log(set.has(3))
//清除所有成员,没有返回值
set.clear()
console.log([...set]) //[]
- 遍历操作
const set2 = new Set([1,2,3])
// keys():返回键名的遍历器
for(let i of set2.keys()){
console.log(i)
// 1
// 2
// 3
}
// values():返回键值的遍历器(set结构没有键名,只有键值,所以keys和values方法一样)
for(let i of set2.values()){
console.log(i)
// 1
// 2
// 3
}
// entries():返回键值对的遍历器
for(let i of set2.entries()){
console.log(i)
// [1,1]
// [2,2]
// [3,3]
}
//foreach遍历器
set2.forEach((key,value)=>{
console.log(`${key}:${value}`)
// 1:1
// 2:2
// 3:3
})
2、Map
-
Map实例的属性和方法
和Set一致 - 遍历器
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
// 等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。