《苹果DNA》

一个人也许有全世界最棒的想法——非常新奇、与众不同,但如果他无法说服其他人认同这个想法,一切都是白费。
——摘自《苹果DNA》

逆势之下,真正的王道是创造出伟大的产品。
——摘自《苹果DNA》

大道至简。
——摘自《苹果DNA》

没有平庸的员工,只有平庸的管理者。
——摘自《苹果DNA》

细节成就完美。
——摘自《苹果DNA》

成功的演说:编织故事、设计情节;精悍的标题;灵活运用手势等肢体语言;制造一个满场惊叹的时刻;设计一个英雄和一个反派;用视觉思考;与合作伙伴分享舞台;兜售梦想而非产品。
——摘自《苹果DNA》

兜售梦想,而非产品。
——摘自《苹果DNA》

时间有限,我们不应该为别人而活。活着是为改变世界。
——摘自《苹果DNA》

凡是最美妙的想法都是来自追逐成功的激情。人生短暂,不要为了别人眼中的标准而活。
——摘自《苹果DNA》

组建一个团队并不难,难的是如何把团队成员凝聚在一起,并让他们为了一个共同目标而努力奋斗。即使又在与众不同的做法,再创意十足的团队,对于领导者而言,最核心的还是你是否有清晰而远大的目标。
——摘自《苹果DNA》

《你不知道的JavaScript(上卷)》(Scope & Closures & This & Object Prototypes)

第一部分Scope
第一章 作用域是什么
作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用LHS查询;如果目的是获取变量的值,就会使用RHS查询。赋值操作符会导致LHS查询。“=”操作符或调用函数是传入参数的操作都会导致关联作用域的赋值操作。
不成功的RHS引用会导致抛出ReferenceError异常。不成功的LHS引用会导致自动隐式地创建一个全局变量(非严格模式),该变量使用LHS引用的目标作为标识符,或者抛出ReferenceError异常(严格模式)。
第二章 词法作用域
词法作用域意味着作用域是由书写代码时函数声明的位置来决定的。编译的词法分析阶段基本能够知道全部标识符在哪里以及是如何声明的,从而能够预测在执行过程中如何对他们进行查找。
JavaScript中有两个机制可以“欺骗”词法作用域:eval和with。前者可以对一段包含一段或多段声明的“代码”字符串进行演算,并借此在运行时修改已经存在的词法作用域。后者本质上通过将一个对象的引用当做作用域来处理,将对象的属性当做作用域的标识符来处理,从而在运行时创建一个新的词法作用域。
这两个机制的副作用是引擎无法在编译时对作用域查找进行优化。
第三章 函数作用域和块作用域
IIFE(Immediately Invoked Function Expression)
函数是JavaScript中最常见的作用域单元。本质上,声明在一个函数内部的变量或函数会在所处的作用域中“隐藏”起来,这是有意为之的良好软件的设计原则。
第四章 提升
我们习惯将var a=2;看做一个声明,而实际上JavaScript引擎并不这样认为,它将var a和a=2当做两个单独的声明,第一个是编译阶段的任务,第二个是执行阶段的任务。
第五章 作用域闭包
一个非常重要但又难以掌握,近乎神话的概念:闭包。
对于那些有一点JavaScript使用经验但从未真正理解闭包概念的人来说,理解闭包可以看做是某种意义上的重生。
闭包:当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
闭包就好像从JavaScript中分离出来的一个充满神秘色彩的未开化的世界,只有最勇敢的人才能够到达那里。但实际上它只是一个标准,显然就是关于如何在函数作为值按需传递的词法环境中书写代码的。
附录
try/catch实现块作用域
{try{throw undefined;}catch(a){console.log(a);}}
IIFE和try/catch并不是完全等价的,因为如果将一段代码的任意部分拿出来用函数进行包裹,会改变这段代码的含义,其中的this、return、break和continue都会发生变化。IIFE并不是一个普适的解决方案。

