ES6 干货指南 (中)

这是一个小程序可用的MD5脚本 直接暴露方法接口 需要的地方引入使用就行 var util = require('../../utils/md5.js') password=util.hexMD5(password); 立即下载

在这里插入图片描述

本节所要介绍的是关于 ES6 进阶部分的内容 ES6 干货指南 (中)


一、Symbol

Symbol 是什么?
  • ES6 新增的一个数据类型
  • 利用 Symbol() 可创建了一个符号
  • 符号的设计是给对象新增私有属性,并只能在对象内部进行访问
Symbol 特点
  • 没有字面量的创建写法,必须用 Symbol 创建
    	const sym= Symbol(); 
    
  • 新的基础数据类型,使用typeof返回symbol
    	const sym= Symbol(); 
    	console.log(typeof sym);	  // symbol
    
  • 每次去调用 Symbol 函数得到的符号永远不会相等,不管符号描述是否相同
    	const sym1 = Symbol("sym");   
    	const sym2 = Symbol("sym");
    	console.log(sym1,sym2);		  // Symbol(sym) Symbol(sym)
    	console.log(sym1 === sym2);	  // false
    
  • 符号可以作为对象的属性名使用,这种属性名叫符号属性
    	const sym = Symbol("sym");  
    	const obj = {
    		a : 1,
    		b : 2,
    		[sym] : 3    	// 符号属性 [sym]
    	}
    
    	console.log(obj);	// {a: 1, b: 2, Symbol(sym): 3}
    
  • 符号属性不能被枚举
    	const sym1 = Symbol("sym1");  
    	const sym2 = Symbol("sym2");  
    	const obj = {
    		a : 1,
    		b : 2,
    		[sym1] : 3,
    		[sym2] : 4,
    	}
    	
    	for(const prop in obj)
    		console.log(prop);		// a b
    	console.log(Object.keys(obj));		// (2) ["a", "b"]
    	console.log(Object.getOwnPropertyNames(obj));	// 	(2) ["a", "b"]
    
    	// 要枚举则需使用针对符号属性的方法	getOwnPropertySymbols(obj)
    	console.log(Object.getOwnPropertySymbols(obj));		// (2) [Symbol(sym1), Symbol(sym2)]
    	
    
  • 符号类型无法被隐式转换,数学运算,字符串拼接等
    	const sym = Symbol();
    	console.log(sym + 0);		// Cannot convert a Symbol value to a number
    

二、Iterator 迭代器

什么是 Iterator ?
  • 什么是迭代?
    从一个数据集合中按照一定的顺序,不断的取出数据的过程
  • 迭代和遍历有什么区别?
    迭代强调是依次取出,不能确定取出的有多少,也不能保证把数据全部取完
  • 迭代器
    对迭代过程的封装,通常为对象,不同的语言中,表现出来的迭代形式不一样
  • 迭代模式
    一种设计模式,用于同一迭代的过程,并且规范迭代器的规格
  • JavaScript 中的迭代器
    迭代器有得到下一个数据的能力 判断是否有后续数据的能力
    JavaScript 规定,如果一个对象有 next 方法,并且返回一个对象,就认为这个对象为迭代器
  • 作用
    为各种 数据结构 提供一个统一简便的访问接口,使数据结构的成员能够按某种次序排列
    原生具备 iterator 接口的数据,可用 for of 遍历( 数组 字符串 arguments set容器 map容器 )

迭代器基本结构,迭代返回结果为 遍历器对象 / 指针对象

	const IterObj = {
		next(){						// next() 用于得到下一个数据
			return {
				value : "xxx",		// 数据值	迭代执行获取数据
				done :  "xxx"		// 状态		判断是否有后续数据,一般为 boolean
			}
		}
	}
	/* 这里调用 IterObj.next() 输出的是指针对象 */
