xufei / febook

公益活动,前端读书资助计划
47 stars 1 forks source link

JavaScript语言精粹 - 笔记 => Drake Leung #4

Open lyyourc opened 10 years ago

lyyourc commented 10 years ago

Thanks XuFei. Give me five~

lyyourc commented 10 years ago

JavaScript语言精粹

目录 => 序 => awful & bad parts => good parts

为什么我要从awful parts看起呢,因为我个人是比较喜欢JS的,可能是接触的language不多吧,未能了解到其他language的good parts。所以,我就想想看看究竟有多awful。然后再来慢慢欣赏good parts.


首先,通过内容简介和目录,我了解到了,这本书主要是从几个方面来讲述JS的good parts,以及awful & bad parts。


然后,我看了译者序。讲得很好。

  1. 认识了好多new words,例如Qcon, CoffeeScript,还有许多大牛,老道,小马,秦歌。
  2. 对这本书的看法: 究竟书上所写的是不是真的是JavaScript的good parts以及最佳实践,每个人的opinion都是不同的,我们所需要做的是,实践,测试。

lyyourc commented 10 years ago

附录A awful parts

  1. 对global variables的依赖 why? 当程序较大的时候,global variables就会变得很难管理。为什么?当变量名称相同的时候,就会发生冲突啊。 solution: ???
  2. 没有block scope why? 这就需要我们在每个函数的开头全部声明所要用到的变量。本来我们所要的在哪里用到variable,就在哪里开始declare variable才对的,这样的话,我们更能容易control。 solution: ???
  3. 自动插入分号 why? 它会不合时宜地插入semicolon,例如return后面的expression的开头部分没有跟return在同一行上 solution: 对于semicolon的纷争,我不想参加。我觉得,这是一个个人问题。
  4. 其他不想陈述,因为我现在没需求。

附录B bad parts

  1. 最糟糕的特性其实像带刺的rose,他们是useful,但同时也是degerous。
  2. 不要用==,用=== why? 因为==会尝试转换类型啊,转换的regular比较复杂难记。
  3. 其实,我们可以参考一下附录C - JSLint 的一些regulars,那就是对bad parts的一些solutions。

附录C JSLint

  1. Required Blocks 必须的代码块 what? 在if 和 for 后面, 都由一对{}围起来。 why? 不容易出错,经验表明比较可靠。
  2. 换行 what? 不允许在identifier, string, number, 以及一些后置operator(例如++,),] )后面换行,但可以在其他一些operator后换行,像 + 。
  3. constructor 如果函数在用作contructor的时候,首字母必须uppercase。 why? 这就可以分清楚函数到底是用作普通的function还是constructor。

还有更多讨论JS的bad parts: http://javascript.crockford.com/code.html http://bonsaiden.github.io/JavaScript-Garden/ http://www.ruanyifeng.com/blog/2012/04/javascript_programming_style.html

lyyourc commented 10 years ago

第3章 对象

  1. Literal(字面量), 花括号括起来的"名/值“对,话说以前我不理解这个什么意思。literal是JSON的inspiration's source。
  2. Object是通过引用来传递的,而不是pure copy。

    var a = { }, b = { };    // a和b引用的都是不同的object
    var c = a;  // a和c引用的是the same boject
  3. Prototype。每个function创建的时候,都有一个prototype的属性,指向他的prototype object。
  4. 可以通过object来做一个container,然后减少global variable的pollution。
lyyourc commented 10 years ago

第4章 - 函数

  1. 函数可以像其他任何类型的被使用。 也就是说,函数可以保存在变量里,对象里,数组里。可以作为参数,可以被return。
  2. 关于this。之前一直没搞懂this。现在看来,在not strict mode下, this的值depends on调用模式 2.1 方法调用: this的值等于该方法所在的对象。 2.2 函数调用: window 2.3 constructor调用:新建的那个object 2.4 apply等调用:this为apply的第一个parameter

  1. 接下来,说说closure。 闭包是一个函数(不一定为anonymous function),一个可以调用另一个函数参数和变量的函数。其实,搞懂了scope,闭包是很好理解的。

