白学的小知识[ES6总结]

1.let 声明的变量只在 let 命令所在的代码块内有效。
2.let 只能声明一次 var 可以声明多次:
3.不存在变量提升
4.不影响作用域
注:通常与循环一起使用

1.const 声明一个只读的常量,一旦声明,常量的值就不能改变。
2.声明必须赋初始值
3.标识符一般为大写
4.只能声明一次
5.块级作用域
注:对象和数组修改不会触发const错误

arr.unshift(0);//添加在数组arr的最前面
arr.push(0);//添加在数组arr的最后面

ES6 之前判断字符串是否包含子串,用 indexOf 方法,ES6 新增了子串的识别方法。
includes():返回布尔值,判断是否找到参数字符串。
startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。
startsWith与endsWith方法都可以接受两个参数,需要搜索的字符串,和可选的搜索起始位置索引(下标0)。
查找到返回true,否则返回false
不能写正则验证

repeat(number):返回新的字符串,表示将字符串重复指定次数返回。
1.如果参数是小数,向下取整
2.如果参数是 0 至 -1 之间的小数,会进行取整运算,
0 至 -1 之间的小数取整得到 -0 ,等同于 repeat 零次
3.如果参数是 NaN,等同于 repeat 零次
4.如果参数是负数或者 Infinity ,会报错:
5.如果传入的参数是字符串,零次

padStart(总长度,"字符串"):返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
padEnd():返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。
以上两个方法接受两个参数,第一个参数是指定生成的字符串的最小长度,
第二个参数是用来补全的字符串。如果没有指定第二个参数,默认用空格填充。

a.toString(转进制)
二进制表示法新写法: 前缀 0b 或 0B 。
console.log(0b11 === 3);
八进制表示法新写法: 前缀 0o 或 0O 。
十六进制a-f|A-F

拦截器
Object.defineProperty() 静态方法会直接在一个对象上定义一个新属性,
或修改其现有属性,并返回此对象。
Object.defineProperty(操作的对象, 键名, {value:键值})
writable 设置为false不允许修改defineProperty对象添加的值,true允许修改
enumerable设置为true允许被循环拿取值,false不予许
configurable  false不可被删除,true可以删除

Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中
是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,
若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

Symbol.keyFor(),返回一个已登记的 Symbol 类型值的 key ,
用来检测Symbol.for该字符串参数作为名称的 Symbol 值是否已被登记。

Object.values() 静态方法返回一个给定对象的自有可枚举字符串键属性值组成的数组。
console.log(Object.values(object1));
Object.getOwnPropertyNames() 静态方法返回一个数组,其包含给定对象中所有自有属性(包括不可枚举属性,但不包括使用 symbol 值作为名称的属性)。
console.log(Object.getOwnPropertyNames(object1));
Object.getOwnPropertySymbols() 静态方法返回一个包含给定对象所有自有 Symbol 属性的数组。
console.log(Object.getOwnPropertySymbols(object1));

Map的特性
Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
Map 对象记得键的原始插入顺序。
Map 对象具有表示映射大小的属性。
        
Map 对象的几个常用方法和属性
new Map() 创建新的 Map 对象。
set() 为 Map 对象中的键设置值。
get() 获取 Map 对象中键的值。
entries() 返回 Map 对象中键/值对的数组。
keys() 返回 Map 对象中键的数组。
values() 返回 Map 对象中值的数组。
        
Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
        
共同点
二者都是以key-value的形式对数据进行存储;        
不同点
key的数据类型范围不同
obj可以作为key的仅有number、string、symbol。
map均可以。
key的顺序不同。
obj通过obj.keys()打印出来的属性顺序是 number–字符串
map的key顺序是声明顺序。        
创建方式不同。
obj有三种创建方式 字面量{}、new Object() 、构造函数。
map仅支持new Map()        
key的调用不同。
map只能用原生的get方法调用。        
设置属性的方式不同
map只能使用set(key,val)方法设置属性。
        
Size属性
map有size属性,对象没有。Map.size 返回 Map 中元素的数量,而 Object 的键值对个数只能手动计算

Set对象
Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用
Set是唯一值的集合类似与数组,常用于数组去重
        
Set 对象的几个常用方法和属性
new Set() 创建新的 Set 对象。
add() 向 Set 添加新元素。
clear() 从 Set 中删除所有元素。
delete() 删除由其值指定的元素。
has() 如果值存在则返回 true。
forEach() 为每个元素调用回调。
keys() 返回 Set 对象中值的数组。
size 返回元素个数。

箭头函数的特性
不绑定arguments,用rest参数…解决
本身没有this的概念,捕获其所在上下文的 this 值,作为自己的 this 值,this指向全局
箭头函数不能使用new(会报错)
箭头函数没有原型属性(prototype)
箭头函数不能当做Generator函数,不能使用yield关键字
箭头函数不能换行
箭头函数有constructor、length属性
箭头函数可以立即执行
 
