阮一峰老师JavaScript课程学习笔记

1、switch采用的是严格相等运算符

2、break和continue都具有跳转作用,break语句跳出循环,continue用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。

3、JavaScript内部所有数字都是以64位浮点数形式存储,涉及小数的运算和比较需要特别小心。 (-1)^符号位 * 1.xx...xx * 2^指数位

4、NaN是JavaScript的特殊值,表示“非数字(Not a Number)”,主要出现在将字符串解析成数字出错的场合。NaN不等于任何值,包括它本身。

5、不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量会影响到其他所有变量。

对于原始类型的数据是传值引用,也就是说都是值的拷贝。

6、with语句作用在于操作同一对象的多个属性时,提供一些书写方便。with区块没有改变作用域,它的内部依然是当前作用域。

with(object){statement;} 由于无法操作的变量是object的属性还是全局变量,不利于代码的除错和模块化。with绑定对象不明确。

而利用该特点,可以实现模版引擎。

7、典型的类似数组的对象是函数的arguments对象,以及大多数的DOM元素集,还有字符串。

8、函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时的作用域无关。

函数声明时是不带分号的,函数体内部声明的函数,作用域绑定函数体内部。

9、需要注意的是,函数的length属性与实际传入的参数个数无关,只反映函数预期传入的参数个数。

10、函数如果是原始的数据类型(数值、字符串、布尔值),传递的方式是值传递。这意味着在函数体内部修改参数值,不会影响到函数外部。

如果是复合类型的参数(数组、对象、其他函数),传递方式是传址传递。也就是说传入函数的原始值的地址,因此在函数内部修改参数,会影响到原始值。

11、闭包最大的用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保存在内存中,即闭包可以使它诞生环境一直存在。闭包使得内部

变量记住上一次调用时的运算结果。闭包的另一个用处是封装对象的私有属性和私有方法。

12、JavaScript引擎内部,eval实际上是一个引用,默认调用一个内部方法。这使得eval的使用分成两种情况,一种为直接调用,作用域为当前作用域;

除此之外的调用方法,都叫“间接调用”,此时eval的作用域的全局作用域。

13、自增和自减运算符有一个需要注意的地方,就是放在变量之后,会先返回变量操作前的值,再进行自增自减操作;放在变量之前,会先进行自增、自减操作,

再返回变量操作后的值。

14、所有构造函数都有一个prototype属性,指向一个原型对象。凡是定义在Object.prototype对象上面的属性和方法,将被所有实例对象共享。

http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html 关于原型链继承详细的解释。

15、Array方法汇总。

(a)、push、pop、shift、unshift都是属于在数组前后增加或者删除元素,所以期望改变原数组。

(b)、slice、splice、reverse、sort对数组进行切割、逆序或者排序,所以期望改变原数组。

(c)、map、reduced、filter函数式编程中作用于数组的方法,用于生成新的数组,故原数组不会发生变化。

(d)、需要循环终止时,使用for,不需要终止循环,使用forEach。

(e)、concat和jion用于多个数组的合并,故原数组保持不变。

16、JavaScript设计包装对象最大的目的,首先是使得JavaScript的“对象”涵盖所有值。其次,使得原始类型的值可以很方便地调用特定方法。

17、正则表达式:

正则表达式对象的相关方法:

Regex.test(String):正则表达式的test方法返回一个布尔值,表示当前模式是否能够匹配参数字符串。

Regex.exec(String):正则对象的exec方法,可以返回匹配结果。如果发现匹配返回一个数组,成员是每个匹配成功的字符串,否则返回null。

字符串对象的相关正则方法:

String.math(Regex):返回一个数组,成员是所有匹配的子字符串。

String.search(Regex):按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。

String.replace(Regex):按照给定的正则表达式进行替换,返回替换后的字符串。

String.split(Regex):按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。

18、JavaScript提供一种内部数据结构,用来描述一个对象的属性的行为,控制它的行为。这些成为“属性描述对象”。每个属性都有自己对应的属性描述对象,

保存该属性的一些元信息。

19、使用new命令创建实例流程:

a、创建一个空对象,作为要返回的实例对象,

b、将这个空对象的原型,指向函数对象的prototype属性

c、将这个空对象赋值给函数内部的this关键字

d、开始执行构造函数内部的代码

20、this的使用可以分为以下几个场合:1、全局环境 2、构造函数 3、对象的方法

21、函数实例的call方法,可以指定该函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。

call方法的一个应用是调用对象的原生方法。

22、apply和call第一个参数都是this所要指向的那个对象,如果设为null或undefined,则等同于指定全局对象。apply的参数为数组。

23、对象本身的属性中,有的是可以枚举的,有的是不可以枚举的。Object.getOwnPropertyNames方法返回所有键名。只获取那些

可以枚举的属性,使用Object.keys方法。

24、所有的任务可以分为两种,一种是同步任务,另一种是异步任务。

同步任务是指,在JavaScript执行进程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务是指不进入JavaScript执行进程,而是进入

“任务队列(task queue)”的任务,只有“任务队列”通知主进程,某个异步任务可以执行了,该任务(采用回调函数的形式)才会进入JavaScript进程执行。

25、DOM的最小组成单位是节点。文档的树形结构(DOM树),就是由各种不同类型的节点组成,节点的类型有7种。Document、DocumentType、Element、Attribute、Text、Comment、DocumentFragment

26、渲染引擎处理网页分为四个阶段:

1.解析代码,HTML代码解析为DOM,CSS代码解析为CSSOM;

2.对象合成,将DOM树和CSSOM树合成一个渲染树

3.布局:计算出渲染树的布局

4.绘制:将渲染树绘制到屏幕上

27、有限状态机是一种非常有用的模型,可以模拟世界上大部分事物。

1.状态总数是有限的;

2.任一时刻,只处在一种状态中

3.某种条件下,会从一种状态转变到另一种状态

28、当一个函数并非一个对象的属性时,那么它是被当成一个函数来调用的,以此模式调用函数时,this被绑定到全局对象。

29、wen跨域的实现方式:

1)同域安全策略CORS,需常规存放资源的服务器在响应报头添加Access-Control-Allow-Origin标签,从而允许指定站点

访问当前站点的资源。 -----即需服务端支持

2)H5解决方案:通过不同的页面之间进行消息通信实现。

3)websocket是H5的一种新协议,实现了服务端和浏览器之前的全双工通信,同时也允许跨域通讯。

4)JSONP,主要是利用script标签不受同源策略限制的特性,向跨域的服务器请求并返回一段JSON数据。

30、通行的JavaScript模块规范主要有两种:CommonJS和AMD,

1)定义模块:根据CommonJS规范,一个单独的文件就是一个模块。每个模块都是单独的作用域,也就是说,在该模块

内部定义的变量,无法被其它模块读取,除非定义为global对象的属性。

2)模块输出:模块只有一个出口,module.exports对象,我们需要把模块希望输出的内容放入该对象。

3)加载模块:加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象。

31、AMD和CMD的区别:

1)AMD推崇依赖前置,在定义模块时就声明其依赖的模块

2)CMD推崇就近依赖,只有在用到某个模块的时候再去require。

32、

来自为知笔记(Wiz)