第二部分this
第一章 关于this
任何足够先进的技术都和魔法无异。————Arthur C.Clarke
在一个函数内部可以通过自己的函数名引用自身。argument.callee是一种传统的但是现在已经被弃用和批判的用法。
this不是指向函数本身,this不是指向函数的作用域。this是在运行时绑定的,并不是在编写时绑定的。this的上下文取决于函数调用时的各种条件,只取决于函数的调用方式。
第二章 this全面解析
影响this绑定的情况
不带任何修饰函数调用的默认绑定,调用者的隐式绑定,apply和call的显示绑定,bind的硬绑定,new的绑定。
上述5种绑定方法,绑定强度由弱到强。
判断一个运行中函数的this绑定,就需要找到这个函数的直接调用位置。然后按照顺序应用以下4条规则。
由new调用,绑定到新创建的对象。
由call,apply,bind调用,绑定到指定对象。
由上下文对象调用,绑定到那个上下文对象。
默认:严格模式下绑定到undefined,否则绑定到全局对象。
第三章 对象
JavaScript中的对象有字面形式var a = {};和构造形式var a = new Object();
属性描述符
value属性的值
writable属性的值是否可写
enumerable属性是否可枚举(出现在for-in循环)
configurable属性是否可配置(修改描述符)
Object.preventExtensions(obj)禁止添加新属性
Object.seal(obj)禁止添加新属性,也不能配置现有属性。= preventExtensions()+configurable:false
Object.freeze(obj)禁止任意修改 = seal() + writable:false
当你给一个属性定义getter或setter是,这个属性变成访问描述符。对于访问描述符,JavaScript会忽略他们的value和writable特性,取而代之的是关心set和get特性。
第四章 混合对象”类”
类是一种设计模式。许多语言提供了对于面向类软件设计的原生语法。JavaScript也有类似的语法,但是和其他语言中的类完全不同。
类意味着复制。
传统的类被实例化时,它的行为会被复制到实例中。类被继承时,行为也会复制到子类中。
多态(在继承链的不同层次名称相同但功能不同的函数)看起来似乎是从子类引用父类,但本质上引用的其实是复制的结果。
JavaScript并不会像类那样自动创建对象的副本。
第五章 原型
当你试图引用对象的属性时会触发[[Get]]操作,然后沿着原型链搜索。
Object.create = function(o){
function F(){};F.prototype = o; return new F();
}
使用new调用函数时会把新对象的.prototype属性关联到“其他对象”。带new的函数调用通常被成为“构造函数调用”尽管他们实际上和传统面相类语言中的类构造函数不一样。虽然这些JavaScript机制和传统面相类语言中的“类初始化”和“类继承”很相似,但是JavaScript中的机智有一个核心区别,那就是不会进行复制,对象之间是通过内部的[[prototype]]链关联的。
第六章 行为委托
在软件架构中你可以选择是否使用类和继承设计模式。大多数开发者理所当然的认为类是唯一的代码组织方式,但在JavaScript中更强大的设计模式,行为委托。
行为委托认为对象之间是兄弟关系,互相委托,而不是父类和子类的关系。JavaScript的[[prototype]]机制本质上就是行为委托机制。
对象关联是一种编码风格,它倡导的是直接创建和关联对象,不把它们抽象成类。对象关联可以用基于[[prototype]]的行为委托非常自然地实现。

《极客》

这本书的作者很扭曲,几乎每隔一页都会引用一句不知名的晦涩的中国古典诗句、或国外诗歌,让读者在硅谷的新时代科技浪潮巅峰突然感受到悠久渊源的文化,这是一种什么感觉啊。“毫无违和感”。

看硅谷的商业纷争,就像七雄争霸,各个公司纵横捭阖,驰骋商场,商场如战场,没有硝烟的战争,一个又一个公司崛起,辉煌,落寞,消失,只有少数的胜者,站立到最后,也笑到最后。

微软恰似如今腾讯,不断在其他相关领域模仿先驱者,然后占据市场,排挤掉一个又一个对手。为什么他们能够成功,不会因业务不熟练而垮掉。我思考了一下,想明白了,他们是基础,微软操作系统是应用程序的基础,腾讯QQ是社交通讯的基础,这种基础能够聚拢大量的用户,让用户离不开这种基础,然后用户就可以任由他们摆布了。

微软有天下无敌的三绝招,那就是:打不过你就模仿你;在打不过就和你比流血,看谁流的久;最后如果还不行的话,那就挖光你的人。

