读深入ES6记[四]

ES6

第七章:箭头函数

1.箭头符号,悠久的历史

以下写法是不是灰常眼熟啊,但你了解为啥要这样写吗?

这是为了兼容不支持JS的浏览器(现在应该跟恐龙一样绝迹了吧!)

不支持JS的浏览器:解析为两个不支持的标签<script></script>和一段HTML注释支持JS的浏览器:识别出JS代码,被解析为单行注释的开始

<script language="javascript">
  <!--
    console.log('Hello Daniel');
  // -->
</script>

2.节省

懒人必备良品:

可省去function关键字
单语句可省去return关键字和大括号 {}
单参数可省去小括号 ()

最省情况代码示例:

[1, 2, 3].filter(num => num > 1);

非单参数代码示例:

[1, 2, 3].filter((num, idx) => idx > 1);

非单语句代码示例:

[1, 2, 3].filter(num => { console.log(num); return num > 1; });

3.注意事项

如果想简单返回对象,这个时候就不能偷懒,至少得加个小括号,不然会被解析为块代码。看下代码示例,第一和第二句都被当作块代码:

var result = [1, 2, 3].map(num => {}); // 这样相当于空代码,返回值为undefined
var result = [1, 2, 3].map(num => {key: num}); // 这样的返回值同上
var result = [1, 2, 3].map(num => ({key: num})); // 必须加个小括号

4.与function关键字声明的函数的区别

  1. 没有自己的this值。this值继承自外围作用域

  2. 没有arguments对象。这不是坏消息,因为我们有不定参数和默认值法宝

5.理解this

提到this,你确定你对它真的了解吗?反正我刚好可以趁这个机会更加深入地了解它一番(这篇文章值得一看)。

this都是在函数内才能用到,我们来列举下常见的几种场景:

  • 场景一:调用对象的方法
var deep_thought = {
  the_answer: 42,
  ask_question: function () {
    return this.the_answer;
  }
};

var the_meaning = deep_thought.ask_question(); 

当 deep_thought.ask_question()执行时,Javascript为函数建立执行上下文(execution context),将this设为函数所属的对象引用(即deep_thought)

  • 场景二:构造函数
function BigComputer(answer) {
  this.the_answer = answer;
  this.ask_question = function () {
    return this.the_answer;
  }
}

var deep_thought = new BigComputer(42);
var the_meaning = deep_thought.ask_question(); 

当用new关键字来创建构造函数的实例对象时,过程是这样的:先创建一个要返回的对象,然后将this指向它的引用,执行完函数代码后返回该对象。当执行deep_thought.ask_question(),函数里的this指向的是构造函数的实例对象

  • 场景三:普通函数
function test_this() {
  return this;
}
var i_wonder_what_this_is = test_this(); 

因为我们没明确指定函数调用的上下文,所以默认是全局对象,在浏览器端为window对象,在NodeJS为global对象

  • 场景四:事件处理

这个还要看具体的写法:

写法一:this指向全局对象,这里即window对象

<script type="text/javascript">
  function click_handler() {
    alert(this); // alerts the window object 
  }
</script>
...
<button id='thebutton' onclick='click_handler()'>Click me!</button>

写法二:this指向DOM对象,因为触发事件的时候其实是DOM.onclick()

<script type="text/javascript">
  function click_handler() {
    alert(this); // alerts the button DOM node 
  }

  function addhandler() {
    document.getElementById('thebutton').onclick = click_handler;
  }

  window.onload = addhandler;
</script>
...
<button id='thebutton'>Click me!</button>

简单总结一下:
函数内的this指向的是函数的执行者([执行者].fnName()),如果没指定执行者,则为全局对象

来个题目考考你呗,以下代码点击按钮会显示什么信息呢?

