es6入门到五连绝世之三杀(triple kill )

  • 欢迎来到e6语法笔记教学
    • 一、Promise 简介
      • 1.1、Promise 异步执行顺序
      • 1.2、自定义 promise
      • 1.3、自定义Promise示例
      • 1.4、同时处理多个 Promise
    • 二、循环遍历
      • 2.1、for ,of 遍历简介
      • 2.2、for ,of 遍历示例
    • 三、Array数组方法
      • 3.1、Array.from() ... of() 浅析
      • 3.2、Array 其他实用方法
    • 四、剩余参数与扩展运算符
      • 4.1、剩余参数使用
      • 4.2、扩展运算符
      • 4.3、扩展运行符示例

欢迎来到e6语法笔记教学

  1. 这篇博客的记录手法,是通过 demo 记录 es6 要点,注释详细,运行结果也已备注,可能对于技术上的讨论很少,主要面向 es6 入门读者,篇幅可能很长,但是各个节点区分明确,可选择学习…
  2. 感觉从三连决胜开始,玩的开始高阶,一些更具实操意义的东西。这能在工作中确实能够帮助到你的东西

一、Promise 简介

1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列

1.1、Promise 异步执行顺序

如果有大量异步操作,而异步本身是没执行顺序的,这样就会出现问题,为了满足自身业务需求,将异步嵌套达到执行时排序,但是如果大量异步需要嵌套,则会出现 “回调地狱” 的问题,头皮发麻的那种!!!

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.0/axios.min.js" type="text/javascript"></script>
<script type="text/javascript">let user;// jquery 的异步获取 github 上所有用户$.get('https://api.github.com/users', data => {console.log('fetched all users');user = data[0].login;// 异步取出返回的第一个用户的 repos , 此异步的执行是必须在前一个异步之后,故嵌套在其里面$.get(`https://api.github.com/users/${user }/repos`, data => {console.log('fetched all repos');console.log(data);});});// 上面的嵌套,如果大量出现,一层层的,就会出现“回调地狱”的现象// promise 理解就像一种承诺,无论请求是否成功,都会给你一个返回信息,基于axios解决“回调地狱”const userPromise = axios.get('https://api.github.com/users');userPromise.then(reponse =>{       // then() 就是请求返回的监听, reponse参数返回的信息console.log(reponse);let username = reponse.data[0].login;   // 取出用户名return axios.get(`https://api.github.com/users/${username }/repos`);    // 这里返回的同样还是一个 promise}).then(reponse => {        // 可接着对上面 return 的 peomise 接着监听console.log(reponse.data);}).catch(err =>{        // 异常捕获console.error(err);   // 智能打印对应的 异步请求 的错误});</script>

1.2、自定义 promise

如果嫌弃引用别的框架太大,而自己只是想用一下异步的处理 promise,那么可以自定义实现,展示如下:

<script type="text/javascript">// 自定义 promiseconst p = new Promise((resolve, reject) => {// 模拟异步请求setTimeout(() => {/*1、参数介绍resolve:用来返回成功的操作数据reject : 如果失败用来返回指定信息,Error(),具体提示报错是哪一行!*///resolve("异步成功数据!");reject(Error("异步失败哦!"));}, 2000);})p.then(data => {console.log(data); // 异步成功数据!}).catch(err => {console.log(err);   //Error: 异步失败哦! at index.html:63});</script>

1.3、自定义Promise示例

自定义使用 Promose 时,如果需要多个异步,使用函数拆解,监听其返回即可!!!

