《JavaScript 闯关记》之对象

对象是 JavaScript 的数据类型。它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值,因此我们可以把它看成是从字符串到值的映射。对象是动态的,可以随时新增和删除自有属性。对象除了可以保持自有的属性,还可以从一个称为原型的对象继承属性,这种「原型式继承(prototypal inheritance)」是 JavaScript 的核心特征。

对象最常见的用法是创建(create)、设置(set)、查找(query)、删除(delete)、检测(test)和枚举(enumerate)它的属性。

属性包括名字和值。属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。值可以是任意 JavaScript 值,或者在 ECMAScript 5中可以是 gettersetter 函数。

除了名字和值之外,每个属性还有一些与之相关的值,称为「属性特性(property attribute)」:

  • 可写(writable attribute),表明是否可以设置该属性的值。
  • 可枚举(enumerable attribute),表明是否可以通过 for-in 循环返回该属性。
  • 可配置(configurable attribute),表明是否可以删除或修改该属性。

在 ECMAScript 5之前,通过代码给对象创建的所有属性都是可写的、可枚举的和可配置的。在 ECMAScript 5中则可以对这些特性加以配置。

除了包含属性特性之外,每个对象还拥有三个相关的「对象特性(object attribute)」:

  • 对象的类(class),是一个标识对象类型的字符串。
  • 对象的原型(prototype),指向另外一个对象,本对象的属性继承自它的原型对象。
  • 对象的扩展标记(extensible flag),指明了在 ECMAScript 5中是否可以向该对象添加新属性。

最后,用下面术语来对 JavaScript 的「三类对象」和「两类属性」进行区分:

  • 内置对象(native object),是由 JavaScript 规范定义的对象或类。例如,数组、函数、日期和正则表达式都是内置对象。
  • 宿主对象(host object),是由 JavaScript 解释器所嵌入的宿主环境(比如 Web 浏览器)定义的。客户端 JavaScript 中表示网页结构的 HTMLElement 对象均是宿主对象。
  • 自定义对象(user-defined object),是由运行中的 JavaScript 代码创建的对象。
  • 自有属性(own property),是直接在对象中定义的属性。
  • 继承属性(inherited property),是在对象的原型对象中定义的属性。

阅读更多

《JavaScript 闯关记》之语句

表达式在 JavaScript 中是短语,那么语句就是整句命令。表达式用来计算出一个值,语句用来执行以使某件事发生。从本质上看,语句定义了 JavaScript 中的主要语法,语句通常使用一或多个关键字来完成给定任务。语句可以很简单,例如通知函数退出;也可以比较复杂,例如指定重复执行某个命令的次数。下表列出了 JavaScript 大部分语句的语法和用途:

语句 语法 用途
break break [label]; 退出最内层循环或者退出 switch 语句,又或者退出 label 指定的语句
case case expression: switch 语句中标记一条语句
continue continue [label]; 重新开始最内层的循环或重新开始 label 指定的循环
debugger debugger; 断点器调试
default default; switch 中标记默认的语句
do-while do statement while(expression); while 循环的一种替代形式
empty ; 什么都不做
for for(init;expr;incr) statement 简写的循环结构
for-in for(var in object) statement 遍历一个对象的属性
function function name([param[],...])
{statement}
声明一个函数
if-else if (expression) statement1
[else statement2]
执行 statement1 或者 statement2
label label:statement statement 指定一个名字 label
return return [expression]; 从函数返回一个值
switch switch(expression){statement} case 或者 default 语句标记的多分支语句
throw throw expression; 抛出异常
try try {statement}
[catch {handler statement}]
[finally {cleaup statement}]
捕获异常
use strict "use strict" 对脚本和函数应用严格模式
var var name=[=expr][,...]; 声明并初始化一个或多个变量
while while(expression) statement 基本的循环结构
with with(object) statement 扩展作用域链

阅读更多