市场终将打败技术。

施乐造梦厂。

只有一种成功——能以你自己的生活方式度过你的一生。——《极客》

一个人生命中最大的幸运,莫过于在他人生途中,即年富力强时发现自己生活的使命。——斯蒂芬·茨威格

《大设计》

我们看到的直线运动,能够做出方程,并预言其运动;金鱼在圆形鱼缸里也能做出曲线方程,并预言其运动。二者都是正确的。

蚂蚁在曲面上爬行,能根据路程确定自己不是在二维空间,那我们也能通过测量确定所处的四维空间。

所谓波粒二象性,只不过是我们无法想象出的一个模型。

我们习惯于三维空间,是因为其他维度太小了,就像在远处看一根吸管,看似是一条线,实际是它直径太小了。

我们人类只不过是自然的基本粒子的聚集。

任何的复杂,都是有意志和思想的。

“生命游戏”“费恩曼图”

《大连接:社会网络是如何形成的以及对人类现实行为的影响》(Connected:The Surprising Power of Our Social Networks and How They Shape Our Lives)

三度影响力

电路网络,神经网络,基因网络,五花八门的网络,但我们的网络更有意思:更复杂也更重要。一个由人组成的网络有着不同寻常的生命。

我们的相互连接关系不仅是生命中与生俱来、必不可少的一个组成部分,更是一种永恒的力量。正像大脑能够做单个神经元所不能做的事情一样,社会网络能够做的事情,仅靠一个人是无法完成的。

我们可以创建连接关系网络示意图。我们可以从社交网站的大量数据中导出表现联系的数据,然后建立三维示意图,顶点代表个体,连线代表联系。具体呢。连线长短表现联系紧密程度,顶点颜色表现性别或是活跃度或是其他,处于中心位置的顶点肯定是连线多的。我们可以从这种示意图中获得太多太多的有关社会网络的信息,比如显示一则被转发信息的流动,划分不同群体范围,用于研究网络传播、人际关系、各种理论。但是怎么生成呢。通过数据库,矩阵?搜索引擎的算法?三维图表现的完全吗,会不会太杂乱了,为什么要用三维图呢,二维图肯定是表现不出来这种复杂的联系的,那么四维图、十二维图呢,应该基于社会网络的连接属性吧,那么真正社会网络的连接是几维的呢,用三维图是因为我们能表现出来的最复杂的只有三维吧。大数据怎么处理呢,如果一个人关注一百多个人,用一百多条线吗

蛋糕的味道,是面粉与鸡蛋都没有的,也不是介于面粉与鸡蛋的味道。它的味道远不止这些。蛋糕的味道,超出了所有原料味道的简单相加。

三度影响力原则Three Degrees of Influence Rule
我们所做或所说的任何事情,都会在网络上泛起涟漪,影响我们的朋友(一度),我们朋友的朋友(二度),甚至我们朋友的朋友的朋友(三度)。如果超出三度分隔,我们的影响就会逐渐消失。相距三度之内的人之间是强连接关系,强连接可以引发行为。

“我们镶嵌在社会网络上”,我们之所以希望形成连接关系,最根本的原因是我们的基因在起作用。连接行为本身就是自然选择的结果。我们必须与他人合作,判断他们的意图,影响他们或者被他们影响。自利并不总是有利可图的,与那些只关心自己的人相比,乐意帮助他人的人,生存下来的可能性更大。
想象一下原始人,只有懂得合作才能生存下来,通过自然选择,淘汰了那些自利的人。于是,现在我们进化到将这一理念融入基因,与生俱来的合作的思想。

《JavaScript专家编程》(Expert JavaScript)

第一章 对象和原型
new运算符是一种JavaScript试图让自己类似于Java的退化结构。很多人都会对new运算符感到很疑惑,因为它强加了一种伪类动词到JavaScript中,但JavaScript并不是一种正规的基于类继承方法的语言。
ECMAScript 5 引入的Object.create方法。
Object.create()和字面量对象应该替换new Object()这种方法。
面向对象
抽象:把真实世界的对象或过程转化为可计算的模型。
封装:隐藏实现、提升模块化以及保护对象内部的状态。
多态:在特定上下文,对象表现不同。
继承:定义对象间语义化的层级。