<script type="text/javascript">// 模拟后台数据中的表const repos = [{name: 'grit', owner: 'mojombo', description: 'Grit is no longer maintained', id: 1},{name: 'jsawesome', owner: 'vanpelt', description: 'Awesome JSON' , id: 2},{name: ' merb-core', owner: 'wycats', description: 'Merb Core: All you need. None you don\'t.', id: 3},];const owners =[{name: 'mojombo', location: 'San Francisco', followers: 123},{name: 'vanpelt', location: 'Bay Minette' , followers: 1034},{name: 'wycats', location: 'Los Angeles, CA', followers: 388}];// 定义函数获取function getRepoById(id){// 使用 promisereturn new Promise((resolve, reject) =>{// 模拟异步请求setTimeout(() => {const repo = repos.find(repo => repo.id === id);// 查找到有数据就是 trueif(repo){resolve(repo);}else{reject(Error(`No repo found.`));}}, 1000);   //1秒后});}// 定义函数获取function comboundOwner(repo){// 使用 promisereturn new Promise((resolve, reject) =>{const owner = owners.find(owner => owner.name === repo.owner);// 查找到有数据就是 trueif(owner){repo.owner = owner;     // 将repo 中的 ower 信息补全resolve(repo);}else{reject(Error(`No owner found.`));}});}// 调用函数后直接使用 then() 监听getRepoById(1).then(repo => {console.log(repo);return comboundOwner(repo);     // 调用函数,并返回,同 axios}).then(repo => {           // 再次监听console.log(repo);}).catch(err =>{console.log(err);});</script>

1.4、同时处理多个 Promise

Promise.all(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有 的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);
如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。

Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝(第一个处理完的 promise)

