优秀的编程知识分享平台

网站首页 > 技术文章 正文

《JavaScript高级程序设计》笔记——ECMAScript(数据类型)

nanyue 2024-10-23 12:11:53 技术文章 2 ℃

Javascript由以下三部分组成:

  1. 核心(ECMAScript)
  2. 文档对象模型(DOM)
  3. 浏览器对象模型(BOM)

ECMAScript组成部分:

语法、类型、语句、关键字、保留子、操作符、对象。

按照惯例,外部 JavaScript 文件带有.js 扩展名。但这个扩展名不是必需的,因为 浏览器不会检查包含 JavaScript 的文件的扩展名。这样一来,使用 JSP、PHP 或其他 服务器端语言动态生成 JavaScript 代码也就成为了可能。但是,服务器通常还是需要 看扩展名决定为响应应用哪种 MIME 类型。如果不使用.js 扩展名,请确保服务器能 返回正确的 MIME 类型。

无论如何包含代码,只要不存在 defer 和 async 属性,浏览器都会按照<script>元素在页面中出现的先后顺序对它们依次进行解析。

ECMAScript 5 引入了严格模式(strict mode)的概念:"use strict”;严格模式下,JavaScript 的执行结果会有很大不同。

控制语句中使用代码块({...})——即使代码块中只有一条语句。

ECMAScript 中有 5 种简单数据类型(也称为基本数据类型):

Undefined、Null、Boolean、Number 和 String。

还有 1 种复杂数据类型——Object,

Object 本质上是由一组无序的名值对组成的。

字面值 undefined 的主要目的是用于比较。

对于尚未声明过的变量,只能执行一项操作,即使用 typeof 操作符检测其数据类型。

即便未初始化的变量会自动被赋予 undefined 值,但显式地初始化变量依然是明智的选择。

从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回"object”的原因。

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。这样 一来,只要直接检查 null 值就可以知道相应的变量是否已经保存了一个对象的引用。

实际上,undefined 值是派生自 null 值的:

alert(null == undefined); //true

alert(null === undefined); //false

相等操作符(==)出于比较的目的会转换其操作数

只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存 null 值。这样做不仅可以 体现 null 作为空对象指针的惯例,而且也有助于进一步区分 null 和 undefined。

八进制字面量在严格模式下是无效的,会导致支持的 JavaScript 引擎抛出错误。

在默认情况下,ECMASctipt 会将那些小数点后面带有 6 个零以上的浮点数值转换为以 e 表示法 表示的数值(例如,0.0000003 会被转换成 3e7)。

浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加 0.2 的结果不是 0.3,而是 0.30000000000000004。因此,永远不要测试某个特定的浮点数值

关于浮点数值计算会产生舍入误差的问题,有一点需要明确:这是使用基于 IEEE754 数值的浮点计算的通病,ECMAScript 并非独此一家;其他使用相同数值格 式的语言也存在这个问题。

使用 isFinite()函数判断一个数值是不是有穷的(是不是位于最小[-Infinity]和最大[Infinity]的数值之间)。

访问 Number.NEGATIVE_INFINITY 和 Number.POSITIVE_INFINITY 也可以 得到负和正 Infinity 的值。

可以想见,这两个属性中分别保存着-Infinity 和 Infinity。

NaN 本身有两个非同寻常的特点。

首先,任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN,这 个特点在多步计算中有可能导致问题。

其次,NaN 与任何值都不相等,包括 NaN 本身。例如,下面的代 码会返回 false:

alert(NaN == NaN); //false

针对 NaN 的这两个特点,ECMAScript 定义了 isNaN()函数。

只有 0 除以 0 才会返回 NaN,正数除以 0 返回 Infinity,负数除以 0 返回-Infinity。

尽管有点儿不可思议,但 isNaN()确实也适用于对象。在基于对象调用 isNaN() 函数时,会首先调用对象的 valueOf()方法,然后确定该方法返回的值是否可以转 换为数值。如果不能,则基于这个返回值再调用 toString()方法,再测试返回值。 而这个过程也是 ECMAScript 中内置函数和操作符的一般执行流程。

有 3 个函数可以把非数值转换为数值:Number()、parseInt()和 parseFloat()。

一元加操作符的操作与 Number()函数相同。

由于 parseFloat()只解析十进制值,因此它没有用第二个参数指定基 数的用法。最后还要注意一点:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后 都是零),parseFloat()会返回整数。

var lang = "Java”;

lang = lang + "Script";

变量 lang 开始时包含字符串"Java"。而第二行代码把 lang 的值重新定义为"Java" 与"Script"的组合,即"JavaScript"。实现这个操作的过程如下:首先创建一个能容纳 10 个字符的 新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字符串"Script",因为这两个字符串已经没用了。这个过程是在后台发生的,而这也是在某些旧版本的浏览器(例如版本低于 1.0 的 Firefox、IE6 等)中拼接字符串时速度很慢的原因所在。但这些浏览器后 来的版本已经解决了这个低效率问题。

要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的 toString()方法。数值、布尔值、对象和字符串值(没错,每个字符串也都有一个 toString()方法,该方法返回字符串的一个副本)都有 toString()方法。

但 null 和 undefined 值没有这个方法,因为它们没有对应的包装器类,从而没有属性和方法。

使用转型函数 String(),这个 函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:

  1. 如果值有 toString()方法,则调用该方法(没有参数)并返回相应的结果;
  2. 如果值是 null,则返回"null”;
  3. 如果值是 undefined,则返回"undefined"。

ECMAScript 中的对象其实就是一组数据和功能的集合

对象可以通过执行 new 操作符后跟要创建 的对象类型的名称来创建。

最近发表
标签列表