关于ecmascript:ES13中11个令人惊叹的-JavaScript-新特性

前言 与许多其余编程语言一样,JavaScript 也在一直倒退。每年,该语言都会通过新性能变得更加弱小,使开发人员可能编写更具表现力和简洁的代码。 本葡萄明天就为大家介绍ES13中增加的最新性能,并查看其用法示例以更好地了解它们。 1.类 在ES13之前,类字段只能在构造函数中申明。与许多其余语言不同,无奈在类的最外层作用域中申明或定义它们。 class Car { constructor() { this.color = 'blue'; this.age = 2; } } const car = new Car(); console.log(car.color); // blue console.log(car.age); // 而ES13 打消了这个限度。当初咱们能够编写这样的代码: class Car { color = 'blue'; age = 2;}const car = new Car();console.log(car.color); // blueconsole.log(car.age); // 22.公有办法和字段 ES13以前,不可能在类中申明公有成员。成员传统上带有下划线 ( \_) 前缀,以表明它是公有的,但依然能够从类内部拜访和批改它。 class Person { _firstName = 'Joseph'; _lastName = 'Stevens'; get name() { return `${this._firstName} ${this._lastName}`; }}const person = new Person();console.log(person.name); // Joseph Stevens// 仍能够从类内部拜访 // 本来打算设为公有的成员console.log(person._firstName); // Josephconsole.log(person._lastName); // Stevens// 也能够批改person._firstName = 'Robert';person._lastName = 'Becker';console.log(person.name); // Robert Becker应用 ES13,咱们当初能够通过在类后面增加 ( \#) 来向类增加公有字段和成员。尝试从内部拜访这些类将会引发谬误: ...

September 12, 2023 · 4 min · jiezi

关于ecmascript:let-和-const-命令

let 和 const 命令good luck let 和 const 命令let 命令根本用法ES6 新增了let命令,用来申明变量。它的用法相似于var,然而所申明的变量,只在let命令所在的代码块内无效。 { let a = 10; var b = 1;}a; // ReferenceError: a is not defined.b; // 1下面代码在代码块之中,别离用let和var申明了两个变量。而后在代码块之外调用这两个变量,后果let申明的变量报错,var申明的变量返回了正确的值。这表明,let申明的变量只在它所在的代码块无效。 for循环的计数器,就很适合应用let命令。 for (let i = 0; i < 10; i++) { // ...}console.log(i);// ReferenceError: i is not defined下面代码中,计数器i只在for循环体内无效,在循环体外援用就会报错。 上面的代码如果应用var,最初输入的是10。 var a = [];for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 10下面代码中,变量i是var命令申明的,在全局范畴内都无效,所以全局只有一个变量i。每一次循环,变量i的值都会产生扭转,而循环内被赋给数组a的函数外部的console.log(i),外面的i指向的就是全局的i。也就是说,所有数组a的成员外面的i,指向的都是同一个i,导致运行时输入的是最初一轮的i的值,也就是 10。 ...

October 9, 2021 · 5 min · jiezi

关于ecmascript:ECMAScript-6-简介

ECMAScript 6 简介ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代规范,曾经在 2015 年 6 月正式公布了。它的指标,是使得 JavaScript 语言能够用来编写简单的大型应用程序,成为企业级开发语言。 ECMAScript 和 JavaScript 的关系一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系? 要讲清楚这个问题,须要回顾历史。1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,心愿这种语言可能成为国际标准。次年,ECMA 公布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的规范,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。 该规范从一开始就是针对 JavaScript 语言制订的,然而之所以不叫 JavaScript,有两个起因。一是商标,Java 是 Sun 公司的商标,依据受权协定,只有 Netscape 公司能够非法地应用 JavaScript 这个名字,且 JavaScript 自身也曾经被 Netscape 公司注册为商标。二是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保障这门语言的开放性和中立性。 因而,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 JScript 和 ActionScript)。日常场合,这两个词是能够调换的。 ES6 与 ECMAScript 2015 的关系ECMAScript 2015(简称 ES2015)这个词,也是常常能够看到的。它与 ES6 是什么关系呢? ...

October 9, 2021 · 3 min · jiezi

关于ecmascript:ECMAScript版本解读

介绍记录ES每年版本更新的内容解读,帮忙读书疾速了解新版本个性。这里有官网的文档: Stage 1 ProposalsStage 0 ProposalsFinished ProposalsInactive Proposals版本列表ES202010 New JavaScript Features in ES2020 That You Should Know

August 24, 2021 · 1 min · jiezi

关于ecmascript:学习使用Promise