模拟迭代器返回指针对象
  • 模拟迭代器在这里数据结构类似一个数组
  • 开始指向是数据结构的起始位置(索引值0的位置)
  • 第一次调用next()指针自动下移,指针自动指向数据结构第一个成员,
    next() 返回值一个对象 {vlaue: 数据结构第一个数据, done: false}
    ......
  • 最后一次调用next下移,指针指向无数据位置(指向索引值为length的位置),返回 {value: undefiend, done: true}
	const arr = [1,2,3,4,5];
	const iterator = { 
		i : 0,
		next: function() {
			var result = {
				value : arr[this.i],
				done : this.i >= arr.length
			}
			this.i ++;
			return result;
		}
	}

	console.log(iterator);			// {i: 0, next: ƒ}
	console.log(iterator.next());	// {value: 1, done: false}
	console.log(iterator.next());	// {value: 2, done: false}
	console.log(iterator.next());	// {value: 3, done: false}
	console.log(iterator.next());	// {value: 4, done: false}
	console.log(iterator.next());	// {value: 5, done: false}
	console.log(iterator.next());	// {value: undefined, done: true}
封装迭代器
	const arr = [1,2,3,4,5];
	function createIterator(arr){
		let i = 0;
		return {
			next(){
				var result = {
					value : arr[i],
					done : i >= arr.length
				}
				i ++;
				return result;
			}
		}		
	}

	const iter = createIterator(arr);
	console.log(iter.next());		// {value: 1, done: false}
	console.log(iter.next());		// {value: 2, done: false}
	console.log(iter.next());		// {value: 3, done: false}
	console.log(iter.next());		// {value: 4, done: false}
	console.log(iter.next());		// {value: 5, done: false}
	console.log(iter.next());		// {value: undefined, done: true}
Fibonacci 数列迭代器
	function createFeiboIterator(){
		let prev1 = 1;
		let prev2 = 1;  	//定义前两位
		let n = 1;  		//当前第几位
		return {
			next(){
				let value;
				if(n <= 2){
					value = 1;
				}else{
					value = prev1 + prev2;	// C = A + B
				}
				const result = {
					value,
					done : false   			//迭代器数据量的多少,只关心是否拿得到下一个数据
				}
				prev2 = prev1;				// B = A
				prev1 = value;				// A = C
				n ++;
				return result
			}
		}
	}
	const iterator = createFeiboIterator();
	console.log(iterator .next());		// {value: 1, done: false}
	console.log(iterator .next());		// {value: 1, done: false}
	console.log(iterator .next());		// {value: 2, done: false}
	console.log(iterator .next());		// {value: 3, done: false}
	console.log(iterator .next());		// {value: 5, done: false}
可以迭代对象
  • 在 ES6 中,如果对象具有知名符号的属性 Symbol.iterator,则表示对象可以迭代
    ES6及之后,数组/类数组对象可以直接创建迭代对象
  • 当使用 for of 去遍历某一个数据结构的时候,首先找 symbol. iterator 找到了则遍历,未找都则输出 xxx is not iterrable
	const arr = [1,22,3333,44444,55555];		
	const iterator = arr[Symbol.iterator]();
	
	console.log(iterator.next());	// {value: 1, done: false}
	
	// for of 遍历可迭代对象
	for(const item of arr)
			console.log(item);	  // 1  22 333 4444 55555

三、Generator 生成器

什么是 Generator
  • ES6 提供的解决异步编程的方案
  • Generrator 函数是一个状态机,内部封装了不同状态的数据
  • 生成器就是通过构造函数 Generator 生成遍历器对象/指针对象
  • 生成器既是一个迭代器,同时又是一个可迭代的对象
  • Generrator 是一个可暂停函数(惰性求值),yield可暂停,next()可启动。每次暂停返回的是yield后的表达式结果