call,applay bind 的区别
1.applay、call、bind他们三个都能改变函数this的指向问题;
2.applay、call这两个方法的主动调用,bind返回的是改变this指向后的新函数;
3.传参的问题区别,call和bind都是直接传递参数,applay传递的是数组

1. 当访问一个对象的属性或方法时,首先查找这个对象自身有没有
2. 如果没有就查找它的原型(也就是 __proto__ 指向的prototype 原型对象 )
3. 如果还没有找到就查找原型对象的原型(Object的原型对象)
4. 依次类推一直找到Object为止( null )
5. __proto__ 对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条线路 

防抖和节流
原理 定时器或延时器
constructor:内部原型属性,可以通过代码重写
instanceof:JavaScript操作符,

// 数组扁平化--将多维数组变为一维数组
var arr = [1, 2, 3, [4, 3, [2, 7], 2], 5, [5, 9, 10], 7];
function func(user){
let arr1 = [];
for(var i=0;i<user.length;i++){
    if(Array.isArray(user[i])==false){
    arr1.push(user[i]);
    }else{
            arr1 = arr1.concat(func(user[i]))
        }
        }
    arr = arr1;
    return arr;
    }
    function func(user){
    let arr1 = [];
    user.forEach((item)=>{
        Array.isArray(item)==false?arr1.push(item):arr1 = arr1.concat(func(item))
    })
        arr = arr1;
        return arr;
    }
    func(arr);
    console.log(arr);
    
    function add(x, y) {
        return x + y
    }
    // 函数柯里化
    function curryingAdd(x) {
    return function (y) {
    return x + y
    }
    }
    function binds() {
    return function (x,y) {
        return x + y
    }
    }
    console.log(add(1,3));
    console.log(curryingAdd(1)(5));
    console.log(binds()(2,4));
    
JSON对象的parse和stringify
JSON.stringify(obj)将任何类型转换为字符串类型
JSON.parse(_obj)将""去除,不能去除对象的

使用JSON.stringify(obj)和JSON.parse(_obj)深拷贝
闭包有3个特性:
①函数嵌套函数
②函数内部可以引用函数外部的参数和变量
③参数和变量不会被垃圾回收机制回收

好处
①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
③匿名自执行函数可以减少内存消耗
坏处
①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
        
单线程:
1.首先是历史原因,在创建 javascript 这门语言时,多进程多线程的架构并不流行,硬件支持并不好。
2.其次是因为多线程的复杂性,多线程操作需要加锁,编码的复杂性会增高。
3.而且,如果同时操作 DOM ,在多线程不加锁的情况下,最终会导致 DOM 渲染的结果不可预期
        
同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务
异步:不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行
        
1.JS任务 分为同步任务(synchronous)和异步任务(asynchronous)
2.同步任务都在 JS引擎线程(主线程) 上执行,形成一个执行栈(call stack)
3.事件触发线程 管理一个 任务队列(Task Queue)
4.异步任务 触发条件达成,将 回调事件 放到任务队列(Task Queue)中
5.执行栈中所有同步任务执行完毕,此时JS引擎线程空闲,系统会读取任务队列,将可运行的异步任务回调事件添加到执行栈中,开始执行
        
宏任务有哪些:script(整体代码), setTimeout, setInterval, 
微任务有哪些:process.nextTick,Promise
特性:
1.宏任务和微任务的任务队列都可以有多个
2.当前执行栈执行完毕时会立刻先处理所有微任务队列中的事件,
然后再去宏任务队列中取出一个事件。同一次事件循环中,
微任务永远在宏任务之前执行。
3.不同的运行环境 循环策略可能有不同,这里探讨chrome、node环境

includes()数组是否包含指定值,查找到返回true否则false
flat()嵌套数组转一维数组,Infinity    
flatMap()先对数组中每个元素进行了的处理
参数1:遍历函数,该遍历函数可接受3个参数:当前元素、当前元素索引、原数组
参数2:指定遍历函数中 this 的指向

class类
1.class 的本质是 function。
2.不可重复声明。
3.类定义不会被提升,这意味着,必须在访问前对类进行定义,否则就会报错。
4.类中方法不需要 function 关键字。
5.方法间不能加分号。
命名类:let Example = class Example{}
匿名类:let Examples = class{}

super()特性在extends继承中
1.子类 constructor 方法中必须有 super ,且必须出现在 this 之前
2.调用父类构造函数,只能出现在子类的constructor构造函数
3.调用父类方法, super 作为对象,在普通方法中,指向父类的prototype原型对象,
在子类静态方法中拿取父类静态方法的值,在静态方法中,指向父类

