几天前在阅读 MDN 文档时我发现了一些我从来不知道的 JS 特性和 API。 下面是一份简短的清单, 无论有用不有用——学习 JS 的道路似乎是没有尽头的。

标签语句

在 JS 中,你可以对 for 循环和代码块起名字... 谁知道呢(显然我不知道)! 稍后你可以在for 循环中对该代码使用 break 或 continue 语句, 同时在代码块中也可以使用 break。

loop1: // labeling "loop1" 
for (let i = 0; i < 3; i++) { // "loop1"
  loop2: // labeling "loop2"
  for (let j = 0; j < 3; j++) { // "loop2"
     if (i === 1) {
        continue loop1; // continues upper "loop1"
        // break loop1; // breaks out of upper "loop1"
     }
     console.log(`i = ${i}, j = ${j}`);
  }
} /* 
* # Output
* i = 0, j = 0
* i = 0, j = 1
* i = 0, j = 2
* i = 2, j = 0
* i = 2, j = 1
* i = 2, j = 2
*/

这是一个对代码块命名的例子,在代码块中只能使用 break

foo: {
 console.log('one');
 break foo;
 console.log('this log will not be executed');
}
console.log('two'); /*
* # Output
* one
* two
*/

"void" 操作符

这之前我一直以为我掌握了所有的操作符,直到我看到了这个 从 1996 年就有.的操作符。 所有浏览器都支持也非常的好理解, 用 MDN 的话:

void 操作符执行表达式之后同时返回 undefined

这样可以写出立即执行函数的另一种形式:

void function iife() {
 console.log('hello');
}(); // is the same as... (function iife() {
   console.log('hello');
})()

对 void 的使用需要注意的是,表达式的执行结果是 空(undefined)!

const word = void function iife() {
 return 'hello';
}(); // word is "undefined" const word = (function iife() {
 return 'hello';
})(); // word is "hello"

你可以将 async 与 void 相结合, 即可作为代码中的异步入口点:

void async function() { 
   try {
       const response = await fetch('air.ghost.io'); 
       const text = await response.text();
       console.log(text);
   } catch(e) {
       console.error(e);
   }
}() // or just stick to this :) (async () => {
   try {
       const response = await fetch('air.ghost.io'); 
       const text = await response.text();
       console.log(text);
   } catch(e) {
       console.error(e);
   }
})();

逗号操作符

在阅读完逗号表达式之后, 我并没有感到我完全理解了它是如何工作的。 引用 MDN 的话:

逗号操作符执行其所有的操作数(从左到右)并返回最后一个操作数的结果。

function myFunc() {
 let x = 0;
 return (x += 1, x); // same as return ++x;
} y = false, true; // returns true in console
console.log(y); // false (left-most) z = (false, true); // returns true in console
console.log(z); // true (right-most)

· 与 条件操作符 一起使用

逗号操作符的最后一个结果总是作为条件操作符的结果。 所以你可以在这之前放入任意数量的表达式, 在下面的例子中,我在返回的布尔值之前都放了一句 console log。

const type = 'man';

const isMale = type === 'man' ? (
   console.log('Hi Man!'),
   true
) : (
   console.log('Hi Lady!'),
   false
); console.log(`isMale is "${isMale}"`);

国际化 API

在当前国际化要做好很难, 幸运的是,在大部门浏览器中都有 较好的 API 支持。 其中我所喜欢的其中一项就是日期格式化, 看下面的例子。

const date = new Date();

const options = {
 year: 'numeric', 
 month: 'long', 
 day: 'numeric'
}; const formatter1 = new Intl.DateTimeFormat('es-es', options);
console.log(formatter1.format(date)); // 22 de diciembre de 2017 const formatter2 = new Intl.DateTimeFormat('en-us', options);
console.log(formatter2.format(date)); // December 22, 2017

管道操作符

在撰写本篇文章时,此功能仅在 Firefox 58+ 使用参数开启, 然而在 Babel 中已经有一个针对此操作符提案的 插件了。 看起来非常好,我很喜欢!

const square = (n) => n * n;
const increment = (n) => n + 1; // without pipeline operator
square(increment(square(2))); // 25 // with pipeline operator
2 |> square |> increment |> square; // 25

值得注意的

· 原子性

 

原子操作带来了可预测的读写结果,特别是当数据在多个线程中共享时,下一个操作会等待其他操作完成之后才会被执行。 对于主线程和其他 WebWorker 之间保持数据同步来说非常有用。

我很喜欢其他编程语言中的原子特性,例如 Java 中。 我觉得在之后使用 WebWorker 将事务从主线程中转移出来之后会使用得更多。

· Array.prototype.reduceRight

 

我之前从未见过其使用,因为基本上他就是 Array.prototype.reduce() 和 Array.prototype.reverse() 的结合,对于它的使用应该是比较少见的,如果你需要的话,那这个还是挺合适你的!

const flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
   return a.concat(b);
}, []); // flattened array is [4, 5, 2, 3, 0, 1]

· setTimeout() 参数

 

在了解到这个功能之后节省了 .bind() 的使用,这个特性从一开始就有了。

setTimeout(alert, 1000, 'Hello world!');

/*
* # Output (alert)
* Hello World!
*/ function log(text, textTwo) {
   console.log(text, textTwo);
} setTimeout(log, 1000, 'Hello World!', 'And Mars!'); /*
* # Output
* Hello World! And Mars!
*/