Generator 函数写法及用法
  • 只需要把一般函数变成 Generator 函数(即function与函数名之间有 * )
  • 内部用yield表达式来定义不同的状态,关键字yield只能在函数内部使用,表示产生一个迭代数据
  • Generrator 函数返回值是指针对象,不会执行函数内部逻辑
  • 开始调用next()方法函数内部逻辑开始执行,遇到yield表达式暂停,返回指针对象 {value: " ", done: " "} ;
    每一次调用生成器的next方法,会从上次暂停的yield处开始将生成器函数运行到下一个yield关键字位置 ;直到最后返回的指针对象done: true;
  • yield语句返回结果一般为undefined,当调用next()方法时传参内容会作为启动时yield语句的返回值。
  • 注:Generator 中使用return方法,可以提前结束生成器函数,整个的迭代过程提前结束
	function *test(){
		console.log('第1次执行')
		yield 1;
		console.log('第2次执行')
		yield 2;
		console.log('第3次执行')
		yield 3;
		return "over";
	}
	
	const generator = test();
	console.log(generator.next());	  // 第1次执行	{value: 1, done: false}
	console.log(generator.next());	  // 第2次执行	{value: 2, done: false}
	console.log(generator.next());	  // 第3次执行	{value: 3, done: false}
	console.log(generator.next());	  // {value: "over", done: true}
	console.log(generator.next());	  // {value: undefined, done: true}

可以看出生成器原理上是封装了的迭代器,相比原生的迭代器他是更可操控的

yield 返回值
  • 调用生成的next方法时,可以传递参数,传递的参数会交给yield表达式的返回值
  • 执行next方法后停留的地方是"终点","起点"在上一个停留的地方,执行的内容也即是从起点到终点过程中的代码
  • 即:next方法传参后的返回值,是起点yield语句接收的。
	function *test(){
		let info = yield 1;		// 第一次暂停	
		console.log(info);
		info = yield 2;			// 第二次暂停
		console.log(info);
		return "OVER";
	}
	
	const generator = test();
	console.log(generator.next());		  // {value: 1, done: false}
	console.log(generator.next(222));	  // 222  {value: 2, done: false}
	console.log(generator.next(333));	  // 333  {value: "OVER", done: true}

第一次执行 generator.next() 运行至第一次暂停,第一次启动无需传参,因为函数运行至第一次暂停才有yield表达式语句,即启动时是从下标 0 开始,没有yield表达式接收返回值 ;
第二次执行 generator.next() 运行至第二次暂停,第二次启动传参 222,接收参数的yield表达式是第一次暂停的yield表达式,后续next执行同理 ;

Generator 内部调用其它 Generator 函数
	/* 在函数内部是调用别的生成器 一定要加上 * */
	function *foo(){
		yield "a";
		yield "b";
	}
	function *bar(){
		yield *foo();
		yield 1;
		yield 2;
		return "OVER";
	} 
	
	const generator = bar();
	console.log(generator.next());	  // {value: "a", done: false}
	console.log(generator.next());	  // {value: "b", done: false}
	console.log(generator.next());	  // {value: "1", done: false}
	console.log(generator.next());	  // {value: "2", done: false}
	console.log(generator.next());	  // {value: "OVER", done: true}

四、Promise

Promise 定义
  • 代表了未来某个将要发生的事件(通常是异步操作)
  • ES6的 Promise 是一个构造函数,用来生成promise对象
  • 作用:promise对象可以将异步操作以同步的流程表达出来,避免了层层嵌套的回调函数(回调地狱)
Promise 基本写法
	// 创建 promise 对象(sync)
	let promise = new Promise((resolve, reject) => {
	    //  初始化 promise状态为 pending
	    console.log("pending") ; 
	    if(异步操作成功){
			resolve("resolve");		// 成功:修改promise状态为 resolved
		} else {
			reject("reject");		// 失败:修改promise状态为 rejected	
		}
	});
	
	// 调用 promise 的 then(async)
	promise.then(result=> {
		console.log( result, "成功了!" );
	},error => {
		console.log( error, "失败了!" );
	});
ES6 将程序分为了三种状态
  • pending:挂起(等待) 处于未决阶段,表示事情还是在挂起,最后的结果没有出来
  • resolved:已处理 处于已决阶段,表示整个事情已经出现结果,并且可以按照正常的逻辑进行下去的结果
  • rejected:已拒绝 处于已决阶段,表示整个事情已经出现结果,并且是一个无法按照正常逻辑进行下去的结果
