[译]ES6入门(第一部分)

原文戳这里

[译]ES6入门(第二部分)

[译]ES6入门(第三部分)

在这篇文章中,我将介绍ES6中的一些新功能。如果您是ES6新手或学习前端框架,将会很有帮助。
我将在这篇文章中介绍的主题:

1、Let 和 Const

2、箭头函数

3、默认参数

4、for of 循环

5、展开属性

6、Maps

7、Sets

8、静态方法

9、Getters 和 Setters

Let

let类似于var但是let具有作用域。 let只能在定义的块级别中访问。

if (true) {
 let a = 40;
 console.log(a); //40
}
console.log(a); // undefined

在上面的示例中,变量'a'在If语句中定义,因此在函数外部无法访问。

另外一个例子:

let a = 50;
let b = 100;
if (true) {
 let a = 60;
 var c = 10;
 console.log(a/c); // 6
 console.log(b/c); // 10
}
console.log(c); // 10
console.log(a); // 50

Const

Const用于给变量赋值一个常量。这个值是无法改变,它是固定的。

const a = 50;
a = 60; // 出错. 你不能改变const的值
const b = "Constant variable";
b = "Assigning new value"; // 出错

思考一下另一个例子:

const LANGUAGES = ['Js', 'Ruby', 'Python', 'Go'];
LANGUAGES = "Javascript"; // 错误.
LANGUAGES.push('Java'); // 正常.
console.log(LANGUAGES); // ['Js', 'Ruby', 'Python', 'Go', 'Java']

这可能有点令人费解。

以这种方式考虑。无论何时定义const变量,Javascript都会将值的内存地址赋值给变量。在我们的示例中,变量'LANGUAGES'实际上指向了分配给数组的内存。因此,你无法在以后更改变量来指向其他内存位置。在整个程序中它只指向数组。

箭头函数

函数在ES6发生了一些变化。我的意思是语法。

// 老语法
function oldOne() {
 console.log("Hello World..!");
}
// 新语法
var newOne = () => {
 console.log("Hello World..!");
}

新语法可能会让人感到困惑,但我会尝试解释一下。

语法分为两部分。

第一部分是声明一个变量并为其分配函数(即)()。它只是说变量实际上是一个函数。

然后第二部分声明函数体。 带有花括号的箭头部分定义了函数体。

另一个带参数的例子。

let NewOneWithParameters = (a, b) => {
 console.log(a+b); // 30
}
NewOneWithParameters(10, 20);

我认为我不需要对此作出解释。 它直截了当。

默认参数

如果您熟悉Ruby,Python等其他编程语言,那么默认参数对您来说并不陌生。
默认参数是在声明函数时默认给出的参数。 但是在调用函数时可以更改它的值。

例子:

let Func = (a, b = 10) => {
 return a + b; 
}
Func(20); // 20 + 10 = 30

在上面的例子中,我们只传递一个参数。 该函数使用默认参数并执行该函数。

考虑另一个例子:

Func(20, 50); // 20 + 50 = 70

在上面的示例中,该函数采用两个参数,第二个参数替换默认参数。

再看另一个例子:

let NotWorkingFunction = (a = 10, b) => {
 return a + b;
}
NotWorkingFunction(20); // NAN. 不能正常工作.

当您使用参数调用函数时,它们将按顺序分配。 (即)第一个值分配给第一个参数,第二个值分配给第二个参数,依此类推。

在上面的例子中,值20被赋值给参数'a'而'b'没有任何值。 所以我们没有得到任何输出。

但是,

NotWorkingFunction(20, 30); // 50;

正常工作。

For of 循环

for..of非常类似于for..in,但略有修改。

for..of遍历元素列表(即),如Array,并逐个返回元素(不是它们的索引)

let arr = [2,3,4,1];
for (let value of arr) {
 console.log(value);
}
Output:
2
3
4
1

请注意,变量'value'输出数组中的每个元素而不是索引。

另外一个例子:

let string = "Javascript";
for (let char of string) {
 console.log(char);
}
Output:
J
a
v
a
s
c
r
i
p
t

是的,它也适用于字符串。

展开属性

正如其名,展开属性帮助展开表达式。 简单来说,它将元素列表转换为数组,或者将数组转换成元素列表。

没有展开属性的示例:

let SumElements = (arr) => {
 console.log(arr); // [10, 20, 40, 60, 90]
 let sum = 0;
 for (let element of arr) {
 sum += element;
 }
 console.log(sum); // 220. 
}
SumElements([10, 20, 40, 60, 90]);

以上示例很简单。 我们声明一个函数,接受数组作为参数并返回其总和。 这很简单。

现在考虑使用展开属性的相同示例

let SumElements = (...arr) => {
 console.log(arr); // [10, 20, 40, 60, 90]
 let sum = 0;
 for (let element of arr) {
 sum += element;
 }
 console.log(sum); // 220. 
}
SumElements(10, 20, 40, 60, 90); // 注意我们这里没有传入数组. 而是将元素作为参数传递。