当闭包的外部函数调用结束后,他的scope就没了。然后闭包被调用,但是此时的闭包仍然可以使用其外部函数的parameters or variables。因为,闭包的scope里还保存着外部函数的变量对象,至到闭包调用结束,或者被assigned null。

我之前一直都不明白<JavaScript高级程序设计>中关于闭包和变量的那个example。现在终于知道原因了,是因为我没彻底地弄懂代码execute的详细process,之前只是含糊地一笔带过。更可恶的是,那个demo在循环中创建了function,这引起了一定的混淆。 inspiration: http://www.zhihu.com/question/20479109 http://www.zhihu.com/question/20019257 本书的closure部分。


  1. callbacks(回调) callbacks是函数,它是作为另外一个function的其中一个parameter。大多数情况下,当某个event happen的时候,callbacks会被调用。另外,node.js的工作方式就是基于事件驱动的callback。
  2. 认识了4个new words。 module模块,cascade级联,curry柯里化,memoization记忆。
lyyourc commented 10 years ago

第6章 - Array数组

  1. 先给出一个array literal
var colors = [ ];  

我们很容易知道,数组的length可以是空的,但是我们可以自由地操控他。

  1. 怎样操控了,我们可以用许多method。例如,splice。
  2. [ ]里可以放任何类型的data,例如object, array, primitive type。为什么呢?数组的本质就是对象。
  3. 既然array是对象,那么它一定有methods吧,并且,他和普通的object有什么difference呢? array和普通的object的不同之处在于,array的method都是继承于Array的,所以有很多useful的methods,后者则是Object;并且,前者有一个property: method。
  4. 既然他们那么相似,很容易confused啊,我们该怎么恰当地choose and use it。当属性名是小而连续的integer的时候,我们就应该使用array。
  5. Finally, don't forget to initialize when creating an array。
lyyourc commented 10 years ago

第9章 - 代码风格

由于我一开始看的书就是: 和<高级JavaScript程序设计>,因此代码风格方面的问题不大,养成了一个良好的habit。这也是为什么一开始就要看好书的reason之一吧。

  1. 缩进。我个人比较喜欢2个空格。因此我把vim的tab设置为2个space。我觉得4个空格的话,代码整体看起来有点松散。当然,这是个人的审美角度啦。
  2. spacebar空格。function和他后面的()没有空格。但是,for, switch, if这些后面我喜欢用空格。这样代码看起来没有太紧凑。另外,运算操作符大多时候都要space。
  3. {}的位置。我之前是很喜欢把{放在next line的,但是书上是K&R style,即是把{把在一行的结尾。后面渐渐喜欢上了,并且可以防止return自动添加分号的error。现在我已经很讨厌我之前那样了。
  4. {}的使用。if, for后面都要用大括号啦,个人是觉得没那么容易出错,而且看起来有结构性。
  5. 变量的declaration。在function的开始,就该定义好所有的variables and function吧,因为这样不会出现hoisting。
  6. 使用global variable。因此当程序规模变大的时候,是很难maintain。
  7. 多用行注释吧, 这看情况吧。
lyyourc commented 10 years ago

第8章 - 方法

  1. push(item) & pop(): 这样可以使数组表现得像stack一样,last in first out。
  2. push(item) & shift(): 使数组表现得像队列一样,first in first out。
  3. reverse(): 顾名思义,就是把数组reverse,:-)
  4. sort(comparefn): sort method可以接受一个compare function。如果是升序的话,compare是这样写的。降序的话,把1和-1exchange。
function compare(value1, value2) {
  if (value1 > value2) {
    return 1;
  } else if {
    return -1;
  } else {
    return 0;
  }
}
  1. splice(start, deleteCount, item): 这恐怕是最强大的数组方法了。可以delete, insert, and replace。他return的是一个array, 里面contains the delete items。
  2. slice(start, end): skin copy the current array.
yeshiqing commented 7 years ago

Literal(字面量), 花括号括起来的"名/值“对 helps me since I hadn't know literal block in mustache.js instruction until I saw your note!~