《JavaScript 闯关记》之表达式和运算符

表达式

表达式是由数字、运算符、数字分组符号(如括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。JavaScript 表达式主要有以下几种形式:

  • 原始表达式:常量、变量、保留字。
  • 对象、数组初始化表达式:var obj={a:1,b:2};var arr=[1,2,3];
  • 函数定义表达式:var fn=function(){}
  • 属性访问表达式:Math.abs
  • 调用表达式:alert('hello');
  • 对象创建表达式:new object();

运算符

JavaScript 中的运算符用于算术表达式、比较表达式、逻辑表达式、赋值表达式等。需要注意的是,大多数运算符都是由标点符号表示的,比如 +=。而另外一些运算符则是由关键字表示的,比如 typeofinstanceof,关键字运算符和标点符号都是正规的运算符。

下表列出了 JavaScript 中所有的运算符,并按照运算符的优先级排序的,前面的运算符优先级要高于后面的运算符优先级,被空行分隔开来的运算符具有不同的优先级。标题为 A 的列表示运算符的结合性(Associativity),L 表示从左至右、R 表示从右至左,标题为 N 的列表示操作数的个数(Number)。

阅读更多

《JavaScript 闯关记》之变量和数据类型

当程序需要将值保存起来以备将来使用时,便将其赋值给一个变量,值的类型称作数据类型。

变量

JavaScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说,每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用关键字 var 来声明的,如下所示:

1
var message;

这行代码定义了一个名为 message 的变量,该变量可以用来保存任何值(像这样未经过初始化的变量,会保存一个特殊的值 undefined)。JavaScript 也支持直接初始化变量,因此在定义变量的同时就可以设置变量的值,如下所示:

1
var message = "hello";

此时,变量 message 中保存了一个字符串值 "hello"。像这样初始化变量并不会把它标记为字符串类型,因此,可以在修改变量值的同时修改值的类型。如下所示:

1
2
var message = "hello";
message = 100; // 有效的语句,不好的写法

在这个例子中,变量 message 一开始保存了一个字符串值 "hello",然后该值又被一个数字值100取代。虽然我们不建议修改变量所保存值的类型,但这种操作在 JavaScript 中完全有效。

阅读更多

《JavaScript 闯关记》之语法

JavaScript 的语法大量借鉴了 C 及其他类 C 语言(如 Java 和 Perl)的语法。因此,熟悉这些语言的开发人员在接受 JavaScript 更加宽松的语法时,一定会有种轻松自在的感觉。本章主要按照 ECMAScript 3 介绍这门语言的基本概念,并就 ECMAScript 5 的变化给出说明。

字符集

JavaScript 程序是用 Unicode 字符集编写的,Unicode 是 ASCII 和 Latin-1 的超集,并支持地球上几乎所有在用的语言。ECMAScript 3 要求 JavaScript 的实现必须支持 Unicode 2.1及后续版本,ECMAScript 5 则要求支持 Unicode 3及后续版本。

扩展阅读「Unicode 与 JavaScript 详解」
http://www.ruanyifeng.com/blog/2014/12/unicode.html

区分大小写

JavaScript 是区分大小写的。也就是说,关键字、变量、函数名和所有的标识符(identifier)都必须采取一致的大小写形式。比如,关键字 while 必须写成 while,而不能写成 While 或者 WHILE。同样,onlineOnlineOnLineONLINE 是4个不同的变量名。

但需要注意的是,HTML 并不区分大小写。由于它和客户端 JavaScript 联系紧密,因此这点区别很容易混淆。许多客户端 JavaScript 对象和属性与他们所表示的 HTML 标签和属性名相同。在 HTML 中,这些标签和属性名可以使用大写也可以是小写,而在 JavaScript 中则必须是小写。例如,在 HTML 中设置事件处理程序时,onclick 属性可以写成 onClick,但在 JavaScript 代码中,必须使用小写的 onclick

阅读更多