在上面的例子中,展开属性将元素列表(即参数)转换为数组。

另外一个例子:

Math.max(10, 20, 60, 100, 50, 200); // 返回 200.

Math.max是一个简单的方法,它返回给定列表中的最大元素。 它不接受数组。

let arr = [10, 20, 60];
Math.max(arr); // 出错. 不接受数组.

所以让我们使用我们的救世主。

let arr = [10, 20, 60];
Math.max(...arr); // 60

在上面的示例中,展开属性将数组转换为元素列表。

Maps

Map包含键值对。它与数组类似,但我们可以定义自己的索引。索引在Map中是唯一的。

例子:

var NewMap = new Map();
NewMap.set('name', 'John'); 
NewMap.set('id', 2345796);
NewMap.set('interest', ['js', 'ruby', 'python']);
NewMap.get('name'); // John
NewMap.get('id'); // 2345796
NewMap.get('interest'); // ['js', 'ruby', 'python']

我认为上面的例子是自我解释的。

Map的其他有趣的功能是所有索引都是唯一的。 我们可以使用任何值作为键或值。

var map = new Map();
map.set('name', 'John');
map.set('name', 'Andy');
map.set(1, 'number one');
map.set(NaN, 'No value');
map.get('name'); // Andy. 注意John被Andy替换了.
map.get(1); // number one
map.get(NaN); // No value

Map中另外一些有用的方法:

var map = new Map();
map.set('name', 'John');
map.set('id', 10);
map.size; // 2. 返回map的大小.
map.keys(); // 返回所有的键. 
map.values(); // 返回所有的值.
for (let key of map.keys()) {
 console.log(key);
}
输出:
name
id

在上面的例子中, map.keys() 返回map的键,但是返回的是一个Iteratord对象,这意味这不能按原样展示出来,只能通过迭代展示出来。

另外一个例子:

var map = new Map();
for (let element of map) {
 console.log(element);
}
输出:
['name', 'John']
['id', 10]

上面的例子是自我解释的。 for..of循环输出键值对数组。

Sets

Sets用来保存任何类型的唯一值. 简单..!

例子:

var sets = new Set();
sets.add('a');
sets.add('b');
sets.add('a'); // 添加重复的值.
for (let element of sets) {
 console.log(element);
}
输出:
a
b

请注意,不会显示重复值,只显示了唯一值。

还要注意,Set是可迭代的对象。 我们必须遍历元素才能显示它。

其他有用的方法:

var sets = New Set([1,5,6,8,9]);
sets.size; // 返回 5. set的大小.
sets.has(1); // 返回 true. 
sets.has(10); // 返回 false.

在上面的例子中,size是不言自明的。 还有另一种方法'has',它根据给定元素是否存在于集合中返回一个布尔值。

静态方法

大多数人已经听说过静态方法。 静态方法在ES6中引入。 定义它并使用它非常容易。

例子:

class Example {
 static Callme() {
 console.log("Static method");
 }
}
Example.Callme();
输出:
Static method

请注意,我没有在类中使用关键字“function”。

我可以在不为类创建任何实例的情况下调用该函数。

Getters和Setters

Getters和Setterss是ES6中引入的有用功能之一。 如果你在JS中使用类,它会派上用场。

没有getter和setter的示例:

class People {
constructor(name) {
 this.name = name;
 }
 getName() {
 return this.name;
 }
 setName(name) {
 this.name = name;
 }
}
let person = new People("Jon Snow");
console.log(person.getName());
person.setName("Dany");
console.log(person.getName());
输出:
Jon Snow
Dany

上面的例子不言自明. 在类People中,我们有两个函数帮助我们设置和获取一个人的名字。

getters and setters的例子:

class People {
constructor(name) {
 this.name = name;
 }
 get Name() {
 return this.name;
 }
 set Name(name) {
 this.name = name;
 }
}
let person = new People("Jon Snow");
console.log(person.Name);
person.Name = "Dany";
console.log(person.Name);

在上面的示例中,您可以看到在People类中,有两个函数分别具有'get'和'set'属性, 'get'属性用于获取变量的值,'set'属性用于设置变量的值。

你可以看到调用getName函数并没有使用括号, 并且调用setName函数也没有使用括号,就像为变量赋值一样。

感谢您的时间。 希望你喜欢这篇文章。 :) :)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,640评论 2 9
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,057评论 0 13
  • 以下为本次报告使用的文本内容——来源于一则公共管理学院网站新闻的爬取结果。   第三届公共管理青年学者论坛于201...
    Sirius_Y阅读 337评论 0 0
  • 有美女名"丹","越",帅哥姓"钟","琚",言游宜春,调笑之。 丹菊满山越青亭, 钟声云影共风轻。 宜从明月山头...
    花屋主人萧寒阅读 366评论 4 1
  • 咕噜噜叮铃阅读 121评论 0 0