JavaScript编程精解(一)

一、值、类型和运算符

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

原文发布于微信公众号 - 硬核项目经理(fullstackpm)

原文发表时间:2017-01-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券