廖雪峰JavaScript教程学习摘录
JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于HTML5的手机App,交互逻辑都是由JavaScript驱动的。简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言。
那么问题来了,为什么我们要学JavaScript?尤其是当你已经掌握了某些其他编程语言如Java、C++的情况下。
简单粗暴的回答就是:因为你没有选择。在Web世界里,只有JavaScript能跨平台、跨浏览器驱动网页,与用户交互。Flash背后的ActionScript曾经流行过一阵子,不过随着移动应用的兴起,没有人用Flash开发手机App,所以它目前已经边缘化了。相反,随着HTML5在PC和移动端越来越流行,JavaScript变得更加重要了。并且,新兴的Node.js把JavaScript引入到了服务器端,JavaScript已经变成了全能型选手。
JavaScript一度被认为是一种玩具编程语言,它有很多缺陷,所以不被大多数后端开发人员所重视。很多人认为,写JavaScript代码很简单,并且JavaScript只是为了在网页上添加一点交互和动画效果。但这是完全错误的理解。JavaScript确实很容易上手,但其精髓却不为大多数开发人员所熟知。编写高质量的JavaScript代码更是难上加难。
一个合格的开发人员应该精通JavaScript和其他编程语言。如果你已经掌握了其他编程语言,或者你还什么都不会,请立刻开始学习JavaScript,不要被Web时代所淘汰。
--------------------学习笔记--------------------
JavaScript的语法和Java语言类似,每个语句以 ; 结束
,语句块用{...}。
JavaScript不区分整数和浮点数。十六进制用0x前缀和0-9,a-f表示。字符串是以单引号'或双引号"括起来的任意文本。
由于JavaScript这个设计缺陷,不要使用 == 比较,始终坚持使用 ===
比较。
NaN === NaN; // false
isNaN(NaN); // true
1 / 3 === (1 - 2 / 3); // false
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。
JavaScript的对象是一组由键-值组成的无序
集合。
变量在JavaScript中就是用一个变量名表示,变量名是大小写英文、数字、$
和_的组合,且不能用数字开头。
要显示变量的内容,可以用console.log(x)
,打开Chrome的控制台就可以看到结果。
不用var申明的变量会被视为全局变量。启用strict模式
的方法是在JavaScript代码的第一行写上:'use strict';
由于多行字符串用 \n 写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ` 表示。
如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉。
splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素。
在编写JavaScript代码的时候,属性名尽量使用标准的变量名,这样就可以直接通过object.prop的形式访问一个属性了。
要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用 hasOwnProperty() 方法。
我们建议永远都要写上 {}。
JavaScript把 null、undefined、0、NaN 和空字符串''视为false,其他值一概视为true。
for 循环的 3 个条件都是可以省略的,如果没有退出循环的判断条件,就必须使用 break 语句退出循环,否则就是死循环。
for 循环的一个变体是 for ... in 循环,它可以把一个对象的所有属性依次循环出来。
用 do { ... } while()循环要小心,循环体会至少执行1次,而 for 和 while 循环则可能一次都不执行。
Map 是一组键值对的结构,具有极快的查找速度。初始化 Map 需要一个二维数组,或者直接初始化一个空 Map。
要创建一个 Set,需要提供一个 Array 作为输入,或者直接创建一个空 Set。
具有 iterable 类型的集合可以通过新的for ... of
循环来遍历。更好的方式是直接使用 iterable 内置的 forEach
方法,它接收一个函数,每次迭代就自动回调该函数。Array 的回调函数参数依次为element, index 和 array本身;Set 与 Array 类似,但 Set 没有索引,因此回调函数的前两个参数都是元素本身;Map 的回调函数参数依次为 value 、key 和 map 本身。
JavaScript 关键字 arguments
,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。
rest 参数只能写在最后,前面用 ... 标识。
在JavaScript 中,用 var 申明的变量实际上是有作用域的。由于 JavaScript 的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行。
JavaScript 的函数在查找变量时从自身函数定义开始,从“内”向“外”查找
。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量。
JavaScript 的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部。
实际上,JavaScript 默认有一个全局对象 window
,全局作用域的变量实际上被绑定到 window 的一个属性。JavaScript实际上只有一个全局作用域。
全局变量会绑定到 window 上,不同的 JavaScript 文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。
减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。把自己的代码全部放入唯一的名字空间中,会大大减少全局变量冲突的可能。
为了解决块级作用域,ES6 引入了新的关键字let
,用let替代var可以申明一个块级作用域的变量。
从 ES6 开始,JavaScript 引入了解构赋值
,可以同时对一组变量进行赋值。
如果需要从一个对象中取出若干属性,也可以使用解构赋值,便于快速获取对象的指定属性。
在一个方法内部,this
是一个特殊变量,它始终指向当前对象。
用 var that = this;,你就可以放心地在方法内部定义其他函数,而不是把所有语句都堆到一个方法中。
要指定函数的 this 指向哪个对象,可以用函数本身的apply
方法,它接收两个参数,第一个参数就是需要绑定的 this 变量,第二个参数是 Array ,表示函数本身的参数。
JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。