前言最近在开发中遇到一个问题:Table行内有下拉组件四级联动,而且还能够增加新行,每个新行又是四级联动,问:如何解决?想了半天于是应用Promise解决,让我从新对Promise有了意识。 Promise详解通过MDN 官网文档对Promise有段介绍:Promise 对象用于示意一个异步操作的最终实现 (或失败)及其后果值。 一个 Promise 对象代表一个在这个 promise 被创立进去时不肯定已知的值。它让您可能把异步操作最终的胜利返回值或者失败起因和相应的处理程序关联起来。 这样使得异步办法能够像同步办法那样返回值:异步办法并不会立刻返回最终的值,而是会返回一个 promise,以便在将来某个时候把值交给使用者。 一个 Promise 必然处于以下几种状态之一: 待定(pending): 初始状态,既没有被兑现,也没有被回绝。已兑现(fulfilled): 意味着操作胜利实现。已回绝(rejected): 意味着操作失败。待定状态的 Promise 对象要么会通过一个值被兑现(fulfilled),要么会通过一个起因(谬误)被回绝(rejected)。当这些状况之一产生时,咱们用 promise 的 then 办法排列起来的相干处理程序就会被调用。如果 promise 在一个相应的处理程序被绑定时就曾经被兑现或被回绝了,那么这个处理程序就会被调用,因而在实现异步操作和绑定解决办法之间不会存在竞争状态。 因为 Promise.prototype.then 和 Promise.prototype.catch 办法返回的是 promise, 所以它们能够被链式调用。 1、构造函数 Promise()创立一个新的 Promise 对象。该构造函数次要用于包装还没有增加 promise 反对的函数。 2、静态方法 Promise.all(iterable)这个办法返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都胜利的时候才会触发胜利,一旦有任何一个iterable外面的promise对象失败则立刻触发该promise对象的失败。这个新的promise对象在触发胜利状态当前,会把一个蕴含iterable里所有promise返回值的数组作为胜利回调的返回值,程序跟iterable的程序保持一致;如果这个新的promise对象触发了失败状态,它会把iterable里第一个触发失败的promise对象的错误信息作为它的失败错误信息。Promise.all办法常被用于解决多个promise对象的状态汇合。(能够参考jQuery.when办法---译者注) Promise.allSettled(iterable)等到所有promises都已敲定(settled)(每个promise都已兑现(fulfilled)或已回绝(rejected))。返回一个promise,该promise在所有promise实现后实现。并带有一个对象数组,每个对象对应每个promise的后果。 Promise.any(iterable)接管一个Promise对象的汇合,当其中的一个 promise 胜利,就返回那个胜利的promise的值。 Promise.race(iterable)当iterable参数里的任意一个子promise被胜利或失败后,父promise马上也会用子promise的胜利返回值或失败详情作为参数调用父promise绑定的相应句柄,并返回该promise对象。 Promise.reject(reason)返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的解决办法 Promise.resolve(value)返回一个状态由给定value决定的Promise对象。如果该值是thenable(即,带有then办法的对象),返回的Promise对象的最终状态由then办法执行决定;否则的话(该value为空,根本类型或者不带then办法的对象),返回的Promise对象状态为fulfilled,并且将该value传递给对应的then办法。通常而言,如果您不晓得一个值是否是Promise对象,应用Promise.resolve(value) 来返回一个Promise对象,这样就能将该value以Promise对象模式应用。 应用Promise通过下面能够具体理解Promise的静态方法,起初就是应用Promise实例, 创立Promise Promise 对象是由关键字 new 及其构造函数来创立的。该构造函数会把一个叫做“处理器函数”(executor function)的函数作为它的参数。这个“处理器函数”承受两个函数——resolve 和 reject ——作为其参数。当异步工作顺利完成且返回后果值时,会调用 resolve 函数;而当异步工作失败且返回失败起因(通常是一个谬误对象)时,会调用reject 函数。 const myFirstPromise = new Promise((resolve, reject) => { // ?做一些异步操作,最终会调用上面两者之一: // // resolve(someValue); // fulfilled // ?或 // reject("failure reason"); // rejected});想要某个函数领有promise性能,只需让其返回一个promise即可。 ...

August 10, 2021 · 2 min · jiezi

关于ecmascript:E9二开文档

E9二开文档@Author: 福州ebu 杨文杰 1. 前端开发根底1.1 ECMAScript6 的应用ECMAScript 和 JavaScript 的关系是:前者是后者的规格,后者是前者的一种实现。 ES6 既是一个历史名词,也是一个泛指,含意是 5.1 版当前的 JavaScript 的下一代规范,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年公布的正式版本的语言规范。本书中提到 ES6 的中央,个别是指 ES2015 规范,但有时也是泛指 “下一代 JavaScript 语言”。 1.2 ES6常见的语法1.2.1 let 和 const 命令ES6 新增了let命令,用来申明变量。它的用法相似于var,然而所申明的变量,只在let命令所在的代码块内无效。 { let a = 10; var b = 1;}a // ReferenceError: a is not defined.b // 1const申明一个只读的常量。一旦申明,常量的值就不能扭转。 const PI = 3.1415;PI // 3.1415PI = 3;// TypeError: Assignment to constant variable.1.2.2 变量的解构赋值ES6 容许依照肯定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring) 如果解构不胜利,变量的值就等于undefined 数组的解构赋值let [foo, [[bar], baz]] = [1, [[2], 3]];foo // 1bar // 2baz // 3let [ , , third] = ["foo", "bar", "baz"];third // "baz"let [x, , y] = [1, 2, 3];x // 1y // 3let [head, ...tail] = [1, 2, 3, 4];head // 1tail // [2, 3, 4]let [x, y, ...z] = ['a'];x // "a"y // undefinedz // []对象的解构赋值// 常见用法let { bar, foo, baz } = { foo: 'aaa', bar: 'bbb' };foo // "aaa"bar // "bbb"baz // undefined// foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foolet { foo: baz } = { foo: 'aaa', bar: 'bbb' };baz // "aaa"foo // error: foo is not defined// 嵌套应用let obj = { p: [ 'Hello', { y: 'World' } ]};// 第一个p作为变量,则进行赋值,第二个p作为模式,不会进行赋值let { p, p: [x, { y }] } = obj;x // "Hello"y // "World"p // ["Hello", {y: "World"}]1.2.3 ... 运算符函数 rest 参数的应用function f(a, ...b) { console.log(a, b)}f(1,2,3,4,5) // 1 [2,3,4,5]数组拆解const a = [1,2,3]const b = [4,5,6]const c = [...a, ...b]c // [1,2,3,4,5,6]对象拆解const obj = { a: 111, b:222 }const copyObj = { ...obj, c: 333 }copyObj // { a: 111, b:222, c: 333 }1.2.4 函数的扩大参数默认值:ES6 容许为函数的参数设置默认值,即间接写在参数定义的前面。// 根本用法function log(x, y = 'World') { console.log(x, y);}log('Hello') // Hello Worldlog('Hello', 'China') // Hello Chinalog('Hello', '') // Hello// 参数默认值能够与解构赋值的默认值,联合起来应用。function foo({x, y = 5}) { console.log(x, y);}foo({}) // undefined 5foo({x: 1}) // 1 5foo({x: 1, y: 2}) // 1 2foo() // TypeError: Cannot read property 'x' of undefined箭头函数:ES6 容许应用(=>)定义函数。// 根本用法var f = v => v;// 等同于var f = function (v) { return v;};// 箭头函数能够与变量解构联合应用。const full = ({ first, last }) => first + ' ' + last;// 等同于function full(person) { return person.first + ' ' + person.last;}// rest 参数与箭头函数联合const numbers = (...nums) => nums;numbers(1, 2, 3, 4, 5) // [1,2,3,4,5]const headAndTail = (head, ...tail) => [head, tail];headAndTail(1, 2, 3, 4, 5) // [1,[2,3,4,5]]1.3 React根底React 是一个用于构建用户界面的 Javascript 库。 ...

July 30, 2021 · 9 min · jiezi

关于ecmascript:ES6新增语法六Generator函数详解

上篇文章《ES6新增语法(五)——Promise详解》咱们介绍Promise,Promise一旦执行就无奈暂停和勾销,所以ES6引入了Generator函数,能够通过yield关键字,把函数的执行流程挂起,能够扭转执行流程。 什么是Generator函数?Generator次要是异步编程,用来封装异步工作,是一个异步工作的容器,能够让函数依照咱们指定的时候执行或者暂停。 应用语法: function *name(){ ... yield; //须要暂停的时候加yield ... yield; ... } const p = name(); p.next() //调用函数,执行到第一个yield处进行 p.next() //从上一个yeild开始执行,到下一个yield处为止 Generator与一般函数区别1> 定义函数的时候比一般函数多了一个 * 号。 2> 调用的时候,一般函数名后加圆括号间接调用,而Generator并不执行,返回的也不是函数运行后果,而是指向外部的状态的指针对象,必须调用遍历器对象的next()办法,使得指针移向下一个状态。每次调用next,指针就会从上一次停下的中央开始执行到下一个yield。 3> 一般函数是无奈暂停的,但Generator函数是分段执行的,yield是暂停标记,而next()能够复原执行。 generator实例如下: function *show(){ console.log('1') yield; console.log('2')}const p = show();p.next(); //执行第一个yield之前内容,打印1p.next(); //执行yield之后内容,打印2yield特点1> 能够传参数,只能传一个参数 function *chuancan(){ console.log('1') let a = yield; console.log('a',a)//12}const gen = chuancan();gen.next()gen.next(12)2> 返回值 function *fanhui(){ console.log('1'); yield 55; console.log('2');}let fh = fanhui()let res1 = fh.next()console.log(res1) //{value: 55, done: false}let res2 = fh.next()console.log(res2) //{value: undefined, done: true}generator函数中也能够增加 return ...

July 21, 2021 · 1 min · jiezi

关于ecmascript:ES6新增语法五Promise详解

Promise介绍promise是一个对象,从它能够获取异步操作的音讯。有all、race、reject、resolve这几个办法,原型上有then、catch等办法。 Promise的两个特点: 对象的状态不受外界影响。Promise对象获取的是异步操作,有三种状态:pending(进行中)、fulfilled(已胜利)、reject(已失败)。除了异步操作的后果,其余操作都无奈扭转这个状态。一旦状态扭转,就不会再变。从pending变为fulfilled和从pending变为rejected状态,只有处于fulfilled和rejected,状态就不会再变。状态的毛病: 无奈勾销Promise,一旦新建它就会立刻执行,无奈中途勾销。 如果不设置回调函数,Promise外部抛出谬误,不会反馈到内部。 当处于pending状态时,无奈得悉目前停顿到哪一阶段。 应用语法: let p = new Promise( (resolve,reject)=>{ //resolve 和reject是两个函数 }) p.then( ()=>{}, // 传入的resolve函数,resolve翻译成中文是解决 ()=>{} //传入的reject函数,reject翻译成中文是回绝 ).catch((reason,data)=>{ console.log("catch失败执行回调抛出起因",reason) }) then办法then办法接管两个参数作为参数,第一个参数是Promise执行胜利时的回调,第二个参数是Promise执行失败的回调,两个函数只会有一个被调用。 通过.then增加的回调函数,不论什么时候,都会被调用,而且能够增加多个回调函数,会一次依照程序并且独立运行。 const p =new Promise((resolve,reject)=>{ resolve("胜利")})p.then((res)=>{ console.log(res)//返回胜利},(err)=>{ console.log(err)})带有多个回调函数时 const p =new Promise((resolve,reject)=>{ resolve(1)})p.then((res1)=>{ console.log('res1',res1) // 1 return res1 * 2;}).then((res2)=>{ console.log('res2',res2) //2}).then((res3)=>{ console.log('res3',res3) //undefined return Promise.resolve('resolve')}).then(res4=>{ console.log('res4',res4) //resolve})catch用法与Promise对象办法then并行的还有一个catch办法,用来捕捉异样的,与try...catch相似, const p1 = new Promise((resolve,reject)=>{ var num = Math.random()*10 ;//随机生成一个0-10的数字 console.log("num",num) if(num > 5){ resolve('大于5') }else{ reject("小于5") }})p1.then(res=>{ console.log("res",res) // res 大于5}).catch(err=>{ console.log("err",err) // err 小于5})all办法all办法示意所有的异步操作实现后才执行回调,返回后果,返回的数据是个数组,多个申请返回的数据组合。与then办法同级。 ...

July 20, 2021 · 1 min · jiezi

关于ecmascript:ES新特性

es6: https://es6.ruanyifeng.com/es6-es12: https://segmentfault.com/a/11...

July 17, 2021 · 1 min · jiezi

关于ecmascript:Iterator可迭代接口

for..of..for...of... 作为遍历所有数据结构的对立形式 for遍历一般数组 for in 遍历键值对 forEach 数组的遍历办法 const arr = [100,200,300,400]for(const item of arr){ console.log(item); //拿到的是每一个元素,而不是对应的下标 if(item>300){ break; }}//取代forEach办法,for..of..能够应用关键词break随时终止,forEach无奈终止遍历arr.forEach(function(item,index){})其余的遍历 //伪数组的遍历(arguments)// dom操作时一些元素节点的列表 的遍历//Set ,Map对象const s = new Set(['foo',"bar"])for(var i of s){ console.log(i); //foo bar}配合构造应用 const m = new Map()m.set({a:1},"value")m.set(true,100)for(var mm of m){ console.log(mm); //[ { a: 1 }, 'value' ] [ true, 100 ]}//通过解构优化下面的for..offor(var [key,value] of m){ console.log(key,value); //{ a: 1 } value || true 100}留神,遍历对象会报错 //遍历对象会报错const ddd = {naz:"mcgee",baz:100}for(var item of ddd){ console.log(item); //TypeError: ddd is not iterable}Iterable 可迭代接口for..of循环时一种数据对立遍历的形式 ...

May 18, 2021 · 2 min · jiezi

关于ecmascript:Symbol

Symbol类型Symbol新的原始数据类型 (符号)示意举世无双的值 对象的key能够应用Symbol 具备动态属性和静态方法 不反对 new Symbol() 解决不同文件应用公共变量,相互影响, //shared.js ==================================const cache = {}//a.js ======================================//cache['a_foo'] || cache['b_foo'] 以前的做法,约定好不同文件下的key,然而实质上并没有解决问题只是躲避了问题cache['foo'] = "VLAUE" //b.js ========================================cache['foo'] = "VALUE1111"const s = Symbol()console.log(s); //Symbol()console.log(typeof s); //symbolconsole.log(Symbol() === Symbol(),Symbol("aa") === Symbol("aa")); //false falseconsole.log(Symbol("aa"),Symbol("bb")) //形容文本 Symbol(aa) Symbol(bb)能够增加为属性名 const obj1 = { [Symbol()]:123}console.log(obj1);案例 //创立公有变量const name = Symbol()const person = { [name]:"zxa", say(){ console.log(this[name]); }}//b.js// person[Symbol()] //无奈创立完全相同的Symbol,取不到成员person.say() //能够拿到一般成员静态方法 const s1 = Symbol.for() //外部保护了一个全局的注册表,为增加的标识字符串和Symbol值提供一一对应,下次再搜所给定key反现有symbol会返回不会新创建const s2 = Symbol.for()console.log(s1 === s2); //true 如果增加形容字符串,则增加的形容字符串必须统一才true console.log(Symbol.for(true) === Symbol.for("true")); //true 会转化成字符串留神Symbol作为key取不到 ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:SetMap数据结构

Set数据结构ES6 提供了新的数据结构 Set。它相似于数组,然而成员的值都是惟一的,没有反复的值。 Set自身是一个构造函数,用来生成 Set 数据结构。 const s = new Set()s.add(1).add(2).add(1).add(3) //增加,可链式调用,不反复console.log(s); //Set {1,2,3}Set遍历对象 //set对象遍历s.forEach(i=>console.log(i))for(let i of s){ console.log(i);}console.log(s.size); //set对象长度console.log(s.has(100)); //falseconsole.log(s.delete(2)); //trueconsole.log(s); //{1,3}console.log(s.clear()); //革除汇合内的全部内容利用场景 //数组去重const arr = [1,1,1,3,2,1,4,4]const ss = new Set(arr)const narr = Array.from(ss) //转化成实在数组console.log(ss,narr);const result = [...ss] //转化成实在数组console.log(result); Map数据结构相似于对象,实质上都是键值对汇合 原始的对象key无论什么类型都会被转化成字符串 Map是严格意义上的键值对汇合,能够应用任意类型的键 Map与对象的区别 简略的说,Object类型就是增加计算属性,或者通过内部增加属性,他都会转化成string,且Object的key只容许string或symbol,而map很好解决了键的类型问题 传统的增加键值对 const obj = { name:"mcgee"}obj[true] = "value"obj[11] = "value"obj[{a:1}] = "value"console.log(Object.keys(obj)) //[ '11', 'name', 'true', '[object Object]' ]任意类型的Map键值对 const m = new Map()const str = {a:1};m.set(str,"value") //key , valuem.set(11,"asd")console.log(m);操作方法 ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:Class类

Class类以前创立构造函数 function Person(name){this.name = name}Person.prototype.say = function(){console.log( `hi, my name is ${this.name}`);}ES6 的类,齐全能够看作构造函数的另一种写法 class Point {// ...}typeof Point // "function"Point === Point.prototype.constructor // trueclass Point {constructor() { // ...}toString() { // ...}toValue() { // ...}}// 等同于Point.prototype = {constructor() {},toString() {},toValue() {},};constructor 办法一个类必须有constructor()办法,如果没有显式定义,一个空的constructor()办法会被默认增加 constructor()办法默认返回实例对象(即this),齐全能够指定返回另外一个对象 class Foo { constructor() { return Object.create(null); }}new Foo() instanceof Foo// false实例办法,静态方法 static class Person{ //定义一个person类型constructor(name){ //构造函数 this.name = name //以后person类型的实例对象}say(){ console.log( `hi, my name is ${this.name}`);}static create (name){ //静态方法外部this不会指向某个实例对象,而是以后的类型 return new Person(name)}}const p = new Person("mcgee")p.say()const jack = Person.create("jack")jack.say()类的继承 extends子类必须在constructor办法中调用super办法,否则新建实例时会报错。这是因为子类本人的this对象,必须先通过父类的构造函数实现塑造,失去与父类同样的实例属性和办法,而后再对其进行加工,加上子类本人的实例属性和办法。如果不调用super办法,子类就得不到this对象 ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:ProxyReflect

ProxyProxy 能够了解成,在指标对象之前架设一层“拦挡”,外界对该对象的拜访,都必须先通过这层拦挡,因而提供了一种机制,能够对外界的拜访进行过滤和改写。Proxy 这个词的原意是代理,用在这里示意由它来“代理”某些操作,能够译为“代理器” 监督某个对象的属性读写Object.defineProperty (vue3.0之前,3.0之后应用proxy) 简略介绍下 Object.defineProperty Object.defineProperty(obj,"key",{enumerable:false, //key属性是否能够在for..in || Object.keys()中被枚举configurable:false, //key属性是否可被删除,以及除 value 和 writable 个性外的其余个性是否能够被批改writable:false, //不可写入,也就是不可更改obj.keyvalue:undefined,get:undefined,set:undefined})初始化一个 new Proxy实例 const person ={name:"mcgee",age:18}//创立proxy构造函数,参数1代理的对象,参数2执行对象const personProxy = new Proxy(person,{get(target,property){ // console.log(target,property); //{ name: 'mcgee', age: 18 } name // return 100 //内部拜访属性的返回值 返回值能够是任意类型 return property in target ? target[property]:'default'},set(target,property,value){ // console.log(target,property,value); if(property === "age" && !Number.isInteger(value)){ throw new Error(`${value} is not an int`) } return target[property] == value //返回值能够是任意类型}})console.log(personProxy.name) //100 "mcgee"console.log(personProxy.xxx); //defaultpersonProxy.render = trueconsole.log(personProxy); //增加了个render为true的属性// personProxy.age = "aa" //Error: aa is not an int具体13个办法例子详见此处 ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:对象的扩展

对象的扩大对象字面量的加强 Object.is() Object.assign() Object.getOwnPropertyDescriptors() Object.keys(),Object.values(),Object.entries() 对象字面量的加强对象内属性简写,对象内办法简写,留神简写的是function不是箭头函数 const obj = { // bar:bar bar, // method:function(){}, method(){ //留神这种简写,只是针对function console.log(this); //this指向obj }, [Math.random()]:123, //计算属性名 [1+1]:2}Object.is()Object.is('foo', 'foo')// trueObject.is({}, {})// false与===不同之处只有两个:一是+0不等于-0,二是NaN等于本身。 两等在比拟之前能够进行类型转化,三等严格判断类型,对象比拟地址值 +0 === -0 //trueNaN === NaN // falseObject.is(+0, -0) // falseObject.is(NaN, NaN) // trueObject.assign()Object.assign()办法用于对象的合并,将源对象(source)的所有可枚举属性,复制到指标对象(target) 第一个参数是指标对象,前面的参数都是源对象 同名属性,则前面的属性会笼罩后面的属性 返回值就是指标对象,此时bar援用曾经改成合并后的对象 const target = { a: 1, b: 1 };const source1 = { b: 2, c: 2 };const source2 = { c: 3 };const result = Object.assign(target, source1, source2); target // {a:1, b:2, c:3}console.log(result === target) trueObject.getOwnPropertyDescriptors()ES5 的Object.getOwnPropertyDescriptor()办法会返回某个对象属性的形容对象(descriptor)。ES2017 引入了Object.getOwnPropertyDescriptors()办法,返回指定对象所有本身属性(非继承属性)的形容对象 ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:数组的扩展

数组的扩大开展运算符 Array.from() Array.of() find(),findIndex() fill() entries(),keys(),values() includes() flat() 开展运算符 console.log(...[1, 2, 3])// 1 2 3console.log(1, ...[2, 3, 4], 5)// 1 2 3 4 5[...document.querySelectorAll('div')]// [<div>, <div>, <div>]Array.from()Array.from办法用于将两类对象转为真正的数组:相似数组的对象(array-like object)和可遍历(iterable)的对象(包含 ES6 新增的数据结构 Set 和 Map) function foo() { var args = Array.from(arguments); // ...}Array.from('hello')// ['h', 'e', 'l', 'l', 'o']let namesSet = new Set(['a', 'b'])Array.from(namesSet) // ['a', 'b']Array.of()将一组值,转换为数组 Array.of(3, 11, 8) // [3,11,8]Array.of(3) // [3]Array.of(3).length // 1Array()办法没有参数、一个参数、三个参数时,返回的后果都不一样。只有当参数个数不少于 2 个时,Array()才会返回由参数组成的新数组。参数只有一个正整数时,实际上是指定数组的长度 Array.of() // []Array.of(undefined) // [undefined]Array.of(1) // [1]Array.of(1, 2) // [1, 2]数组实例的find()和findIndex()办法数组实例的find办法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员顺次执行该回调函数,直到找出第一个返回值为true的成员,而后返回该成员。如果没有符合条件的成员,则返回undefined ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:函数的扩展

函数的扩大函数参数的默认值 //老办法通过函数外部增加默认值function foo(value){// value = value || true // true为默认值,如果传入false 那么也会应用默认值,很显著谬误value = value === undefined?true:valueconsole.log(value);}foo(false)//给参数增加默认值function bar(value=true){ //多参数时,默认值要放在最初}函数的length属性指定了默认值后,length属性将失真,rest 参数也不会计入length属性 (function (a) {}).length // 1(function (a = 5) {}).length // 0(function (a, b, c = 5) {}).length // 2(function(...args) {}).length // 0函数的作用域函数进行申明初始化时,参数会造成一个独自的作用域(context)。等到初始化完结,这个作用域就会隐没。这种语法行为,在不设置参数默认值时,是不会呈现的 var x = 1;function f(x, y = x) { console.log(y);}f(2) // 2下面代码中,参数y的默认值等于变量x。调用函数f时,参数造成一个独自的作用域。在这个作用域外面,默认值变量x指向第一个参数x,而不是全局变量x,所以输入是2 let x = 1;function f(y = x) { let x = 2; console.log(y);}f() // 1下面代码中,函数f调用时,参数y = x造成一个独自的作用域。这个作用域外面,变量x自身没有定义,所以指向外层的全局变量x。函数调用时,函数体外部的局部变量x影响不到默认值变量x。如果此时,全局变量x不存在,就会报错。 ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:解构

数组解构依据数组下标提取 const arr = [1,2,3]const [foo,bar,baz] = arr //等值const [,,baz] = arr //选值const [foo,...rest] = arr // 残余值,...最初一个成员应用,是个新数组const [foo] = arr //不齐全解构const [foo,bar,baz,more,...bao] = arr //more为undefined,bao=[]const [foo,bar,baz,more="10",] = arr //默认值 more取不到取默认值const [foo] = [] //foo=undefined如果右侧不是可遍历的构造(Iterator)会报错 let [foo] = 1;let [foo] = false;let [foo] = NaN;let [foo] = undefined;let [foo] = null;let [foo] = {};数组解构默认值当一个数组成员严格等于undefined,默认值会失效 let [x = 1] = [undefined]; x // 1let [x = 1] = [null]; x // null对象解构数组解构依据下标程序解构,对象解构依据属性名匹配提取,它没有秩序 ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:let-与块级作用域

块内变量内部无法访问 if(true){let foo = "mcgee0731"}console.log(foo); //foo is not defined...for(let i=0;i< 3;i++>){}console.log(i) //i is not definedvar对循环的影响 for(var i=0;i< 3;i++){for(var i=0;i< 3;i++){ console.log(i);}}//内层循环完后 `i = 3` 到外层循环时,无奈再进入。打印0,1,2三次而不是九次// 循环内处理事件时,事件内拜访计数器var events = [{},{},{}]for(var i=0;i< events.length;i++){events[i].onclick = function(){ console.log(i)}}events[0].onclick() //无论哪一项输入都是3通过IIFE模式处理事件计数器绑定 // 应用闭包解决变量var events = [{},{},{}]for(var i=0;i< events.length;i++){events[i].onclick = (function(i){ return function(){ console.log(i) }})(i)}events[0].onclick() //0应用let 解决 for循环的问题 for(let i=0;i< 3;i++){for(let i=0;i< 3;i++){ console.log(i);}}...var events = [{},{},{}]for(let i=0;i< events.length;i++){events[i].onclick = function(){ console.log(i)}}events[0].onclick() //0for循环内有两层作用域,咱们对上面的办法进行拆解for(let i =0;i < 3;i++){ let i = "foo" console.log(i);}拆解成...let i =0; //这是for循环的作用域 if(i<3){ let i = "foo" //这个n是块内的n,}i++会执行三次不存在变量晋升 ...

May 18, 2021 · 1 min · jiezi

关于ecmascript:ES6-Reflect反射机制

Reflect handlergetsethasapplycalldefineProperty(定义属性,可能细化属性形容)deletePropertyisExtensiblepreventExtensionsgetPrototypeOf(读取原型对象)setPrototypeOf(设置原型对象)ownKeysgetOwnPropertyDescriptorconstructSymbol(Symbol.toStringTag): "Reflect"

May 6, 2021 · 1 min · jiezi

关于ecmascript:ES6数值的扩展

本节咱们学习 ES6 中的罕用数据类型之数值(Number)类型。ES6 中除了 JavaScript 中的六种数据类型之外,还引入了一种新的原始数据类型 Symbol,它是 JavaScript 语言的第七种数据类型: Number (数值)String(字符串)Boolean(布尔值)Object(对象)undefinednullSymbol二进制和八进制表示法ES6 中提供了二进制和八进制数值的新的写法: 二进制的新写法能够应用前缀 0b 或者 0B 示意。let a = 0b1001;console.log(a); // 输入:9八进制的新写法能够应用前缀 0o 或者0O示意。let b = 0o345;console.log(b); // 输入:229从 ES5 开始,在严格模式之中,八进制就不再容许应用前缀 0 示意,ES6 进一步明确,要应用前缀0o示意。 // 非严格模式(function(){console.log(0o11 === 011);})() // true // 严格模式(function(){ 'use strict'; console.log(0o11 === 011);})() 执行代码后,报错信息如下所示: SyntaxError: Octal literals are not allowed in strict mode.如果要将 0b 和 0o 前缀的字符串数值转为十进制,要应用 Number 办法。 示例:console.log(Number('0b110')); // 输入:6console.log(Number('0o43')); // 输入:35Number对象的罕用办法ES6 在 Number 对象上提供了一些办法,咱们一起来看一下。 ...

December 18, 2020 · 2 min · jiezi

关于ecmascript:ES6中的Promise和Generator详解

简介ES6中除了上篇文章讲过的语法新个性和一些新的API之外,还有两个十分重要的新个性就是Promise和Generator,明天咱们将会具体解说一下这两个新个性。 Promise什么是PromisePromise 是异步编程的一种解决方案,比传统的解决方案“回调函数和事件”更正当和更弱小。 所谓Promise,简略说就是一个容器,外面保留着某个将来才会完结的事件(通常是一个异步操作)的后果。 从语法上说,Promise 是一个对象,从它能够获取异步操作的音讯。 Promise的特点Promise有两个特点: 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已实现,又称 Fulfilled)和Rejected(已失败)。 只有异步操作的后果,能够决定以后是哪一种状态,任何其余操作都无奈扭转这个状态。 一旦状态扭转,就不会再变,任何时候都能够失去这个后果。Promise对象的状态扭转,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。 这与事件(Event)齐全不同,事件的特点是,如果你错过了它,再去监听,是得不到后果的。 Promise的长处Promise将异步操作以同步操作的流程表达出来,防止了层层嵌套的回调函数。 Promise对象提供对立的接口,使得管制异步操作更加容易。 Promise的毛病无奈勾销Promise,一旦新建它就会立刻执行,无奈中途勾销。如果不设置回调函数,Promise外部抛出的谬误,不会反馈到内部。当处于Pending状态时,无奈得悉目前停顿到哪一个阶段(刚刚开始还是行将实现)。Promise的用法Promise对象是一个构造函数,用来生成Promise实例: var promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作胜利 */){ resolve(value); } else { reject(error); } });promise能够接then操作,then操作能够接两个function参数,第一个function的参数就是构建Promise的时候resolve的value,第二个function的参数就是构建Promise的reject的error。 promise.then(function(value) { // success }, function(error) { // failure });咱们看一个具体的例子: function timeout(ms){ return new Promise(((resolve, reject) => { setTimeout(resolve,ms,'done'); }))}timeout(100).then(value => console.log(value));Promise中调用了一个setTimeout办法,并会定时触发resolve办法,并传入参数done。 最初程序输入done。 Promise的执行程序Promise一经创立就会立马执行。然而Promise.then中的办法,则会等到一个调用周期过后再次调用,咱们看上面的例子: let promise = new Promise(((resolve, reject) => { console.log('Step1'); resolve();}));promise.then(() => { console.log('Step3');});console.log('Step2');输入:Step1Step2Step3Promise.prototype.then()then办法返回的是一个新的Promise实例(留神,不是原来那个Promise实例)。因而能够采纳链式写法,即then办法前面再调用另一个then办法. ...

December 17, 2020 · 3 min · jiezi

关于ecmascript:eshbase学习

第一步:搞清楚这个框架(技术)是干什么的,解决了什么问题和痛点,同类“竞品”还有哪些 第二步:怎么用 第三步:理解原理 ElasticsearchWHATElasticsearch 是一个基于 Lucene 的 搜寻服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。 Elasticsearch 是用 Java 语言开发的,是一种风行的企业级搜索引擎。 Elasticsearch 的底层是开源库 Lucene。咱们没有方法间接应用 Lucene ,必须本人写代码去调用它的接口。Elasticsearch 是 Lucene 的封装,提供了 RESTful API 的操作接口,开箱即用。 WHY应用数据库 来做搜寻业务,不能很好的满足需要。 尽管某一水平上也能够视为数据库,然而它更次要的身份还是一个优良的全文搜索引擎。它的呈现解决了一部分传统关系型数据库和NoSQL非关系型数据库所没有方法高效实现的一些工作,比方高效的全文检索,结构化检索,甚至是数据分析。 响应工夫eg:数据库在做含糊查问时,如LIKE 语句,它会遍历整张表,同时进行字符串匹配。 而 es 是基于 顺叙索引 的 ,检索速度十分快。 分词Elasticsearch反对中文分词插件 相关性Elasticsearch 反对全文搜寻和相关度评分。这样在返回后果就会依据分数由高到低排列。分数越高,意味着和查问语句越相干。 可视化界面MySQL的Navicat Elasticsearch 的 Kibana HOW入门应用 HbaseWHTAHadoop Database HBase 是Apache的 Hadoop 我的项目的子项目。 HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。 HBase 不同于个别的关系数据库,它是一个适宜于非结构化数据存储的数据库, HBase基于列的而不是基于行的模式. HBase的原型是Google的BigTable论文。 WHYMySQL无奈满足海量的数据存储, MySQL -> 面向行存储 HBase -> 面向行存储 HOWHBase概念视图图 表名:webtable 两行:com.cnn.www 和 com.example.www ...

November 13, 2020 · 1 min · jiezi

关于ecmascript:ES6ES7ES8学习指南

作者:CrazyCodeBoy链接:https://www.jianshu.com/p/1ae... 概述ES全称ECMAScript,ECMAScript是ECMA制订的标准化脚本语言。目前JavaScript应用的ECMAScript版本为ECMAScript-262。 ECMAScript 规范建设在一些原有的技术上,最为驰名的是 JavaScript (网景) 和 JScript (微软)。它最后由网景的 Brendan Eich 创造,第一次呈现是在网景的 Navigator 2.0 浏览器上。Netscape 2.0 以及微软 Internet Explorer 3.0 后序的所有浏览器上都有它的身影。 理解这些个性,不仅能使咱们的编码更加的符合规范,而且能进步咱们Coding的效率。ES6的个性ES6的个性比拟多,在 ES5 公布近 6 年(2009-11 至 2015-6)之后才将其标准化。两个公布版本之间时间跨度很大,所以ES6中的个性比拟多。 在这里列举几个罕用的: 类模块化箭头函数函数参数默认值模板字符串解构赋值延展操作符对象属性简写PromiseLet与Const1.类(class)对相熟Java,object-c,c#等纯面向对象语言的开发者来说,都会对class有一种非凡的情怀。ES6 引入了class(类),让JavaScript的面向对象编程变得更加简略和易于了解。 class Animal { // 构造函数,实例化的时候将会被调用,如果不指定,那么会有一个不带参数的默认构造函数. constructor(name,color) { this.name = name; this.color = color; } // toString 是原型对象上的属性 toString() { console.log('name:' + this.name + ',color:' + this.color); } } var animal = new Animal('dog','white');//实例化Animal animal.toString(); console.log(animal.hasOwnProperty('name')); //true console.log(animal.hasOwnProperty('toString')); // false console.log(animal.__proto__.hasOwnProperty('toString')); // true class Cat extends Animal { constructor(action) { // 子类必须要在constructor中指定super 函数,否则在新建实例的时候会报错. // 如果没有置顶consructor,默认带super函数的constructor将会被增加、 super('cat','white'); this.action = action; } toString() { console.log(super.toString()); } } var cat = new Cat('catch') cat.toString(); // 实例cat 是 Cat 和 Animal 的实例,和Es5完全一致。 console.log(cat instanceof Cat); // true console.log(cat instanceof Animal); // true 2.模块化(Module)ES5不反对原生的模块化,在ES6中模块作为重要的组成部分被增加进来。模块的性能次要由 export 和 import 组成。每一个模块都有本人独自的作用域,模块之间的互相调用关系是通过 export 来规定模块对外裸露的接口,通过import来援用其它模块提供的接口。同时还为模块发明了命名空间,避免函数的命名抵触。 ...

November 9, 2020 · 6 min · jiezi

重新认识const-和-let

es6中提供2个声明变量的关键字const 和 let首先,这2个都是块级作用域,在此之前JavaScript是没有块级作用域的概念的。并且在他们的变量声明之前访问都是不允许的。区别就在于,const 声明之后的变量不允许重新赋值。 这里的const 可不像 java中的const那样,不能 理解为不可变,常量。JavaScript中的const,是不能重新声明赋值,但是你改他里面的属性值,删里面的属性都是可以的。如果想要达到上面提到的 java中的const那样的效果,即不能修改。可以使用Object.freeze(obj)达到效果。

July 3, 2020 · 1 min · jiezi

ES6的快速理解

第一节:forEach曾经的遍历for,难理解!最后返回出来的就是这几个 var name = ['Aaron','Ben','Cands','Dade']for(var i=0; i<name.length; i++){ console.log(name[i])}forEach很简单,把你要遍历的东西加一个forEach,把你所有值批量一个名字a, 他就会按顺序给你返回 var name = ['Aaron','Ben','Cands','Dade']name.forEach(function(a){ console.log(a)})小实验,把123455678加一起鸡鸡有这些,用一个sum鸡窝依次放进去!最后返回55只小鸡鸡 var jj = [1,2,3,4,5,6,7,8,9,10]var sum = 0jj.forEach(function(n){ sum+=n})console.log(sum)链接同样的用这个方法更方便!过滤返回来未选中的留下,其他的隐藏。 第二节:map说白了,就是把原本的数组复制一份,然后改改值.再起一个名字曾经养了一堆鸡鸡,然后把原本的鸡鸡乘以2然后返回的价格起一个新的名字叫做KFC。鸡鸡本身便宜,改名就贵了一圈 var jj = [1,2,3,4,5,6,7,8,9,10]var kfc = jj.map(function(n){ return n*2})console.log(kfc)第三节:filter俗称的过滤器,简单的说 新冠状病毒里生病呈阳性的站出来这种就是过滤 var bd = [ {name:"刘忙", type:"Yang"}, {name:"马超", type:"Yin"}, {name:"赵三", type:"Yin"}, {name:"周敏", type:"Yang"}]var txt = bd.filter(function(a){ return a.type === 'Yang'})console.log(txt)第三节:find

June 16, 2020 · 1 min · jiezi