【Eloquent Javascript】学习笔记

[Introduction]

# 编程是为实现现已有程序无法完成的独特或开放式的任务,否则要计算直接打开计算器就好

# 编程是构造程序的行为,而程序就是一系列精准的指令用于告知计算机要做什么

# 编程从根本上来说是乏味的,但是它提供一个极好的练习培养你的抽象思维能力

# 多数编程通过编程语言来完成,编程语言是人为构造的语言用于指示计算机

# 计算机本身只能做一些愚蠢而简单的事情, 它们如此有用的原因是它们以令人难以置信的高速做这些事情

   一个程序可以巧妙地结合大量这些简单的操作来完成非常复杂的事情

# 为了编写早期的计算机程序,必须将大量的开关阵列设置在正确的位置,或者在卡纸条上打孔并将它们输入计算机

# 编程语言的强大之处在于,它们可以为我们处理一些无趣的细节

# JavaScript是在1995年引入的一种向web页面添加程序的方法 (Netscape Navigator浏览器)

 

[Values, Types, and Operators]

# 虽然所有值(values)都是由位(bits)组成的,但每个值都类型决定了其扮演的角色,有些值是数字,有些值是文本,有些值是函数等等

# JavaScript使用固定长度的位(bits)数来存储一个数字(number)类型的值, 即64

# 用小数进行运算通常是不精确的,就像π(pi)不能精确表达的有限数量的小数位数,重要的是明白只能把小数当作近似值,而不是精确的值

# JavaScript中有三个特殊的值,它们被认为是数字,但其行为与普通数字不同:正无穷(Infinity), 负无穷(-Infinity)和NaN(not a number)

# 可以使用单引号、双引号或反引号来标记字符串(strings)

# 并不是所有的操作符(operators)都是算数符号(+, -, *, /), 有些是文字,如 typeof(4.5)  typeof("x")

# 减法操作符(-)既可以是二元操作符也可以用作一元操作符,如 - (10 -2)

# JavaScript中只有一个值不等于它本身,那就是NaN, 它应该表示一个无意义计算的结果,因此,它不等于任何其他无意义计算的结果

   console.log(NaN == NaN)
   // → false

# 操作符中,||的优先级最低,然后是&&,然后是比较操作符(>、==等),然后是其他操作符。选择这种顺序是为了在典型的表达式中(如下面的表达式),括号越少越好

     1 + 1 == 2 && 10 * 10 > 50

# 有两个特殊的值,分别为null和undefined,用于表示没有意义的值。它们是值但不包含任何信息,这两个值的差异是语言设计的意外,或者说历史遗留问题造成,可将他们看作可互换的

# 在类型自动转换的大多数情况下,JavaScript会尝试将一个值转换为另一个值的类型。但是,当null或undefined出现在操作符的任意一边时,只有当两边都是null或undefined时才会产生true

  console.log(false == 0)
  // → true

  console.log(null == undefined);
  // → true
  console.log(null == 0);
  // → false

# 逻辑运算符&&和||以一种特殊的方式处理不同类型的值。它们将左边的值转换为布尔类型,以决定要做什么,但是根据操作符和转换的结果,它们将返回原始的左值或右值, 这两个操作符的另一个重要性质是,只有在必要时才计算它们右边的部分, 这叫做短路评估, 三元运算符工作方式和这个类似,可以看作三元运算的简写版

   console.log(null || "user")                                                        console.log(null && "user")
   // → user                                                                                  // → null
   console.log("Agnes" || "user")                                                 console.log("Agnes" && "user")
   // → Agnes                                                                               //→ user

 

[Program Structure]

 产生(value)的代码片段称为表达式(expression)

# 关键字let表示这个句子将定义一个绑定(binding)