Promise 阶段状态

在这里插入图片描述

Promise 各状态注意点
  • 未决阶段的处理函数是同步的,会立即执行
    	new Promise((resolve, reject) => {
    		console.log("未决阶段的处理函数是同步的,会立即执行!");
    		resolve("resolve");
    	});
    
  • then函数是异步的,就算会立即执行,也是会加入等待队列中,加入微队列
    	new Promise(resolve => resolve("resolve")).then(result=> {
    		console.log("then 函数是异步的加入微队列 " );
    	});
    
  • then可以只添加成功的回调函数,catch可以单独添加失败的回调函数
    	let pro = new Promise((resolve, reject)=> {
    		if(Math.random() < 0.5){
    			resolve("resolve");
    		} else {
    			reject("reject");
    		}
    	})
    	
    	/* then 只添加成功的回调函数 */
    	pro.then(result=> {
    		console.log(result);		// resolve
    	});
    	
    	/* catch 单独添加失败的回调函数 */
    	pro.catch(err => {
    		console.log(err);		// reject	  Uncaught (in promise) reject
    	});
    
  • 一旦状态推向了已决阶段,无法再去做任何的改变
    1. 当程序已经到达已决阶段后,通常要进行后续的处理,不同的已决解决,决定了不同的后续处理
    2. resolved 这是一个正常的已决状态,后续处理表示为result回调函数
    3. rejected这是一个非正常的已决状态,后续处理表示为error回调函数
    4. 后续的处理可能会有多个,因此会形成任务队列,这些后续处理会按照顺序,当达到对应的状态后依次执行
Promise 串联操作
  1. 如果当前的Promise是未决的,得到的新的pro对象是挂起状态

    	const pro = new Promise((resolve,reject) => {
    		// resolve();
    	});
    	
    	console.log(pro);	// Promise {<pending>}
    
  2. 通过调用then以后,返回的是一个全新promise对象

    	const pro = new Promise(resolve => resolve(1));
    	console.log(pro);			// Promise {<resolved>: 1}
    	
    	const proThen = pro.then(result => result*2);
    	console.log(proThen);		// Promise {<pending>}	
    

    这里有一个需要注意的点:理论上console.log(proThen)执行顺序是早于pro.then()的执行的。即这里的 pro.then()状态正常输出应该是 Promise {<pending>},[[PromiseStatus]]: "pending",[[PromiseValue]]: undefined
    但实际上是:
    在这里插入图片描述
    那么这里的proThen结果为何能正常打印出来?经过实验发现可以利用定时器延缓来pro.then()的执行的,这样在pro.then()还未执时可以在浏览器查看到pro.then()正常的"pending"状态,而如果等待定时器执行完毕再去查看pro.then()则就是已经处理完成了的结果。因此,这里非正常输出状态,主要由浏览器处理所造成的。
    在这里插入图片描述

  3. 返回的全新promise对象调用then方法,触发 resolved / rejected?
    细心的伙伴应该发现了上一个栗子返回的新的promise对象,状态是<resolved>,因此新的promise对象调用then方法则执行成功的回调函数。那么新对象的<resolved>状态如何来的?

    	const pro = new Promise(resolve => resolve(1));
    	
    	const proThen1 = pro.then(result => {
    		return result;		// 控制台打印 proThen1	==>	 Promise {<resolved>: 1}
    	});			
    	const proThen2 = pro.then(result => {
    		throw result;		// 控制台打印 proThen2	==>	 Promise {<rejected>: 1}
    	});	
    
    	const pro = new Promise((resolve,reject) => reject(1));
    	
    	const proThen1 = pro.catch(error => {
    		return error;		// 控制台打印 proThen1	==>	 Promise {<resolved>: 1}
    	});		
    	const proThen2 = pro.catch(error => {
    		throw error;		// 控制台打印 proThen2	==>	 Promise {<rejected>: 1}
    	});	
    

    上述栗子可以看到pro对象状态无论是什么,调用then / catch方法 :
      将结果 return,则新的promise对象 PromiseStatus: "resolved",PromiseValue: 1
      将结果 throw,则新的promise对象 PromiseStatus: "rejected",PromiseValue: 1
      注意:这里返回的是非promise对象

  4. 返回 pormise 对象
    上一个栗子可以看到,新的promise对象状态却决于前一个promsie对象调用then/catch的返回方式,但是这是建立在返回是非promise对象状态。如果返回的是promise对象呢?

    1)return promise,则新的promise对象和返回的promise状态及值保持一致

    	const promise1 = new Promise((resolve,reject) => resolve(1));
    	const promise2 = new Promise((resolve,reject) => reject(1));
    	const pro = new Promise(resolve => resolve());
    	
    	const proThen = pro.then(result => {
    		return promise1 ;	  	// 控制台打印 proThen1 ==> Promise {<resolved>: 1}
    	});	
    	
    	const proThen = pro.then(result => {
    		return promise2 ;	  	// 控制台打印 proThen2 ==> Promise {<rejected>: 1}
    	});
    

    2)throw promise,则新的promise对象状态为rejected,PromiseValue为返回的promise对象

    	const promise1 = new Promise((resolve,reject) => resolve(1));
    	const promise2 = new Promise((resolve,reject) => reject(1));
    	const pro = new Promise(resolve => resolve());
    	
    	const proThen1 = pro.then(result => {
    		throw promise1 ;	  	// 控制台打印 proThen1 ==> Promise {<rejected>: Promise}	
    	});	
    			
    	const proThen2 = pro.then(result => {
    		throw promise2 ;	  	// 控制台打印 proThen2 ==> Promise {<rejected>: Promise}
    	});						
    