这里分享一个平台给你们,如果你想拿高薪,想学 习,想突破瓶颈,想跟别人竞争能取得优势,

想学 习Java技术或者提升Java技术想往Java工程师方面 发展,担心面试不过的,可以加这个Java学习交流: 642830685

· HTMLElement.dataset

在之前我在 HTML 元素上使用自定义数据属性 data-*,但我浑然不知有 API 能够轻松的做读取。 抛开一些特殊的命名限制(看标题链接),其基本上就是横线隔开在 JS 中使用时则用驼峰规则。 所以属性 data-birth-planet 在 JS 中会变成 birthPlanet。

`<div></div>`

读取:

let personEl = document.querySelector('#person');

console.log(person.dataset) // DOMStringMap {name: "john", birthPlanet: "earth"}
console.log(personEl.dataset.name) // john
console.log(personEl.dataset.birthPlanet) // earth // you can programmatically add more too
personEl.dataset.foo = 'bar';
console.log(personEl.dataset.foo); // bar

我所不知的JS的更多相关文章

  1. 你所不知道的js的小知识点(1)

    1.js调试工具 debugger <div class="container"> <h3>debugger语句会产生一个断点,用于调试程序,并没有实际功能 ...

  2. 我不知道的js(一)作用域与闭包

    作用域与闭包 作用域 什么是作用域 作用域就是一套规则,它负责解决(1)将变量存在哪儿?(2)如何找到变量?的问题 作用域工作的前提 谁赋予了作用域的权利?--js引擎 传统编译语言编译的过程 分词/ ...

  3. 你所不知道的 JS: null , undefined, NaN, true==1=="1",false==0=="",null== undefined

    1 1 1 === 全相等(全部相等) ==  值相等(部分相等) demo: var x=0; undefined var y=false; undefined if(x===y){ console ...

  4. 我总结的js方面你可能不是特别清楚的小知识

    !!将一个值方便快速转化为布尔值 console.log( !!window===true ); 不声明第三个变量实现交换 var a=1,b=2; a=[b,b=a][0];//执行完这句代码之后 ...

  5. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  6. 学习JS的心路历程-类型

    前言 之前学JS时候都是靠着谷狗一路跌跌撞撞的学过来,从来没有去翻过MDN的文件,导致留了许多技术债给自己. 最近有幸遇到一位前辈并开始从头学JS,前辈表示学程序不看文件是想作死自己?于是我的第一份功 ...

  7. 我要成为前端工程师!给 JavaScript 新手的建议与学习资源整理

    来源于:http://blog.miniasp.com/post/2016/02/02/JavaScript-novice-advice-and-learning-resources.aspx 今年有 ...

  8. Beta版本——第五次冲刺博客

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  9. 【Python】闭包Closure

    原来这就是闭包啊... 还是上次面试,被问只不知掉js里面的闭包 闭包,没听过啊...什么是闭包 回来查了下,原来这货叫闭包啊...... —————————————————————————————— ...

随机推荐

  1. [CSP-S模拟测试]:笨小猴(随机化)

    题目传送门(内部题118) 输入格式 输入第一行是一个整数$n$,意义如以上所示. 接下来有$2n+1$行,每行为两个正整数,第$i$行的两个正整数分别代表$A_i$和$B_i$. 输出格式 如果无法 ...

  2. avue你繁琐的表格、表单、树等组件开发的解脱工具,了解一下?

    简介 Avue是基于Vue.js和element的快速开发框架 它的核心是数据驱动UI的思想,让我们从繁琐的crud开发中解脱出来,它的写法类似easyUI,但是写起来比easyui更容易,因为它是基 ...

  3. 20175215 2018-2019-2 第七周java课程学习总结

    第八章 常用实用类 8.1 String类 Java专门提供了用来处理字符序列的String类.String类在java.lang包中,由于java.lang包中的类被默认引入,因此程序可以直接使用S ...

  4. MYSQL中唯一约束和唯一索引的区别

    1.唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有null.2.创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引.唯一约束是通过唯一索引来实现数据的唯一. ...

  5. JavaScript Thread.Sleep()

    What is the JavaScript version of sleep()? Since 2009 when this question was asked, JavaScript has e ...

  6. 开源EDR(OSSEC)基础篇- 02 -部署环境与安装方式

    https://yq.aliyun.com/articles/683077?spm=a2c4e.11163080.searchblog.9.753c2ec1lRj02l

  7. 1.1 DAL数据访问层

    分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy.Memcached.集群等技术优点而构建的一个架构系统.主要目的是解决高并发 ...

  8. IDEA/Git 提交/commit 忽略 文件夹

    commit的时候.idea文件夹被默认选中了,如果忘记点掉就会被提交上去,想要默认忽略其实很简单. 找到项目根目录处的.gitignore文件(如果是用git版本控制的话) 双击打开之后  我们在最 ...

  9. 慕课网_细说多线程之Thread VS Runnable

    第1章 课前准备 1-1 前言 (00:49) 第2章 Thread VS Runnable 2-1 回顾线程创建的两种方式 (02:33) 继承Thread类 class MyThread exte ...

  10. PPT鼠绘必须掌握的PPT绘图三大核心功能

    在PPT制作教程栏目中,陆陆续续的分享了一系列通过合并形状功能来绘图的教程,绘制安卓机器人.绘制西瓜.绘制鸡蛋.其实,合并形状功能只是PPT绘图的一部分,而真正想要掌握PPT鼠绘,仅仅是会使用合并形状 ...