symbol
symbol是一种基本类型,代表唯一值
例如:
let s=Symbol(1)
let s2=Symbol(1)
console.log(s===s2)
console.log(typeof s)
let/const
let和var区别
1. var可以重复定义,let不能重复定义
2. var有变量提升,而let没有变量提升
3. var没有块级作用域,而let有块级作用域
作用域:
定义:变量的使用范围
分类:
1.全局作用域:在函数外部定义的变量范围,任何位置都可以访问
2.局部作用域:函数内部定义的变量范围,只能在当前函数内部访问,函数外部不能访问
3.块级作用域:用let或const在大括号中定义的变量范围
let和const区别:
区别:let定义变量,const定义常量
相同点:都不能重复定义,都有块级作用域,都不能变量提升
注意:如果const定义的是基本类型,值不能重新赋值,如果const定义的一个对象,对象中的属性值可以更改
箭头函数
箭头函数和普通函数的区别?
区别1:
普通函数的this通常谁调用,this就指向谁
箭头函数自身this,它的this永远指向它所在父级function函数的this(上下文)
区别2:
普通函数可以new实例化,箭头函数不能new
区别3:
普通函数有arguments,箭头函数没有arguemnts
一、普通函数创建方式:
1.函数声明
function getName() {
console.log('我是getName函数')
}
2.函数表达式
let getUserInfo=function() {
console.log('我是getUserInfo函数')
}
二、箭头函数:
(参数1,参数2,...)=>{
}
解构赋值
解构赋值:可以解构对象,也可以解构数组
例如:
let obj = {
name: 'alice',
age: 20,
address: '北京'
}
let arr = [100, 200, 300, 'hello'];
let [first, second] = arr
console.log(first)
console.log(second)
let res = {
code: 0,
msg: '成功登录',
data: {
token: '23qtw3jkwtjlk34j6tklw456jlk45w',
username: 'admin',
password: '123456',
info: ['运动', '本科', '程序员']
}
}
res.data.info[0]
let {
code,
msg,
data: {
token,
username,
info: [sport, xueli, career]
}
} = res
console.log('token:', token)
console.log('sport', sport)
console.log('xueli', xueli)
模板字符串
JS定义字符串有3种形式:
单引号:‘’
双引号:“”
反引号:`` 特点:可以解析变量
例如:
let str='hello'
let str2="welcome"
let str3="北京"
let result=`我爱${str3}`
console.log(result)
默认值
通常默认值是给函数形参通过=号设置默认值
let getInfo=function(title,content) {
title=title || '我是默认标题111'
content=content || '内容区111'
console.log(title)
console.log(content)
}
getInfo('我是前端开发工程师')
扩展(展开)运算符和rest操作符
...
1.扩展(展开)运算符
展开对象:
展开数组:
2.rest操作符
例如:
let obj = {
name: 'alice',
age: 20,
address: '北京'
}
let obj2={
hobby:'运动',
xueli:'本科'
}
let result={...obj,...obj2}
let arr=[22,33,45]
let arr2=[444,33,22]
let mergeArr=[...arr,...arr2]
function getData(title,...args) {
console.log('title:',title)
console.log('args:',args)
}
getData('显示数据:',22,33,44)
map和set
map:是对象的升级版本
let m1=new Map()
添加:m1.set()
获取:m1.get()
删除:m1.delete()
获取长度:m1.size()
set:是数组的升级版本,但只能存放不重复的数据
let s1= new Set()
添加:s1.add()
获取:通过forEach或for of遍历
s1.forEach(item=>{
console.log(item)
})
for(let [key,value] of s1.entries() ) {
console.log(value)
}
例如:实现数组去重
let arr=[3,34,5,45,3,2,3,2,2,2,2]
可以用Set对数组去重
例如:[...new Set(arr)]
Promise
promise解决问题:解决回调地狱的异步方案
promise有三种状态:成功,失败,进行中,注意:只要执行,要不成功,要不失败
proimise抛出的API:
.then()
.catch()
Promise.all([a(),b(),c()]).then(res=>{[a的值,b的值,c值]})
finally()无论成功失败都会执行
race([a(),b(),c()])只要有一个状态改变,就返回
....
async/await(ES7)
用同步的思想编写异步代码
function getData() {
return new Promise((resolve,rejct)=>{
if(res.code===0) {
resolve(res.data)
}
})
}
async function 函数名() {
}
await必须配合async使用,await后面通常跟一个异步函数(promise返回的形式)
字符新增API
includes():检测字符串是否含有某个字符
startsWith():检测字符串中是否以某个字符开头
endsWith():检测字符串中是否以某个字符结尾
repeat():重复复制多个字符 str2.repeat(10)
padStart(总位数,要填充的字符):位数不够在前面填充
padEnd(总位数,要填充的字符)位数不够在后面填充
trimStart():删除字符串左侧空白 和trimLeft()一样
trimEnd():删除字符串右侧空白 和trimRight()一样
trim():删除左右两侧的空白
数组新增API
Array.from() 将类数组或迭代器类型数据转换为数组 和[...类数组或迭代器]作用一样
entries(),返回key和values
keys() 返回keys
values() 返回value
find() 查询满足条件的数组元素
findIndex() 查找满足条件的数组下标
模块化
export {a,b,c,}
export default
imort xxx from '封装的组件或函数,axios方法'
class类
function Person() {
}
class Site {
constructor(name) {
this.sitename = name
}
present() {
return '我喜欢' + this.sitename
}
}
class Runoob extends Site {
constructor(name, age) {
super(name)
this.age = age
}
show() {
return this.present() + ', 它创建了 ' + this.age + ' 年。'
}
}
let noob = new Runoob('菜鸟教程', 5)
document.getElementById('demo').innerHTML = noob.show()