当对象检视属性时,它会查询原型链的每一环,直到返回所需的值或者undefined。
当一个原型链的对象设置一个原型链上已经存在的属性时,原型的属性不会改变;取而代之的是,属性会被定义到但前对象上,不能访问远端的原型链。
第二章 函数
函数有两种形式:函数声明和函数表达式。语法解析时,JavaScript会把所有函数声明移到当前作用域的顶端,忽略赋值表达式。
这就是function foo(){}和var bar = function foo(){}产生不同表现的原因。第二个foo()是赋值变量的一部分,拥有自己的作用域。
在JavaScript中,for循环中的x可以被访问到,控制流语句是封闭作用域的一部分。对很多习惯了块级作用域的开发者来说这很不符合直觉。
IIFE有很多方式来写
;!fuction(){}()
运用一个一元表达式,分号是为了防御式编程,防止其他模块没有以分号结尾。
JavaScript是函数级作用域,这跟许多采用块级作用域的语言有所不同。
函数的参数对象仅仅像一个数组。
第三章 闭包
闭包就是将所有自由变量和函数绑定在一个封闭的表达式中,这个表达式可以保留在自由变量和函数创建之外的词法作用域。
闭包的最基本形式就是在一个函数内部返回另一个函数,这样就产生了一个在需要的时候返回封闭作用域的机制。
第四章 术语和俚语
编程术语是通过使用语言的高度特异性的技术规则而形成的代码压缩。像其他形式的术语一样,这种编程的形式用于在社区的成员之间高效地表达复杂的想法。
强转:
转换为String。首先调用toString()。如果不返回基础类型的值,调用valueOf()。如果也不反悔基础类型的值,抛出TypeError异常。
转换为数字。一元运算符的职责是将运算符后的操作数转换为数字。先调用valueOf(), 后调用toString()
第五章 异步生活
JavaScript的单线程意味着每个运行时进程只有一个事件循环。JavaScript的事件循环主要受到两个概念的影响,运行至完成(run-to-completion)和非阻塞输入/输出(I/O).
堆(Heap)。堆是内存中顺序无关的容器。堆是JavaScript存放正在使用或者未被垃圾回收清理的变量和对象的地方。
桢(Frame)。桢是事件循环周期中需要被执行的连续工作单元。桢包含把函数对象和堆中的变量连接在一起的执行上下文。
栈(Stack)。事件循环栈包含了执行一个消息所需的所有连续的桢。事件循环自顶向下处理桢。桢根据彼此的依赖关系链被添加到栈中。有依赖的桢把它们所依赖的桢添加到上面。这个过程确保了依赖关系在被代码引用前得到满足。
队列(Queue)。队列是等待处理的消息的列表。每个消息都引用一个JavaScript函数。当栈为空时,队列中最旧的消息作为底部桢被添加到栈中。
JavaScript是单线程的语言,这意味着并发往往是由其他方式伪装的。JavaScript的事件循环被设计成非阻塞的I/O操作。JavaScript中的回调是把一个函数对象作为参数传递给另一个函数,并在返回值中使用的行为。
第六章 JavaScript的IRL
第七章 风格
第八章 工作流
第九章 代码质量
第十章 提高可测试性

《JavaScript面向对象精要》(The principles of object-oriented javascript)

第一章 原始类型和引用类型
JavaScript中没有类,有类型。每个变量或者数据都有一个对应的原始类型或者引用类型

5种原始类型保存在变量对象中:string,number,boolean,null,undefined
除了null都可以用typeof来鉴别。typeof null =Object,null必须和null进行比较才能鉴别。
引用类型是JavaScript中最接近类的东西,对象就引用类型的实例。可以用new操作符或字面形式创建新对象。函数也是对象,可以用typeof鉴别。
在引用类型中,JavaScript提供内建类型:Array、Date、Error、Function、Object、RegExp
3种封装类型:String、Number、Boolean
当你对原始类型进行调用封装类型的方法时,JavaScript创建封装类型的临时实例,在临时实例上调用方法,但会在语句结束后销毁实例。

