一、值、类型和运算符
A.值
1.为了能够顺利操作非常多的位数据而又不引起数据丢失,我们可以将这些位划分成表示不同信息的块,在JS中,我们将这些数据块称为值。
2.6种基本的值类型:数字(number)、字符串(string)、布尔值(boolean)、对象(object)、函数(function)和未定义类型(undefined)
B.数字
1.在JS中实际 可存储的数字范围是1900万亿,可以使用带e(指数)的科学技术法,2.998e8=2.99800000
2.使用小数时精度不高
3.JS中三个特殊的值:Infinity、-Infinity和NaN,前两个表示无穷大和负无穷大,NaN表示“非数值”
C.一元运算符
1.使用两个值的运算符称为二元运算符,而使用一个值的则称为一元运算符。减号运算符即可用作一元运算符,也可用作二元运算符
D.未定义值
1.null和undefined,用于表示无意义的值。它们各自表示其自身含义,除些之外不包含任何信息。
E.自动类型转换
1.当有些值无法显式地转换成数字(比如“five”或undefined),就会产生NaN。请检查一下是否发生了错误的类型转换。
2.||当左侧值可以被转换成true时,会直接返回左侧的值,否则会返回右侧的值。所以这个符号的这种功能可用于返回默认值。
3.&&当左侧的值可以被转换成false时,&&运算符会返回左侧值,不由返回右侧值
4.短路计算:||和&&只有必要时才会计算右侧的表达式。
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/1.html
二、程序结构
A.变量
1.变量并不包含值,而是会引用这些值:两个不同的变量可以引用相同的值。
B.环境
我们将给定时间内的变量和变量值的集合称为环境。
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/2.html
三、函数
A.词法作用域
任何外部作用域都可以访问到包含它的臂部作用域的变量。函数内部变量的可见性取决于函数在代码当中的位置。在包含了一个函数定义的代码块中,这个函数可以访问到代码块中的所有变量,即函数上层的代码块中的变量和函数内部的变量。这种控制变量可见性的方法称为词法作用域(lexical scoping)
B.调用栈
每当函数调用时,当前 的上下文信息就会被存储在栈顶。而当函数返回时,系统会删除存储在栈顶的上下文信息,并使用该信息继续执行程序
C.闭包
一个包装了一些局部变量的函数是一个闭包。
D.递归
在标准的JS实现当中,递归写法的函数执行效率比循环写法的函数慢了大约10倍。执行简单的循环操作比多次函数调用效率要高很多。若程序处理的概念非常复杂,为了确保程序简单易懂,牺牲一定效率也的确是一种明智的选择。除非程序执行速度确实太慢,否则先不要关注效率问题。
E.函数及其副作用
相比于直接产生副作用的函数,产生返回值的函数则更容易集成到新的环境当中使用
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/3.html
四、数据结构:对象和数组
A.JS中两种最为常用的访问属性的方法:使用点(.)和方括号[]。如果使用点,则点之后的部分必须 是一个合法变量名,即直接写属性名称。如果使用方括号,则JS会将方括号中表达式的返回值作为属性名称。
B.可以使用in操作符来确定对象中是否包含特定名称的属性
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/4.html
五、高阶函数
A.高阶函数
1.如果一个函数操作其他函数,即将其他函数作为参数或将函数作为返回值,那么我们可以将其称为高阶函数。
B.map函数
Map方法可以对数组中的每个元素调用函数,然后利用返回值来构建一个新的数组,实现转换数组的操作。
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/5.html
六、深入理解对象
A.方法
在调用object.method()时,对象中的一个特殊变量this会指向当前方法所属的对象
B.原型
1.当开发人员访问一个对象不包含的属性时,就会从对象原型中搜索属性,接着是原型的原型,依此类推。空对象的原型是Object.prototype。
2.许多对象会提供自己通过特殊原型来提供对象自己的默认属性。函数继承自Function.prototype,数组继承自Array.prototype等。
3.Object.getPrototypeOf函数返回的结果是对象原型。可以利用一个特定的原型来使用Object.create方法创建对象
C.构造函数
1.在JS中,调用函数之前使用new则表示调用其构造函数
2.构造函数中包含了指向新对象的变量this,除非构造函数显式地返回了另一个对象的值,否则构造函数会返回这个新创建的对象
3.通过关键字new创建的对象称之为构造函数的实例
4.构造函数其实就是函数,因此其实际原型是Function.prototype,而构造函数的prototype属性则是其所创建的实例的原型,而非构造函数自身的原型
D.覆盖继承的属性
如果原型中存在同名属性,那么在调用该属性时,就不会再调用原型中的那个属性了,转而调用我们添加到对象中的属性。但原型本身不会被修改。
E.原型污染
1.可以使用Object.defineProperty函数定义自己的不可枚举属性,该函数允许我们在创建属性时控制属性类型
2.使用对象的hasOwnProperty方法确定自身是否包含某个属性而不会搜索原型。
F.无原型对象
可以使用Object.create(null)来创建
G.多态
H.Getter与Setter
I.继承
instanceof运算符会遍历所有继承类型
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/6.html
项目实战:构建电子生态系统
https://github.com/zhangyue0503/html5js/blob/master/eloquentjs/7.html