<script type="text/javascript">
  function BigComputer(answer) {
    this.the_answer = answer;
    this.ask_question = function () {
      alert(this.the_answer);
    }
  }

  function addhandler() {
    var deep_thought = new BigComputer(42);
    var the_button = document.getElementById('thebutton');

    the_button.onclick = deep_thought.ask_question;
  }

  window.onload = addhandler;
</script>

答案是:alert的内容是undefined,因为button DOM是没有the_answer这个属性滴。这是为什么呢?大声念一遍上边的总结

this除了以上的默认规则外,你也可以手动指定this指向的值,applycall以及漂亮的bind就是用来干这事

上面的例子要alert出正确的值,改用bind手动指定this的值即可

function addhandler() {
  var deep_thought = new BigComputer(42);
  var the_button = document.getElementById('thebutton');

  the_button.onclick = deep_thought.ask_question.bind(deep_thought);
}

好吧,没想到this讲了这么长的篇幅,我们马上进入第八篇吧。


第八章:Symbols

1.我是原始类型

Symbol为Javascript的第7种原始类型。

Hi,大家,我是老七,我的大哥们分别是Object,Boolean,String,Number,Null,Undefined

2.设计初衷

Symbol的设计初衷就是避免冲突,一般应用于属性键的命名上。

有没一头雾水,那例子伺候吧。
以下假设第三方库对象libA和libB都想对传入的对象进行属性值的修改,而属性的名称刚好相同,那么冲突就发生了

var libA = {
  symbolIsShowKey: Symbol('isShow'),
  stringIsShowKey: 'isShow',
  fn: function (data) {
    data[this.symbolIsShowKey] = true;
    data[this.stringIsShowKey] = true;
  }
};

var libB = {
  symbolIsShowKey: Symbol('isShow'),
  stringIsShowKey: 'isShow',
  fn: function (data) {
    if (data[this.symbolIsShowKey]) { // 没被其它库干扰掉
      console.log('Symbol.isShow is true: do something');
    }
    if (data[this.stringIsShowKey]) { // 被其它库干扰到
      console.log('String.isShow is true: do something');
    }
  }
};

var dataObj = {};
libA.fn(dataObj);
libB.fn(dataObj);

3.注意事项

symbol不能被自动转换成字符串,所以尝试将它与字符串拼接将报错,比如:

Symbol('daniel') +' some string' // 报错
Symbol('daniel').toString() + ' some string' // 显式转换则OK

4. 获取symbol的方式

  1. Symbol() 每次都返回新的唯一的symbol,无论描述是否一样
console.log(Symbol('daniel') == Symbol('daniel'));
  1. Symbol.for() 用于共享symbol,描述作为symbol注册表中的键,描述相同,则每次取出的symbol值是相同的
console.log(Symbol.for('daniel') === Symbol.for('daniel'));
  1. 使用标准定义的symbol。如Symbol.matchSymbol.iterator等(还记得《读深入ES6记[一]》中我们如何让普通对象拥有for-of来遍历数据的特性吗)

这就是第七,八章的学习情况,接下来可继续看《读深入ES6记[五]》

前面章节的学习情况请看:
《读深入ES6记[一]》
《读深入ES6记[二]》
《读深入ES6记[三]》

--EOF--

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

推荐阅读更多精彩内容

  • 一、ES6简介 ​ 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ...
    一岁一枯荣_阅读 6,069评论 8 25
  • 三,字符串扩展 3.1 Unicode表示法 ES6 做出了改进,只要将码点放入大括号,就能正确解读该字符。有了这...
    eastbaby阅读 1,532评论 0 8
  • 以下内容是我在学习和研究ES6时,对ES6的特性、重点和注意事项的提取、精练和总结,可以做为ES6特性的字典;在本...
    科研者阅读 3,125评论 2 9
  • 1.概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象...
    赵然228阅读 806评论 2 10
  • 今年有幸参加了集团公司组织的培训,从今年的3月份到今年的10月份,长达6个月,既有国内阶段的培训,也有国外阶段的培...
    北山之下阅读 1,347评论 30 64