严格模式
除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict
mode)。顾名思义,这种模式采用更加严格的 JavaScript 语法。
同样的代码,在正常模式和严格模式中,可能会有不一样的运行结果。一些在正常模式下可以运行的语句,在严格模式下将不能运行。
设计目的
早期的 JavaScript
语言有很多设计不合理的地方,但是为了兼容以前的代码,又不能改变老的语法,只能不断添加新的语法,引导程序员使用新语法。
严格模式是从 ES5 进入标准的,主要目的有以下几个。
明确禁止一些不合理、不严谨的语法,减少 JavaScript
语言的一些怪异行为。
增加更多报错的场合,消除代码运行的一些不安全之处,保证代码运行的安全。
提高编译器效率,增加运行速度。
为未来新版本的 JavaScript 语法做好铺垫。
总之,严格模式体现了 JavaScript
更合理、更安全、更严谨的发展方向。
启用方法
进入严格模式的标志,是一行字符串use strict。
1'use strict';
老版本的引擎会把它当作一行普通字符串,加以忽略。新 ...
Object 对象的相关方法
JavaScript
在Object对象上面,提供了很多相关方法,处理面向对象编程的相关操作。本章介绍这些方法。
Object.getPrototypeOf()
Object.getPrototypeOf方法返回参数对象的原型。这是获取原型对象的标准方法。
123var F = function () {};var f = new F();Object.getPrototypeOf(f) === F.prototype // true
上面代码中,实例对象f的原型是F.prototype。
下面是几种特殊对象的原型。
123456789// 空对象的原型是 Object.prototypeObject.getPrototypeOf({}) === Object.prototype // true// Object.prototype 的原型是 nullObject.getPrototypeOf(Object.prototype) === null // true// 函数的原型是 Function.prototyp ...
对象的继承
面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B
对象,就能直接拥有 B
对象的所有属性和方法。这对于代码的复用是非常有用的。
大部分面向对象的编程语言,都是通过“类”(class)实现对象的继承。传统上,JavaScript
语言的继承不通过 class,而是通过“原型对象”(prototype)实现,本章介绍
JavaScript 的原型链继承。
ES6 引入了 class 语法,基于 class 的继承不在这个教程介绍,请参阅《ES6
标准入门》一书的相关章节。
原型对象概述
构造函数的缺点
JavaScript
通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定义在构造函数内部。
123456789function Cat (name, color) { this.name = name; this.color = color;}var cat1 = new Cat('大毛', '白色');cat1.name // '大毛'cat1 ...
this 关键字
涵义
this关键字是一个非常重要的语法点。毫不夸张地说,不理解它的含义,大部分开发任务都无法完成。
前一章已经提到,this可以用在构造函数之中,表示实例对象。除此之外,this还可以用在别的场合。但不管是什么场合,this都有一个共同点:它总是返回一个对象。
简单说,this就是属性或方法“当前”所在的对象。
1this.property
上面代码中,this就代表property属性当前所在的对象。
下面是一个实际的例子。
123456789var person = { name: '张三', describe: function () { return '姓名:'+ this.name; }};person.describe()// "姓名:张三"
上面代码中,this.name表示name属性所在的那个对象。由于this.name是在describe方法中调用,而describe方法所在的当前对象是person,因此this指向person,t ...
实例对象与 new 命令
JavaScript 语言具有很强的面向对象编程能力,本章介绍 JavaScript
面向对象编程的基础知识。
对象是什么
面向对象编程(Object Oriented Programming,缩写为
OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
每一个对象都是功能中心,具有明确分工,可以完成接受信息、处理数据、发出信息等任务。对象可以复用,通过继承机制还可以定制。因此,面向对象编程具有灵活、代码可复用、高度模块化等特点,容易维护和开发,比起由一系列函数或指令组成的传统的过程式编程(procedural
programming),更适合多人合作的大型软件项目。
那么,“对象”(object)到底是什么?我们从两个层次来理解。
(1)对象是单个实物的抽象。
一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个远程服务器连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。
(2)对象是一个容器,封装了属性( ...
JSON 对象
JSON 格式
JSON 格式(JavaScript Object Notation
的缩写)是一种用于数据交换的文本格式,2001年由 Douglas Crockford
提出,目的是取代繁琐笨重的 XML 格式。
相比 XML 格式,JSON 格式有两个显著的优点:书写简单,一目了然;符合
JavaScript
原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON
迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准。
每个 JSON
对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或更多的值。
JSON 对值的类型和格式有严格的规定。
复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN,
Infinity,
-Infinity和undefined)。
字符串必须使用双引号表示,不能使用单引号。
对象的键名必须放在双引号里面。
数组或对象最后一个成员的后面,不能加逗号。
以下都是合 ...
RegExp 对象
RegExp对象提供正则表达式的功能。
概述
正则表达式(regular
expression)是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用来按照“给定模式”匹配文本。比如,正则表达式给出一个
Email 地址的模式,然后用它来确定一个字符串是否为 Email 地址。JavaScript
的正则表达式体系是参照 Perl 5 建立的。
新建正则表达式有两种方法。一种是使用字面量,以斜杠表示开始和结束。
1var regex = /xyz/;
另一种是使用RegExp构造函数。
1var regex = new RegExp('xyz');
上面两种写法是等价的,都新建了一个内容为xyz的正则表达式对象。它们的主要区别是,第一种方法在引擎编译代码时,就会新建正则表达式,第二种方法在运行时新建正则表达式,所以前者的效率较高。而且,前者比较便利和直观,所以实际应用中,基本上都采用字面量定义正则表达式。
RegExp构造函数还可以接受第二个参数,表示修饰符(详细解释见下文)。
123var regex = new RegExp ...
Date 对象
Date对象是 JavaScript
原生的时间库。它以国际标准时间(UTC)1970年1月1日00:00:00作为时间的零点,可以表示的时间范围是前后各1亿天(单位为毫秒)。
普通函数的用法
Date对象可以作为普通函数直接调用,返回一个代表当前时间的字符串。
12Date()// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
注意,即使带有参数,Date作为普通函数使用时,返回的还是当前时间。
12Date(2000, 1, 1)// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
上面代码说明,无论有没有参数,直接调用Date总是返回当前时间。
构造函数的用法
Date还可以当作构造函数使用。对它使用new命令,会返回一个Date对象的实例。如果不加参数,实例代表的就是当前时间。
1var today = new Date();
Date实例有一个独特的地方。其他对象求值的时候,都是默认调用.valueOf()方法,但是Date实例求值的时候,默 ...
Math 对象
Math是 JavaScript
的原生对象,提供各种数学功能。该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用。
静态属性
Math对象的静态属性,提供以下一些数学常数。
Math.E:常数e。
Math.LN2:2 的自然对数。
Math.LN10:10 的自然对数。
Math.LOG2E:以 2 为底的e的对数。
Math.LOG10E:以 10 为底的e的对数。
Math.PI:常数π。
Math.SQRT1_2:0.5 的平方根。
Math.SQRT2:2 的平方根。
12345678Math.E // 2.718281828459045Math.LN2 // 0.6931471805599453Math.LN10 // 2.302585092994046Math.LOG2E // 1.4426950408889634Math.LOG10E // 0.4342944819032518Math.PI // 3.141592653589793Math.SQRT1_2 // 0.7071067811865476Math.SQRT2 / ...
String 对象
概述
String对象是 JavaScript
原生提供的三个包装对象之一,用来生成字符串对象。
1234567var s1 = 'abc';var s2 = new String('abc');typeof s1 // "string"typeof s2 // "object"s2.valueOf() // "abc"
上面代码中,变量s1是字符串,s2是对象。由于s2是字符串对象,s2.valueOf方法返回的就是它所对应的原始字符串。
字符串对象是一个类似数组的对象(很像数组,但不是数组)。
1234new String('abc')// String {0: "a", 1: "b", 2: "c", length: 3}(new String('abc'))[1] // "b"
上面代码中,字符串abc对应的字符串对象 ...