第二章 函数
函数是对象。函数有独有一个[[call]]内部属性,这也是typeof判断为function的依据。
函数声明与函数表达式唯一的区别,声明会被JavaScript提升至上下文。
函数是对象,所以它能当做参数传递。
可以给函数传递任意数量的参数,全部保存在arguments属性中,类似数组,并不是数组的实例。函数的length属性表示定义时期望的参数个数。
根据传入的参数调用相同函数名的不同方法,叫做重载。JavaScript只能通过手动判断arguments对象模仿重载.
JavaScript所有的函数作用域内都有一个this对象代表调用该函数的对象。
函数是对象,对象有方法,函数也有,函数有3种方法改变this
call(指定的this值,参数)执行
apply(指定的this值,[参数])执行
bind(指定的this值,永久绑定的参数)创建新函数

第三章 理解对象
2种创建对象的方式:{}和new Object()
对象的属性可以增加修改删除,属性和值就像哈希表的键值对。
for-in会遍历所以设置为可枚举的属性,包括原形属性。Object.keys()返回自由属性的数组。
属性有2种类型:数据属性和访问器属性。
两种类型都有[[Enumerable]]和[[Configurable]]特征
数据属性还具有[[Writable]]和[[Value]]特征
访问器属性则具有[[Get]]和[[Set]]特征
禁止修改对象
1.禁止扩展。无法添加新属性。Object.preventExtensions(对象)
2.封印。无法添加,无法删除,无法改变属性的类型。只能读写。Object.seal(对象)
3.冻结。无法添加,无法删除,无法改变属性的类型,无法写入。只读,相当于对象某个时间点上的快照。Object.freeze()

第四章 构造函数和原型对象
构造函数就是用new操作符调用的普通函数。
可以把原型对象看作是对象的基类。所有创建的对象实例共享该原型对象。
一个对象实例通过内部属性[[Prototype]]跟踪其原型对象。原型对象的[[constructor]]属性指向该函数。

第五章 继承
Object.create(被设置为prototype的对象,属性描述)
当你定义一个函数时
function YourConstructor(){}
JavaScript引擎会做以下事情
YourConstructor.prototype=Object.create(Object.prototype,{
constructor:{
configurable:true,
enumerable:true,
value:YourConstructor,
writable:true
}
});
访问父类方法,需要通过call()或apply()调用父类的原型对象的方法时传入子类的对象。

第六章 对象模式
IIFE(立即函数表达)定义后立即调用并产生结果的函数表达,执行后立即被销毁。

《JavaScript函数式编程》(Functional JavaScript)

第一章 JavaScript函数式编程简介
确定抽象,并为其构建函数。
利用已有的函数来构建更为复杂的抽象。
通过将现有的函数传给其他的函数来构建更加复杂的抽象。
这就是函数式编程。
第二章 一等函数与Applicative编程
在Java程序中的每个实例是以类作为它的模板生成的,而JavaScript却是利用现有的对象作为原型来生成特定的实例。
第三章 变量的作用域和闭包
在JavaScript中任何没有用var关键字声明的变量都是全局变量。
第四章 高阶函数
函数作为参数。
函数作为返回结果。
第五章 由函数构建函数

第六章 递归
递归解决方案包括使用对一个普通问题子集的单一抽象的应用。
递归可以隐藏可变状态。
递归是一种实现懒惰和无限大结构的方法。
第七章 纯度、不变性和更改政策
不可变数据在JavaScript中是不现实的,因为变量可变是默认的。然而,通过观察程序中的变化模式,你可以得到尽可能接近的不可变性。
第八章 基于流的编程
总之,方法链是让对象的方法返回一个一般的this引用,以便一般方法可以在序列中调用。
第九章 无类编程

《高性能JavaScript》(High Performance JavaScript)