在这里插入图片描述

Promise 静态方法
  • Promise.resolve()
    	Promise.resolve("resolve")	  等价于	new Promise((resolve,reject) => resolve("resolve"));
    
  • Promise.reject()
    	Promise.reject("reject")	  等价于	new Promise((resolve,reject) => reject("reject"));
    
  • Promise.all(arr)
    作用:返回一个新的promise对象,如果里面所有的promise对象都成功才会触发,一旦有一个失败,则该promise对象为失败
    	const proms = [];
    	for(let i = 0; i < 10; i++){
    		proms.push(new Promise((resolve,reject) => {
    			Math.random() < 0.9 ? resolve(i) : reject(i);
    		}));
    	}
    
    	/**
    	 *	所有的都成功才为成功,只要有一个失败,就失败
    	 *	  proms数组存储的元素为不同状态的 promise 对象
    	 *	  proms数组中,全是resolve状态,则pro状态:"resolved",pro值:Array(10),数组中元素为 promise值
    	 *	  proms数组中,只要有reject状态,则pro状态:"rejected",pro值:数组中第一个reject状态下的 i 值
    	 */
    	 
    	const pro = Promise.all(proms);
    		
    	pro.then(data => {
    		console.log('全部完成', data);
    	});
    	pro.catch(err => {
    		console.log('有失败的', err)
    	});
    	
    	console.log(proms);
    	console.log(pro);
    

在这里插入图片描述

  • Promise.race(arr)
    作用:当参数中的任意一个 promise对象完成时候,就马上回去使用完成的这个promise对象的结果,不管这个结果成功还是失败
    	const proms = [];
    	for(let i = 0; i < 10; i++){
    		proms.push(new Promise((resolve,reject) => {
    			setTimeout(()=> {
    				console.log(i);
    				Math.random() < 0.6 ? resolve(i) : reject(i)
    			}, Math.random() * 3000 + 1000)	
    		}))
    	}	
    
    	/**
    	 *	所有的都成功才为成功,只要有一个失败,就失败
    	 *	  proms数组存储的元素为不同状态的 promise 对象
    	 *	  race(proms)中的promise对象状态那个先执行,则pro状态和值与其保持一致
    	 */
    	 
    	const pro = Promise.race(proms);
    	
    	pro.then(data => {
    		console.log('有人完成了', data);
    	})
    	pro.catch(err => {
    		console.log('有失败的', err);
    	})
    		
    	console.log(pro);
    