严格模式use strict;
module模式
export导出
import导入
as不同模块导出接口名称命名重复, 使用 as 重新定义变量名。
1.导出的函数声明与类声明必须要有名称(匿名函数)(export default 命令另外考虑)。 
2.不仅能导出声明还能导出引用(例如函数)。
3.export 命令可以出现在模块的任何位置
4.import 命令会提升到整个模块的头部,首先执行。
5.建议使用大括号指定所要输出的一组变量写在文档尾部,明确导出的接口。
6.函数与类都需要有对应的名称,导出文档尾部也避免了无对应名称。
7.export 命令导出的接口名称,须和模块内部的变量有一一对应关系。
8.导入的变量名,须和导出的接口名称相同,即顺序可以不一致。
9.import只读属性:不允许在加载模块的脚本里面,
改写接口的引用指向,即可以改写 import 变量类型为对象的属性值,
不能改写 import 变量类型为基本类型的值。
10.单例模式:多次重复执行同一句 import 语句,那么只会执行一次,而不会执行多次。
import 同一模块,声明不同接口引用,会声明对应变量,但只执行一次 import 。
11.import静态执行特性:import 是静态执行,所以不能使用表达式和变量。
        
export default
1.在一个文件或模块中,export、import 可以有多个,export default 仅有一个。
2.export default 中的 default 是对应的导出接口变量。
3.通过 export 方式导出,在导入时要加{ },export default 则不需要。
4.export default 向外暴露的成员,可以使用任意变量来接收。

js中 ajax调取接口数据 异步
http与https区别
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
        
1.创建XMLHttpRequest()对象
let http = new XMLHttpRequest();
2.请求   创建的对象.open("请求方式","url")
请求方式
get方式:偏向获取数据;
post方式: 偏向向后端提交数据;
put方式:偏向更新(全部更新);
delete方式:偏向删除信息;

1.表单格式
2.JSON格式
3.响应(获取接口返回值)http.responseText()获得字符串形式的响应数据。
4.onreadystatechange 监听事件

readyState值
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪

导入
import {userName,age} from "./day28.js"
import {userName as aaa} from "./day28.js"
import abc from "./day28.js"
import * as abc from "./day28.js"
导出
export {userName,age}
export {userName as names}
export default userName

Generator 函数特性,可以通过 yield 关键字,
把函数的执行流挂起,为改变执行流程提供了可能
Generator 有两个区分于普通函数的部分:
1.一是在 function 后面,函数名之前有个 * ;
2.函数内部有 yield 表达式。
3.其中 * 用来表示函数为 Generator 函数,yield 用来定义函数内部的状态。
next()调用
一般情况下,next 方法不传入参数的时候,yield 表达式的返回值是 undefined 。
当 next 传入参数的时候,该参数会作为上一步yield的返回值。
done表示函数是否执行完,true执行完,否则false
value获取的是yield后面的值

return 方法
return 方法返回给定值,并结束遍历 Generator 函数。
return 方法提供参数时,返回该参数;不提供参数时,返回 undefined 。

"use strict";开启严格模式,注意,严格模式下,set代理如果没有返回true,就会报错
Reflect.ownKeys() 返回对象所有的属性,不管属性是否可枚举,包括 Symbol。

name: 函数名称。
param: 要传递给函数的参数的名称。
statements: 函数体语句。

async 函数中可能会有 await 表达式,async 函数执行时,
如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。
await 关键字仅在 async function 中有效。
如果在 async function 函数体外使用 await ,你只会得到一个语法错误。
Promise 对象:await 会暂停执行,等待 Promise 对象 resolve,然后恢复 async 函数的执行并返回解析值。
非 Promise 对象:直接返回对应的值

Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。
它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。
Reflect 可以用于获取目标对象的行为,它与 Object 类似,
但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。
一个 Proxy 对象由两个部分组成: target 、 handler 。在通过 Proxy 构造函数生成实例对象时,需要提供这两个参数。
target 即目标对象, handler 是一个对象,声明了代理 target 的指定行为。        

includes():返回布尔值,判断是否找到参数字符串。(重点)
startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。
repeat(number):返回新的字符串,表示将字符串重复指定次数返回。
padStart(总长度,"填充的字符串"):返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
padEnd(总长度,"填充的字符串"):返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。
模板字符串相当于加强版的字符串,用反引号 `,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。带值${a}

循环对象
Object.keys() 静态方法返回一个由给定对象自身的可枚举的字符串键属性名组成的数组。
Object.values() 静态方法返回一个给定对象的自有可枚举字符串键属性值组成的数组。
Object.getOwnPropertyNames() 静态方法返回一个数组,其包含给定对象中所有自有属性
包括不可枚举属性,但不包括使用 symbol 值作为名称的属性)
Object.getOwnPropertySymbols() 静态方法返回一个包含给定对象所有自有 Symbol

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值