虽然很薄的一本书,涵盖JavaScript这门语言的精髓。不适合初学者看。
1.作用域scope chain
函数创建时,它的作用域链中填入一个单独的可变对象,这个全局对象表示所有全局范围定义的变量,如window,navigator,document等
函数执行时,会创建一个运行期上下文execution context的内部对象。当函数值执行完毕,就会被销毁。所以每次执行都是独一无二的,多吃调用就会创建多个。
每个运行期上下文都有自己的作用域链,一个被称作活动对象activation object的新对象,包含所有局部变量,明明参数,参数集合以及this。然后此对象被推入作用链的前端。
在没有优化JavaScript引擎的浏览器中多用局部变量,少用全局变量。
with语句可以改变作用域链。一个新的可变对象被创建,包含参数指定的对象的所有属性。这个对象被推入作用域链的头部。
try-catch语句中的catch执行过程中会把异常对象推入一个可变对象并置于作用域的头部。
对象可以有两种成员类型:实例成员(own成员)和原型成员。实例成员存在于对象实例中,原型成员则由对象原型继承而来。
对象的原型决定了实例的类型。默认情况下,所有对象都是object的实例,并继承了所有基本方法。
可以定义并使用构造器来创建另一种类型的原型。延长原型链。
缓存对象成员值。局部变量替代属性以避免多次查找带来的性能开销。
2.dom编程
浏览器中通常会把DOM和JavaScript独立实现。DOM是一个语言无关的,用于操作XML和HTML文档的应用程序接口(API)
性能上,两个相互独立的功能只要通过接口彼此连接,就会产生消耗。

算法和流程控制
代码的整体结构是影响运行速度的主要因素之一。代码数量少一定运行速度快,代码数量多却也不意味着运行速度一定慢。影响性能的最直接因素是代码的组织结构,以及计提问题的解决方法。
在JavaScript提供的4种循环类型中,只有for-in循环比其他几种明显要慢。提示:不要使用for-in来遍历数组成员。

条件语句
优化if-else:最小化到达正确分支前所需判断的条件数量。把if-else组织成一系列嵌套的if-else语句。

字符串链接,推荐使用简单的+和+=操作符。
回溯既是正则表达式匹配功能的基本组成部分,也是正则表达式的低效之源。

JavaScript和用户界面更新在同一个进程中运行,因此一次只能处理一件事情。

高性能的Ajax包括以下方面:了解你项目的具体需求,选择正确的数据格式和与之匹配的传输技术。

通过避免使用eval()和Function()构造器来避免双重求值带来的性能消耗。同样,给setTimeout()和setInterval()传递函数而不是字符串作为参数。

尽量使用直接量创建对象和数组。直接量的创建和初始化都比非直接量形式要快。

《RESTful Web Services》

【前言】
用作构建web服务的协议与标准有很多,他们大多是构筑在http之上的。这些标准被统称为WS-*标准栈。它们包括WS-Notification、WS-Security、WSDL及SOAP等。在本书中,我们用”大Web服务(Big Web Services)”来称呼这些技术,以较为礼貌的表达我们对它的鄙视。

REST式架构意味着,方法信息(method information)都在HTTP方法(HTTP method)里;面向资源的架构(ROA)意味着,作用与信息(scoping information)都在URI里——二者结合起来是很强大的。

一个REST式面向资源的服务为客户端可能的操作的每一则数据暴露一个URI;一个REST-RPC混合服务,为客户端可能进行的每一个操作暴露一个URI(比如获取数据用一个URI,删除数据用另一个URI);一个RPC式服务,为每个处理远程调用的进程暴露一个URI,一般来说这样的URI只有一个,即服务的端点(endpoint)。

ROA(Resource-Oriented Architecture)的特性:可寻址性(addressablity)、无状态性(statelessness)、连通性(connectedness)和统一接口(uniform interface)。

任何事物,只要具有被引用的必要,它就是一个资源(resource)。

Hypermedia as the engine of application state。这条公理的意思是:HTTP”会话”的当前状态不是作为资源状态(resource state)保存在服务器上的,而是被客户端作为应用状态(application state)来跟踪的。客户端应用状态在服务器提供的”超媒体(hypermedia)”(即超文本表示里的链接和表单)的指引下发生变迁。

命名资源。URI设计有三条基本原则:
1.用路径变量(path variables)来表达层次结构(hierarchy):/parent/child。
2.在路径变量里加上标点符号,以消除误解:/parent/child1;child2。
3.用查询变量(query variables)来表达算法的输出,例如:/search?q=jelly&start=20。