在这里插入图片描述

五、Async

什么是 async ?
  • ES2016 新增了 async 函数,作用是 结合生成器来简化 Promise 的操作
  • 真正意义上去解决异步回调的问题,异步操作表现为同步流程表达式
  • async 用于去修饰函数(函数声明和函数表达式),放在函数的开始位置,
  • 被 async 修饰的函数返回一个 promise 对象
	/* 原生 promsie */
	function promiseFoo(){
		return new Promise(resolve => resolve("init promise"));
	}
	const initPro = promiseFoo();
	console.log(initPro);		// Promise {<resolved>: "init promise"}
	
	
	/* async */
	async function asyncFoo(){
		return "async promise";
	}
	const asyncPro = asyncFoo();
	console.log(asyncPro);		// Promise {<resolved>: "async promise"}
async 本质上是 Generator 语法糖
  • async 不必像 Generator 那样调用 next 方法,async 遇到 await 等待,当前的异步操作完成就往下执行
  • async 返回的是 Promise 对象,可以使用 then 方法链式操作
  • async 取代 Generator 的星号,await 取代 yield
  • async 语义上更加明确,使用更简单
	async function asyncBar1(){
		console.log(123);
		return 456;
	}
	async function asyncBar2(){
		console.log(789);
		return 321;
	}
	async function asyncFoo(){
		let result = await asyncBar1();	// 遇到 await 等待当前的异步操作完成再往下执行
		console.log(result);
		result = await asyncBar2();	
		console.log(result);
		return 0;
	}
	console.log(asyncFoo());
	console.log(asyncBar1());
	console.log(asyncBar2());			

在这里插入图片描述


关于 ES6 的进阶内容的干货先介绍这么多,后续有新的内容会再继续更新,Bye ~~~

javascript实现base64 md5 sha1 密码加密 本篇文章给大家介绍了javascript实现密码加密,通过base64、md5、sha1文件,调用相关方法实现密码加密,非常简单,需要的朋友可以参考下 立即下载

相关推荐

实战指南:UOS专业版命令行高效下载离线安装包及依赖

本文提供了一份UOS专业版离线安装包的实战下载指南。针对无外网环境下的软件部署难题,详细介绍了如何通过命令行精准获取软件包名,并利用`apt download`命令高效下载主程序及其所有依赖。文章重点解析了使用`apt install --dry-run`模拟安装来完整获取依赖包的方法,并给出了离线安装、问题排查及自动化脚本编写等高级技巧,帮助管理员和运维人员实现可靠的批量离线部署。

honey的博客 1109

MD5算法加密实现