<script type="text/javascript">const usersPromise = new Promise((resolve, reject) =>{setTimeout(() =>{resolve(['mojombo', 'vanpelt', 'wycats']);}, 2000);});const moviePromise = new Promise((resolve, reject) =>{setTimeout(() =>{// 使用了一个随机函数,概率返回if(Math.round(Math.random()*10) > 5 ){resolve({name: '摔跤吧,爸爸!', rating: 9.2, year: 2016});}else{reject(Error('No movie'));}}, 500);});Promise.all([usersPromise, moviePromise])      // 添加两个 promise.then(responses => {                    // 所有正确执行完,才会执行监听里面的//(2) [Array(3), {…}]   ,打印的是一个长度为2的数组,第一个元素是长度为3的数组,第二个元素是个对象//console.log(responses);// 数组解构打印const [users, movie] = responses;console.log(users);         // ["mojombo", "vanpelt", "wycats"]console.log(movie);         // {name: "摔跤吧,爸爸!", rating: 9.2, year: 2016}}).catch(err => {       // 只要有一个 promise 失败,则立马执行 catch 块console.log(err);});Promise.race([usersPromise, moviePromise])      // 添加两个 promise.then(responses => {                    // 添加的两个promise,由于其定时时间是不一样的,则第一个 Promise 执行正确返回才会执行监听里面的console.log(`responses:${responses }`);         // responses:[object Object]}).catch(err => {       // 第一个 Promise 执行完的返回失败,则立马执行 catch 块console.log(`err:${err }`);});</script>

二、循环遍历

2.1、for ,of 遍历简介

<script type="text/javascript">// 定义一个数组,循环遍历const fruits = ['Apple', 'Banana', 'Orange', 'Mango'];// 为其原型对象加个值fruits.describe = "My favorite fruits";// 1、此循环比较繁琐,可读性也不是很高for(let i=0; i<fruits.length; i++){console.log(fruits[i]);    //逐个打印}// 2、js 提供的数组遍历函数,简化了语法,使用 fruit 变量参数遍历即可fruits.forEach( fruit => {// 缺点: 不能终止或跳过,下面的break,continue 会报错if(fruit === 'Orange'){//break;    //SyntaxError: Illegal break statement//continue;   //SyntaxError: Illegal continue statement: no surrounding iteration statement}console.log(fruit);        //逐个打印});// 3、for in 循环遍历下标for(let index in fruits){console.log(fruits[index]);    //缺点:逐个打印,还会打印其原型对象添加的值My favorite fruits}// 4、推荐使用 for of,取上之精华,去之其糟粕for(let fruit of fruits){//  支持终止与跳过if(fruit === 'Orange'){break;//continue;}console.log(fruit);        //逐个打印}
</script>

补充:有些场景可能需要使用到 index 下标
es6-for…of 循环一个数组返回索引的语法:
for(let [index,elem] of new Map( arr.map( ( item, i ) => [ i, item ] ) )){
  console.log(index);
  console.log(elem);
}

<script type="text/javascript">var arr = [ 'a', 'b', 'c' ];// new Map() 将其每次循环返回的 key=value,构建成新的 mapfor( let [i, item] of new Map( arr.map((item, i) => [i, item]) ) ){console.log( i, item ); //0 "a"     1 "b"       2 "c"}</script>

2.2、for ,of 遍历示例

上一节讲到 for … of 可遍历可迭代对象,可迭代对象是部署了Iterator接口,或者定义了 [ Symbol.Iterator ] 方法的数据结构,遍历器便提供了这样的一种遍历方式。

<script type="text/javascript">// 1、定义一个数组,使用遍历器循环遍历const fruits = ['Apple', 'Banana', 'Orange', 'Mango'];// 接受其遍历器对象const iterator = fruits.entries();for(let fruit of iterator){// 其遍历器返回的是有下标的数组,这样既可以得到值,又能获得下标console.log(fruit);     //[0, "Apple"], [1, "Banana"], [2, "Orange"], [3, "Mango"]console.log(fruit[1]);  // 每次循环获得上面数组的第二的元素,Apple  Banana  Orange  Mango}// 解构语法改写for(let [index, fruit] of fruits.entries()){// 理想状态的遍历结果如下console.log(`${fruit} ranks ${index + 1} in my favorite fruits`);}// 2、 遍历参数 arguments 对象function sum(){let total = 0;// 这里是一个参数对象arguments,虽然不是数组,但可以使用 for...of 遍历for(let num of arguments){total = num + total;}console.log(total);     // 612return total;}sum(10,24,58,69,451);// 3、遍历字符串let name = 'Tom';for(let char of name){console.log(char);  //逐个打印 T  o  m}// 4、遍历 nodlist 类型的标签集合// 获取网页中所有 <li> 标签const list = document.querySelectorAll('li');for(let li of list){// meige li 都绑定一个点击事件li.addEventListener('click', function(){// 被点击的对象添加高亮样式this.classList.toggle('highlight');});}</script>

三、Array数组方法

3.1、Array.from() … of() 浅析

e6 为类数组提供的新方法 Array.from() ,Array.from() 方法从一个类似数组或可迭代对象中创建一个新的。类数组对象就是拥有 length 属性,可遍历的对象。

<ul><li>Go to store</li><li>Watch TV</li><li>Go Shopping</li>
</ul>
<script type="text/javascript">// 1、 将标签元素集合对象转换为数组const todos = document.querySelectorAll('li');console.log(todos);  // f12 看其打印类型,_proto__: NodeList// 必须要将todos转换为 数组对象,才能调用数组原型的 map() 方法const todosArr = Array.from(todos);const names = todosArr.map(todo => todo.textContent);console.log(names);      // ["Go to store", "Watch TV", "Go Shopping"]// Array.from()的第二个参数(可选),mapFn 最后生成的数组上再执行一次 map 方法后再返回// 将上面内容可改写成一步const strs = Array.from(todos, todo => todo.textContent);console.log(strs);      // ["Go to store", "Watch TV", "Go Shopping"]// 2、将 arguments 参数转换为数组function sum(){console.log(arguments);    // f12 查看其类型__proto__: Object// reduce()调用之前,必须将 arguments 转为数组return Array.from(arguments).reduce((prev, curr) => prev + curr, 0);}console.log(sum(78,85,63));  //226// 3、字符串转换为数组const website = "Laravist";console.log(Array.from(website));    //["L", "a", "r", "a", "v", "i", "s", "t"]</script>

Array数组创建时,由于传入参数个数不一样,导致其方法的创建行为是不一样的,Array.of()能解决这样的不一致性,Array.of() 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
看下图:

<script type="text/javascript">let news = new Array(7);console.log(news);   //(7) [empty × 7],长度为7,各元素为空的数组let arr = Array.of(7);console.log(arr);        //[7],长度为1,元素是7arr = Array.of(7, 2, 3);console.log(arr);        //[7, 2, 3]</script>

3.2、Array 其他实用方法

 <script type="text/javascript">// 1、 声明了一个数组对象const inventory = [{name: 'apples', quantity: 2},{name: 'bananas', quantity: 0},{name: 'cherries', quantity: 5}];/*1、 查找数组中满足某个条件的元素,相对于for...of 循环,使用方法更简便find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined,找到立马return参考:https://www.runoob.com/jsref/jsref-find.html*/const bananas = inventory.find( (currentValue, index, arr) => {if(currentValue.name === 'bananas'){return true; // 找到 return true, bananas变量接受到当前浏览的对象}return false;});//const bananas1 = inventory.find( fruit => fruit.name === 'bananas'); //简写形式,推荐console.log(bananas);    //{name: "bananas", quantity: 0}/*2、 同理,查询数组中某个条件的元素的下标,找到立马returnfindIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。*/const cherries = inventory.findIndex(fruit => fruit.name === 'cherries'); //简写console.log(cherries);      //2 ,这是返回的下标/*3、 检测数组中是否存在至少一个元素,满足自己传入的函数检验,存在-->true, 不存在 --> false (至少一个返回true)some() 方法检测 TypedArray 的一些元素是否通过所提供函数的测试。*/const isEnough = inventory.some(fruit => fruit.quantity >0 );console.log(isEnough);   // true/*4、 同上,检测所有元素是否满足传入函数,一个不满足马上返回 falseevery() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。*/const isAllEnough = inventory.every(fruit => fruit.quantity >0 );console.log(isAllEnough);   // false</script>

四、剩余参数与扩展运算符

4.1、剩余参数使用

JS函数内部有个arguments对象,可以拿到全部实参。现在ES6给我们带来了一个新的对象,可以拿到除开始参数外的参数,即剩余参数。

理解:剩余参数语法允许我们将一个不定数量的参数表示为一个数组

<script type="text/javascript">/*1、 剩余参数,用于对参数需要计算的场景...numbers : ...后加上自定义的参数变量名 numbers 即可*/function sum(...numbers){console.log(numbers);   //(4) [1, 2, 5, 4], __proto__: Array(0),原型为数组,与 arguments 区别return numbers.reduce((prev, curr) => prev + curr, 0);}console.log(sum(1, 2, 5, 4));    // 12/*2、 剩余参数只能是函数形参的最后一个的位置,且前面可以有多个其他形参*/function converCurrency(rate, ...amounts){console.log(rate, amounts);   // (3) [2, 5, 4], 只接受剩下没有映射的的参数,与 arguments 区别return amounts.map(amount => amount * rate);}console.log(converCurrency(0.85, 2, 5, 4)); //(3) [1.7, 4.25, 3.4]/*3、 应用于数组的解构*/const player = ['Jelly', 12345, 6, 8, 5, 7];const [name, id, scores] = player;  // 复习,数组结构是下标对应映射console.log(name, id, scores);     //Jelly 12345 6 , 解构时 player 后面下标位没有则没有映射传入// 如果 scores1 解构剩余的元素,使用剩余参数const [name1, id1, ...scores1] = player;  // 复习,数组结构是下标对应映射console.log(name1, id1, scores1);       //Jelly 12345 (4) [6, 8, 5, 7]</script>

4.2、扩展运算符

扩展运算符是把一个可遍历的对象的每个元素,扩展成一个新的参数序列

<script type="text/javascript">/*数组之间的整合,由浅入深,讲解*/const youngers = ['George', 'John', 'Tom'];const olders = ['Tencent', 'Baidu', 'Ali'];// 1、利用数组的 concat() 方法,将数组整合为一个新的数组,原数组不变const numbers = youngers.concat(olders);console.log(youngers);  // ["George", "John", "Tom"]console.log(numbers);   // ["George", "John", "Tom", "Tencent", "Baidu", "Ali"]// 2、如果想在整合时在 youngers 和 olders 中新加一个 marry,老套用法let nums = [];         //先定义这是个数组nums = nums.concat(youngers);nums.push("Marry");     // 从数组尾部追加一个元素nums = nums.concat(olders);console.log(nums);     // ["George", "John", "Tom", "Marry", "Tencent", "Baidu", "Ali"]// 3、扩展运算符const str = 'Jerry';const sarr = [...str];  // 将每个字符扩展成了数组元素。此处等同 [...'Jerry']console.log(sarr);      //  ["J", "e", "r", "r", "y"]// 4、利用扩展运算符整合 youngers 和 olderslet news = [...youngers, ...olders];console.log(news);      // ["George", "John", "Tom", "Tencent", "Baidu", "Ali"]// 5、当然,新增 marry 如下:const newS = [...youngers, 'Marry', ...olders];console.log(newS);      // ["George", "John", "Tom", "Marry", "Tencent", "Baidu", "Ali"]// 6、浅析关于数组间赋值,是对象间的地址的引用let s1 = youngers;s1[0] = 'Str';          // 改变了 s1 数组的0下标元素值,打印发现 youngers 数组也发生了变化console.log(s1);        //  ["Str", "John", "Tom"]console.log(youngers);  //  ["Str", "John", "Tom"]// 6.1、杜绝上面的现象,利用 concat() 生成一个新的数组let s2 = [].concat(olders);s2[0] = 'Change';console.log(s2);        // ["Change", "Baidu", "Ali"]console.log(olders);    // ["Tencent", "Baidu", "Ali"]//6.2、使用扩展运算符改写let s3 = [...olders];s3[0] = 'Hello';console.log(s3);        // ["Hello", "Baidu", "Ali"]console.log(olders);    // ["Tencent", "Baidu", "Ali"]</script>

4.3、扩展运行符示例

1、 下面这个是一个结合扩展运算符,写的一个漂亮的 css 动态展示效果,里面介绍了两个有意思的 css 属性:transform、transition。

<style>.highlight{padding: 2px 5px;background: #00adb4;color: white;}.heading{justify-content: center;align-items: center;font-family: sans-serif;font-size: 50px;color: white;text-shadow: 3px 3px 0 rgba(0, 0, 0, 0.2);background-color: #f2be45;display: inline-block;}.heading span{cursor: pointer;display: inline-block;/*transition 属性是一个简写属性,用于设置四个过渡属性参考:https://www.w3school.com.cn/cssref/pr_transition.asp*/transition: transform 0.25s;}.heading span:hover{color: black;/*transform 属性向元素应用 2D 或 3D 转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜参考地址:https://www.w3school.com.cn/cssref/pr_transform.asp注意:对于内联元素 span 是不会有旋转效果的,所以上面的样式将 span 设置了 display: inline-block;*/transform: translateY(-20px) rotate(10deg) scale(2);}
</style>
<body><h2 class="heading">LARAVIST!</h2>
<script type="text/javascript">/*通过 js 为上方h2标签元素的内容添加样式*/const heading = document.querySelector(".heading");// 定义函数,将字符串内容扩张成字符数组,逐一处理function wrapWithSpan(context){//下面这一步简写,是不是很简单,此处所涉及到的都是之前举例过的知识return [...context].map(text => `<span>${text}</span>`).join('');}console.log(wrapWithSpan(heading.textContent));     // 查看返回的数据// 将返回的数据重新写回 h2 标签元素heading.innerHTML = wrapWithSpan(heading.textContent);</script>
</body>

2、 扩展运算符应用于标签元素,对象属性,数组元素的示例。

<ul><li>Go to store</li><li>Watch TV</li><li>Go Shopping</li>
</ul>
<script type="text/javascript">/*1、 应用于标签元素*/const todos1 = document.querySelectorAll("li");     //__proto__: NodeListconsole.log(Array.from(todos1));     // 使用之前讲解的方法将其转换为 数组类型// 使用扩展运算符将todos转为数组再调用map()方法console.log([...todos1].map(todo => todo.textContent));  // ["Go to store", "Watch TV", "Go Shopping"]/*2、 扩展对象的属性*/const favorites = {color: ['white', 'black'],fruit: ['banana', 'mongo']}// 在购买的列表中把喜欢的对象的水果属性扩展进来const shoppingList = ['milk', 'sweets', ...favorites.fruit];console.log(shoppingList);     // ["milk", "sweets", "banana", "mongo"]/*3、 扩展数组元素, 删除 todoss 数组中id为1(下标为1)的元素*/let todos = [{id: 1, name: 'go to store', complete: false},{id: 2, name: 'watch TV', complete: true},{id: 3, name: 'go shopping', complete: false}]const todoIndex = todos.findIndex(todo => todo.id === 2);  // 获得下标 1/*arrayObject.slice(start,end):可从已有的数组中返回选定的元素。--start   必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。--end   可选。规定从何处结束选取。如果没有指定该参数,那么切分的数组结束的所有元素。参考地址:https://www.w3school.com.cn/jsref/jsref_slice_array.asp*///  下面注释内容得到的是一个二维数组,因为 slice() 切分得到是数组,而不是对象// const newTodos = [todos.slice(0, todoIndex), todos.slice(todoIndex + 1)];    // [Array(1), Array(1)]const newTodos = [...todos.slice(0, todoIndex), ...todos.slice(todoIndex + 1)]; //通过扩展运算符,迭代数组中的元素(对象),得到对象console.log(newTodos);  // [{…}, {…}]todos = newTodos;console.log(todos); // [{…}, {…}]</script>

3、 扩展运算符应用到函数参数的传入。

<script type="text/javascript">/*1、 扩展运算符在函数中运用,数组追加元素*/const fruit = ['apple', 'banana', 'pear'];const newFruit = ['orange', 'mongo'];// 将 newFruit 添加到 fruit 中//  fruit.push(newFruit);  // ["apple", "banana", "pear", Array(2)] ,添加的元素为数组,不是我们想要的/*apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性Function.apply(obj,args)方法能接收两个参数obj:这个对象将代替Function类里this对象args:这个是数组,它将作为参数传给Function(args-->arguments)*/// fruit.push.apply(fruit, newFruit); //["apple", "banana", "pear", "orange", "mongo"] ,可以利用 apply() 传值fruit.push(...newFruit);   // es6 写法,简单快捷,需注意这不同于 concat(),这里更改的就是原来的数组console.log(fruit);         //  ["apple", "banana", "pear", "orange", "mongo"],/*2、 日期函数传参*/const dateFields = [2019, 9, 12];// const date = new Date(dateFields[0], dateFields[1], dateFields[2]); //想利用这种数组来构建是不是很繁琐const date = new Date(...dateFields);   // es6改写,再多参数也灵活传入console.log(date);  // Sat Oct 12 2019 00:00:00 GMT+0800 (中国标准时间)</script>

es6入门到五连绝世之三杀(triple kill )相关推荐

  1. es6入门到五连绝世之四杀(quadra kill )

    es6入门到五连绝世之四杀(quadra kill ) 欢迎来到e6语法笔记教学 一.symbol 数据类型 1.1.介绍及使用 欢迎来到e6语法笔记教学 这篇博客的记录手法,是通过 demo 记录 ...

  2. es6入门到五连绝世之一血(first blood)

    es6入门到五连绝世之一血(first blood) 欢迎来到e6语法笔记教学 一.变量声明 1.1.变量声明有三种方式 1.2.JS中的块级作用域,var.let.const 三者的区别 1.2.1 ...

  3. Redis入门到五连绝世

    Redis入门到五连绝世 一.Nosql 的简介 1.功能优点 2.传统数据库 RDBMS VS NOSQL 3.3V + 3高 4.Nosql数据库四大分类 5.在分布式数据库中CAP原理 CAP ...

  4. ES6学习(五)—数组的扩展

    ES6学习(五)-数组的扩展 挑重点 文章只列举了一部分 完整版请看阮一峰ES6入门教程 点我查看阮一峰ES6入门教程 一.扩展运算符 扩展运算符(spread)是三个点(-).它好比 rest 参数 ...

  5. ES6入门之对象的扩展

    1. 属性的简洁表示法 在ES6中 允许直接写入变量和函数,作为对象的属性和方法,使得代码的书写更为简洁. const f = 'a' const b = {f} b // {f: 'a'}等同于 c ...

  6. Python3快速入门(五)——Python3函数

    Python3快速入门(五)--Python3函数 一.函数定义 1.函数定义 Python 定义函数使用 def 关键字,一般格式如下: def function_name(parameter_li ...

  7. ES6入门笔记(一)

    ES6入门笔记(一) 安装babel 由于浏览器对ES6的支持还不是很好,编写ES6代码前我们要安装一个babel工具将ES6代码编译成ES5代码,用如下命令安装babel: npm install ...

  8. es6入门6--数组拓展运算符,Array.from()基本用法

    本文只是作为ES6入门第九章学习笔记,在整理知识点的同时,会加入部分个人思考与解答,若想知道更详细的介绍,还请阅读阮一峰大神的ES6入门 一.拓展运算符 ES6中新增了拓展运算(...)三个点,它的作 ...

  9. ElasticSearch入门 第五篇:使用C#查询文档

    网址:http://www.cnblogs.com/ljhdo/p/4550135.html 这是ElasticSearch 2.4 版本系列的第五篇: ElasticSearch入门 第一篇:Win ...

最新文章

  1. RouterOS限速更高级运用
  2. div+css中clear用法
  3. Python3 Tcp未发送/接收完数据即被RST处理办法
  4. java代码获取gc信息,如何监视Java垃圾回收
  5. 技校毕业是什么学历_技校毕业是什么学历 属于什么文凭
  6. BP神经网络做数据预测
  7. javaScript点击鼠标改变背景颜色
  8. 【简约美女win7主题】_8.4
  9. TB6612FNG 驱动学习笔记
  10. android吉他谱组件,android手机吉他谱
  11. Office EXCEL 如何保留两位小数,四舍五入
  12. 403,404,503等 HTTP状态码(HTTP Status Code)
  13. c语言单片机自动浇花系统,Arduino零基础C语言编程ch5-5.13综合示例–自动浇花系统...
  14. vmware虚拟机上网设置教程(vmware虚拟机设置网络)
  15. 康托展开与逆康托展开详解
  16. Mac下安装whistle
  17. OpenVINO使用OpenCL内存执行,避免拷贝
  18. 51nod 1718 Cos的多项式
  19. 在Hbuilder上使用GitHub
  20. DelayedOperationPurgatory之purgatory的实现

热门文章

  1. nvme分区选mbr还是guid_UEFI引导+GPT分区模式安装win10教程
  2. details和summary元素的使用
  3. Ardunio开发实例-VEML6040颜色传感器
  4. 关于“启发式”搜索的一个形象解释
  5. linux检测更新文件系统,fsck-Linux文件系统检查工具介绍
  6. bower安装好了angular 1.6.6,但是还是不能使用angular
  7. 下面不属于c语言的数据类型是,下面不属于C++语言的基本数据类型的是()。...
  8. 《公司金融》笔记整理
  9. redis和mysql的衔接操作(redis加速mysql)
  10. cmd命令删除文件夹或文件