# 绑定(binding)及其在给定时间存在的值的集合称为环境(environment)。当程序启动时,这个环境不是空的。它总是包含绑定,这些绑定是语言标准的一部分,而且大多数时候,它还提供了与周围系统交互的方法。例如,在浏览器中,有与当前加载的网站交互的功能,以及读取鼠标和键盘输入的功能

循环控制流允许我们回到程序中之前所在的某个位置,并以当前程序状态重复它

[Functions]

# 函数(functions)中没有return或return没有返回任何值的时候都将会返回undefined

# 函数参数或在函数体中声明的bindings属于局部(local) bindings,每次调用函数时,都会创建这些bindings的新实例。这在函数之间提供了一些隔离—每个函数调用都在其自己的小世界(其本地环境)中运行,并且常常可以在不了解全局环境中发生的事情的情况下被理解

# let和const声明的bindings会创建作用域(scopes), 范围是它们声明时所在的(blocks),在es6之前,只有函数能生成新作用域

# 每个局部作用域还可以看到包含它的所有局部作用域,而所有作用域都可以看到全局作用域。这种bindings可见性(visibility)的方法称为词法作用域(lexical scoping)

# 创建函数可以使用

      * 声明bindings的形式,函数表达式,可选箭头(arrow)函数

      * 还可以使用函数声明(function declaration)的形式, 会定义bindings并指向该函数, 不同于普通的由上而下的控制流,它们会自动被移到其作用域的顶部然后可以被该作用域中的所有代码使用

# JavaScript对于传递给函数的参数的数量非常宽容, 如果传递太多,多余的将被忽略。如果传递的参数太少,则丢失的参数将被赋给undefined

#  A function that references bindings from local scopes around it is called a closure

[Data Structures: Objects and Arrays]

# Object和Stack等都是数据结构(Data Structures), 数字、布尔值和字符串是构成数据结构的原子

    * A Object (对象) 是属性的任意集合的数据结构

    * A Stack() 是一种数据结构,允许您将值推入其中,然后按相反的顺序再次弹出它们,以便最先删除最后添加的内容

# 数组(Array)只是一种专门用于存储事物序列的对象(是一种特殊类型的Object)

# for( of ) 不仅适用于数组,也适用于字符串和其他一些数据结构

# 类型为string、number和Boolean的值不是对象,这些值是不可变的,不能更改 ( 猜测应该是数据结构)

# 因为属性(properties)只指向它们的值,而不包含它,所以对象和数组作为包含其内容的地址(即内存中的位置)的位序列存储在计算机的内存中,如果您希望将数据保存在一个文件中,以便以后使用或通过网络将其发送到另一台计算机,则必须以某种方式将这些混乱的内存地址转换为可存储或发送的描述,我们能做的就是序列化(serialize)数据。这意味着它被转换成平面描述。一种流行的序列化格式称为JSON

[Higher-Order Functions]

# 对其他函数进行操作的函数(通过接受它们作为参数或返回它们)称为高阶函数

[The Secret Life of Objects]

# 将接口与实现分离是个好主意。它通常被称为封装(encapsulation)

# 可以将this视为以不同方式传递的额外参数。如果您想显式地传递它,您可以使用函数的call方法

# 每个函数都有自己的this绑定,其值取决于调用它的方式; 箭头函数是不同的-他们不绑定自己的this,但可以在他们周围的作用域(scope)看到这个绑定(bindings)

# 许多对象 (Objects)的原型并不是Object.prototype, 而是另外提供不同默认属性集合的对象,比如 Function的原型是Function.prototype, 但这些原型还是间接的继承了Object.prototype

 

 

 

 

 

[Drawing on canvas]
# 浏览器显示图形的方式:
  * css - 使用style定位上色甚至变形(transform)普通的DOM元素,最简单的方式
  * svg - 关注形状而不是文本的文档标记方言(ie9及以上)
       > The xmlns attribute is only required on the outermost svg element of SVG documents. It is unnecessary for inner svg elements or inside HTML  documents.
  * canvas - 封装图形的DOM元素

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章