方式一: import java.security.MessageDigest; public class MyMD5 {     static char[] hex = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};      public static void main(String[] a

DennisRuan(米粒橙) 621

【漆学军】MT4进阶到MT5速成之路(2)获取持仓

MT5在持仓获取上,要比MT4复杂些,分两部分,获取持仓和挂单采用了不同的方法。 一、获取持仓中的buy和sell单 int b=0;//获取buy单个数 int s=0;//获取sell单个数 double lot_total_buy=0;//获取持仓中buy单的总手数 double lot_total_sell=0;//获取持仓中sell单的总手数 for(int i=0; i<PositionsTotal(); i++) { ulong ticket=Positi

漆学军的编程笔记 1625

微信小程序MD5加密

本文转载自:https://blog.youkuaiyun.com/wen_3370/article/details/543753831.在utils下新建md5.js文件/* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC ...

Vera_Gao的博客 592

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 194

立创EDA实战:基于NE555的夜间氛围呼吸灯电路设计与模式切换

本文详细介绍了使用立创EDA设计基于NE555芯片的夜间氛围呼吸灯电路。项目核心是利用NE555产生PWM信号,并通过RC充放电电路实现LED亮度的缓慢周期性变化,形成呼吸效果。文章手把手教学,涵盖从电路原理分析、元件参数计算,到在立创EDA中进行原理图绘制、PCB布局布线,直至焊接调试的完整硬件设计流程,是电子爱好者入门实战的经典项目。

weixin_42153793的博客 124

前端常用6种数据加密方式的使用(最详解)

前端常用的加密方式有base64加密,MD5加密,sha1加密,sha256加密,aes加密,字符串加密,面我介绍前端6种常用的加密如何使用,如有不足之处,欢迎大家补充

富朝阳的博客 2万+

浅析MOS管导通过程及RC吸收电路设计要点

RC吸收电路 米勒电容 MOS导通过程

liangbo1999的博客 2万+

Javascript的ES6 class写法和ES5闭包写法性能对比

计算过程将结果再放回参数, 这样避免结果没被引用被优化, 影响对比结果.其中test.js采用闭包写法, test2.js采用类写法.因此对性能要求比较高的话, 还是推荐类写法.这个实验很简单, 用md5计算一百万次.闭包的写法时间略大于类写法, 大概20%下面是闭包写法test.js的代码。下面是类写法test2.js。一直怀疑它对性能是否有影响.看到很多闭包写法的函数,最终的对比结果如下图所示.于是, 做了一个实验.

小松鼠举栗子 953

AD9826的时序分析及Verliog代码

AD9826的时序分析及Verliog代码 (本文对AD9826的模式和时序进行了分析,如有错误敬请指正,关于这款ADC芯片的基本参数,本文不做过多介绍) 1、AD9826的模式 AD9826的采样模式主要有两种,一种是“CDS模式”,一种是“SHA模式”;在这两种模式下分别有1通道、2通道、3通道的采样模式 (1)CDS模式 简单的来说CDS模式就是,有两个采样时钟,一个是ADCCLK1,用来采样CCD波形的参考电平,一个是ADCCLK2用来采样数据电平,然后经过,偏移量调节,再经过PGA增益放大最

m0_50102488的博客 6474

YOLOv11改进 | 损失函数改进篇 | MPDIoU、InnerMPDIoU助力细节涨点(二次创新 + 代码解析)

本文为读者详细介绍了YOLOv11模型的最新改进,带来的改进机制是最新的损失函数MPDIoU和融合了最新的Inner思想的InnerMPDIoU(效果打爆之前的所有的损失函数提升检测精度和处理细节方面的作用。通过深入探讨MPDIoU和InnerMPDIoU(全网首发)的工作原理和实际代码实现,本文旨在指导读者如何将这些先进的损失函数技术应用到YOLOv11模型中,以提高其性能和准确性。文章内容涵盖从理论基础、代码实现,到实际教你如何添加本文的机制到你的模型中。

Snu77的博客 4024

ES6 干货指南 (下)

ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

CodingmanNAN的博客 370

8、干式变压器

干式变压器的发展,是人类不断挑战材料科学和热物理极限的过程,每一次技术突破,都是在。温度升高,ε_r反而下降(因为分子活动性增强,极化响应变慢)。:固体导热的热阻比液体对流大一个数量级,这是无法逾越的物理规律。Nomex在高温下不是逐渐分解,而是保持性能直到一个临界点。如果 T_a = 40°C,则 T_c = 146.7°C。干式变压器(固体介质分隔):热场、电场、流场(空气)形成三维氢键网络,即使在高温下也能保持机械强度。:不是在现有技术上修修补补,而是寻找新的。仍在H级绝缘允许范围内(≤180°C)

renpeng2692873032的博客 228

ES6 干货指南 (上)

ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

CodingmanNAN的博客 401

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ES6面试、复习干货知识点汇总(全)

近期在复习ES6,针对ES6新的知识点,以问答形式整理一个全面知识和问题汇总。(全干货,适合对ES6有一定理解的同学复习,以及ES6面试。) 一、问:ES6是什么,为什么要学习它,不学习ES6会怎么样? 答: ES6是新一代的JS语言标准,对分JS语言核心内容做了升级优化,规范了JS使用标准,新增了JS原生方法,使得JS使用更加规范,更加优雅,更适合大型应用的开发。学习ES6是成为...

前端码农 2941

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

22个ES6面试、复习干货知识点汇总

不要问我最近咋这么多面试题。最近准备找工作当然要搜刮多点面试题,卯足劲进大厂~ 老规矩先上目录 ==》 快捷目录ES6是什么,为什么要学习它,不学习ES6会怎么样?ES5、ES6和ES2015有什么区别?babel是什么,有什么作用?let有什么用,有了var为什么还要用let?问:举一些ES6对String字符串类型做的常用升级优化?举一些ES6对Array数组类型做的常用升级优化?举一些ES6对Number数字类型做的常用升级优化?举一些ES6对Object类型做的常用升级优化?(重要)举一些ES6对F

Silvia 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ES6面试、复习干货知识点汇总

点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群作者:StevenLikeWatermelon https://juejin.cn/post/68449037344644...

程序员成长指北 1297

ElasticSearch分布式搜索引擎安装教程

ElasticSearch分布式搜索引擎安装教程 ​ 专注小Du博客,每天分享干货知识。优快云博客地址: 在正式开始安装教程之前,小Du先带大家来了解什么是ElasticSearch。 一.Hr:ElasticSearch是什么? ​ 答:Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级

小Du猿的博客 18万+

ES6规范,注意要点,满满的干货

标题今天带给大家ES6的规范要点,满满的干货 1、闭包 概念:1.函数的内部调用了外部的变量,叫做闭包 2.闭包是为了将内存保留下来,就是将参数保留,不会立即被销毁 3.闭包过程中会使用到立即函数,立即保存函数是为了保留参数,否则就会立即销毁 4.添加点击事件,点击事件是为了得到一个函数,返回函数(回调函数) 注意:在闭包过程中,会发生内存泄漏,内存被参数占据了,所以内存变少了 示...

nihaishilaile的博客 311

ES6的干货

找到 ul li 里边相应的下标和值 下面展示一些 内联代码片。 window.onload = function () { let lis = document.getElementsByTagName('li'); for (var i = 0; i < lis.length; i++) { // console.log(i) // 贴标签 lis[i].index = i lis[i].on

weixin_49204513的博客 167

都2024年了,再不学ES6你就out了 —— 一文搞懂ES6_net6 支持es6吗

【代码】都2024年了,再不学ES6你就out了 —— 一文搞懂ES6_net6 支持es6吗。

2401_84166965的博客 1227

Elasticsearch小白入门学习干货!!

Elasticsearch 是一个基于Lucene的搜索服务器。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch 通常被用来进行实时搜索和日志分析,并且能够处理大量的数据。黑马商城作为一个电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很差。

m0_73612206的博客 1067

ES6的概念以及运行环境~满满的干货

下面是对ES6的概念以及配置运行环境的详细介绍,有需要的小伙伴快来看看吧~ 文章目录ECMAScript与JavaScript的关系ECMAScript与ES2015的关系ECMA的发展历史WebStorm配置Babel编译器安装Babel配置Babelbabel-cli转码 ECMAScript与JavaScript的关系 1996年11月,JavaScript的创造者Netscape 公司,决定将JavaScript 提交给标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布262号标

weixin_46370867的博客 483

前端面试干货——ES6重点总结

ES6重点总结,前端应届生必会知识

NGUP_LEE的博客 1205

ES6新特性之满满的干货

ES6新特性,供大家参考学习

永远别小看程序员。即使是青铜,说不定背后有个王者在帮他 224
上一篇: ES6 干货指南 (上)
下一篇: 网络分层 基本了解
JasoncodeQvQ
博客等级 码龄7年 458粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值