1. 面向对象的 JavaScript

JavaScript 这个术语通常涵盖了以下 3 个部分:

  • ECMAScript
  • DOM
  • BOM

面向对象程序设计(OOP)中最常用到的概念:

  • 对象(实例)、方法、属性
  • 类:需要注意的是,JS中没有类,一切都是基于对象的
  • 封装
  • 聚合
  • 重用与继承:通常是类与类之间的关系,但 JS 中只有对象
  • 多态

2. 基本数据类型

绝大部分值在转换为布尔类型时都为 true,但以下除外:

""(空字符串), null, undefined, 0, NaN, false

3. 函数

3.2.5 URI的编码与反编码

var url = 'http://www.packtpub.com/scr ipt.php?q=this and that';
encodeURI(url);	// 反过来是 decodeURI
// "http://www.packtpub.com/scr%20ipt.php?q=this%20and%20that"
encodeURIComponent(url); // 反过来是 decodeURIComponent
// "http%3A%2F%2Fwww.packtpub.com%2Fscr%20ipt.php%3Fq%3Dthis%20and%20that"

3.2.6 eval

对于许多经验丰富的 JavaScript 程序员来说:eval is evil,因为:

  • 安全性方面,有很多不确定性
  • 性能方面比直接执行脚本要慢

3.3 变量的作用域

在 JavaScript 中,变量的定义并不是以代码块作为作用域的,而是以函数作为作用域。也就是说 if 和 for 循环这样的代码块中,在外面也是可见的。

如果我们声明一个变量时没有使用 var 语句,该变量就会被默认为全局变量。

变量提升。当 JavaScript 执行过程进入新的函数时,这个函数内被声明的所有变量都会被移动(或者说提升)到函数最开始的地方。只有函数体内声明的这些变量在该函数执 行开始时就存在,而与之相关的赋值操作并不会被提升。

3.7 练习题

parseInt(1e1) // 10
parseInt('1e1') // 1
parseFloat('1e1') // 10
parseInt('1e1', 16) // 481

tip: parseInt可以转换多种进制,但是无法识别指数。

tip2: 进制转换建议使用:num.toString(radix)

5. 原型

每个对象都会有一个构造器,而原型本身也是一个对象,这意味着它必然也有一个构造器,而这个构造器又会有自己的原型。于是这种结构可能会一直不断地持续下去,并最终取决于原型链(prototype chain)的长度,但其最后一环肯定是 Object 内建对象,因为它是最高级的父级对象。

千万要记住,__proto__只能在学习或调试的环境下使用。或者如果你的代码碰巧只需 要在符合 ES5 标准的环境中使用的话,你也可以使用 Object.getPrototypeOf()方法。

5.2 扩展内建对象

String.prototype.reverse = function() {
      return Array.prototype.reverse.apply(this.split('')).join('');
}

当我们重写某对象的 prototype 时,需要重置相 应的 constructor 属性。

正如上面所说,出于效率考虑,我们应该尽可能地将一些可重用的属性和方法添加到 原型中去。

上次更新: 6/5/2020, 3:22:23 AM