JavaScript高级程序读书笔记——3、4章
JavaScript基本概念、变量、作用域和内存问题
基本概念
标识符
所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。组成规则如下:
- 第一个字符必须是一个字母、下划线( _ )或一个美元符号( $ );
- 其他字符可以是字母、下划线、美元符号或数字。
ECMAScript 标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写。Javascript语法严格区分大小写。
注释
ECMAScript 使用 C 风格的注释,包括单行注释和块级注释。单行注释以两个斜杠开头,如下所示:
// 单行注释
块级注释以一个斜杠和一个星号( /* )开头,以一个星号和一个斜杠( */ )结尾,如下所示:
/*
* 这是一个多行
* (块级)注释
*/
虽然上面注释中的第二和第三行都以一个星号开头,但这不是必需的。之所以添加那两个星号,纯粹是为了提高注释的可读性(这种格式在企业级应用中用得比较多)。
严格模式(重点)
ECMAScript 5 引入了严格模式(strict mode)的概念。而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式,可以在顶部添加如下代码:
"use strict";
关键字和保留字
第 5 版把在非严格模式下运行时的保留字缩减为下列这些:
class enum extends super const export import
在严格模式下,第 5 版还对以下保留字施加了限制:
implements package public interface private static let protected yield
注意, let 和 yield 是第 5 版新增的保留字;
变量
ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说,每个变量仅仅是一个用于保存值的占位符而已。
全局变量与局部变量:简单可以理解为在函数外声明的变量都为全局变量,在函数内声明的为局部变量。
有用的知识考题:js的变量有两种作用域?
答:全局变量和局部变量。没有使用 var 声明的变量和在function之外声明的变量都是全局变量,是window属性之一;使用 var 声明的变量属于所在函数,不管在函数的哪个位置出现,等价于在函数一开始声明。局部变量比同名全局变量的优先级高,所以局部变量会隐藏同名的全局变量。要想访问被隐藏的全局变量就加上 window. 前缀。
特殊的全局变量:
function test(){
message = "hi"; // 全局变量
}
例子省略了 var 操作符,因而 message 就成了全局变量。这样,只要调用过一次 test() 函数,这个变量就有了定义,就可以在函数外部的任何地方被访问到,一次 test() 函数未被调用 message怎么为undefined。
数据类型
ECMAScript 中有 5 种简单数据类型(也称为基本数据类型): Undefined 、 Null 、 Boolean 、 Number 和 String 。还有 1种复杂数据类型—— Object , Object 本质上是由一组无序的名值对组成的。 typeof 操
typeof 操作符
typeof检测给定变量的数据类型的方法,返回6种类型的字符串,详情如下:
- "undefined" ——如果这个值未定义;
- "boolean" ——如果这个值是布尔值;
- "string" ——如果这个值是字符串;
- "number" ——如果这个值是数值;
- "object" ——如果这个值是对象或 null ; "function" ——如果这个值是函数。
Undefined 类型
Undefined 类型只有一个值,即特殊的 undefined 。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined。第 3 版引入这个值是为了正式区分空对象指针与未经初始化的变量。
注:
对未初始化的变量执行 typeof 操作符会返回 undefined 值,而对未声明的变量执行 typeof 操作符同样也会返回 undefined 值。而直接使用未声明的age变量浏览器这会报错。
var message; // 这个变量声明之后默认取得了 undefined 值 // 下面这个变量并没有声明 // var age alert(typeof message); // "undefined" alert(typeof age); // "undefined"
Null 类型
Null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回 "object" 的原因。
eg:
var car = null; alert(typeof car); // "object"
注意: undefined 值是派生自 null 值的,因此 ECMA-262规定对它们的相等性测试要返回 true 。
eg:
alert(null == undefined); //true
Boolean 类型
Boolean 类型是 ECMAScript 中使用得最多的一种类型,该类型只有两个字面值: true 和 false 。这两个值与数字值不是一回事,因此 true 不一定等于 1,而 false 也不一定等于 0。
虽然 Boolean 类型的字面值只有两个,但 ECMAScript 中所有类型的值都有与这两个 Boolean 值等价的值。要将一个值转换为其对应的 Boolean 值,可以调用转型函数 Boolean()。
eg:
var message = "Hello world!"; var messageAsBoolean = Boolean(message);
字符串 message 被转换成了一个 Boolean 值,该值被保存在 messageAsBoolean变量中。可以对任何数据类型的值调用 Boolean() 函数,而且总会返回一个 Boolean 值。至于返回的这个值是 true 还是 false ,取决于要转换值的数据类型及其实际值。各种数据类型及其对应的转换规则如下表。
| 数据类型 | 转换为true的值 | 转换为false的值 |
| Boolean | true | false |
| String | 任何非空字符串 | "" (空字符串) |
| Number | 任何非零数字值(包括无穷大) | 0和 NaN (NaN非数值(Not a Number)是一个特殊的数值) |
| Object | 任何对象 | null |
| Undefined |
n/a(或 N/A),是 not applicable的缩写,意思是“不适用”。 |
undefined |
Number 类型
Number 类型应该是 ECMAScript 中最令人关注的数据类型了,这种类型使用 IEEE754 格式来表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值)。为支持各种数值类型,ECMA-262 定义了不同的数值字面量格式。JavaScript下Number 类型除了可以表示十进制,还可以表示八进制(以 8 为基数)或十六进制(以 16 为基数);八进制字面值的第一位必须是零(0),然后是八进制数字序列(0~7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析。
eg:
var octalNum1 = 070; // 八进制的 56 var octalNum2 = 079; // 无效的八进制数值——解析为 79 var octalNum3 = 08; // 无效的八进制数值——解析为 8
注:八进制字面量在严格模式下是无效的,会导致支持的 JavaScript 引擎抛出错误。
十六进制字面值的前两位必须是 0x,后跟任何十六进制数字(0~9 及 A~F)。其中,字母 A~F可以大写,也可以小写。
JavaScript下Number 类型支持表示浮点型,遇见极大或极小的数值,也可以用 e 表示法(即科学计数法)表示的浮点数值表示。用 e 表示法表示的数值等于 e 前面的数值乘以 10 的指数次幂
eg:
var floatNum = 3.125e7; //等于 3.125*107 var floatNum = 3e-7; //等于 0.00000003及 3*10-7
数值范围
由于内存的限制,ECMAScript 并不能保存世界上所有的数值。ECMAScript 能够表示的最小数值保存在 Number.MIN_VALUE 中——在大多数浏览器中,这个值是 5e-324;能够表示的最大数值保存在Number.MAX_VALUE 中——在大多数浏览器中,这个值是 1.7976931348623157e+308。如果某次计算的结果得到了一个超出 JavaScript 数值范围的值,那么这个数值将被自动转换成特殊的 Infinity 值。具体来说,如果这个数值是负数,则会被转换成 -Infinity (负无穷),如果这个数值是正数,则会被转换成 Infinity (正无穷)。可以使用 isFinite() 函数判断一个Number类型的变量超出表示范围。参数位于最小与最大数值之间时会返回 true。
NaN
NaN ,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以 0都会导致错误,从而停止代码执行。但在 ECMAScript中,任何数值除以 0会返回 NaN① ,因此不会影响其他代码的执行。
两个特点:
a、涉及 NaN 的操作(例如 NaN /10)都会返回 NaN;
b、 NaN 与任何值都不相等,包括 NaN 本身;例如:alert(NaN == NaN); // false
关于NaN一个比较重要的函数 isNaN();其返回值为 true 或 false。见下面例子进行说明。
alert(isNaN(NaN)); //true alert(isNaN(10)); //false(10 是一个数值) alert(isNaN("10")); //false(可以被转换成数值 10) alert(isNaN("blue")); //true(不能转换成数值) alert(isNaN(true)); //false(可以被转换成数值 1)
数值转换
3 个函数可以把非数值转换为数值: Number() 、 parseInt() 和 parseFloat()
Number() 函数的转换规则如下。
- 如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。
- 如果是数字值,只是简单的传入和返回。
- 如果是 null 值,返回 0。
- 如果是 undefined ,返回 NaN 。
- 如果是字符串,遵循下列规则:
- 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 "1"会变成 1, "123" 会变成 123,而 "011" 会变成 11(注意:前导的零被忽略了);
- 如果字符串中包含有效的浮点格式,如 "1.1" ,则将其转换为对应的浮点数值(同样,也会忽略前导零);
- 如果字符串中包含有效的十六进制格式,例如 "0xf" ,则将其转换为相同大小的十进制整数值;
- 如果字符串是空的(不包含任何字符),则将其转换为 0;
- 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN 。
- 如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN ,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值。
Number() 函数在转换字符串时比较复杂而且不够合理,所以处理整数的情况常用 parseInt();, parseInt()转换例子及说明:
/* * 如果第一个字符是数字字符, parseInt() 会继续解析第二个字符,直到解析* 完所有后续字符或者遇到了一个非数字字符 */ var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); // NaN var num3 = parseInt("0xA"); // 10(十六进制数) // 22.5 会被转换为 22,因为小数点并不是有效的数字字符。 var num4 = parseInt(22.5); // 22 var num5 = parseInt("070"); // 56(八进制数) //ECMAScript 3 认为是 56(八进制),ECMAScript 5 认为是 70(十进制) var num = parseInt("070"); var num6 = parseInt("70"); // 70(十进制数) var num7 = parseInt("0xf"); // 15(十六进制数)
为了消除在使用 parseInt() 函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)。如果知道要解析的值是十六进制格式的字符串,那么指定基数 16 作为第二个参数,可以保证得到正确的结果,例如:
var num = parseInt("0xAF", 16); //175 //字符串可以不带前面的 "0x" var num1 = parseInt("AF", 16); //175 var num2 = parseInt("AF"); //NaN
与 parseInt() 函数类似, parseFloat() 也是从第一个字符(位置 0)开始解析每个字符, parseFloat() 转换数值的几个典型示例。
var num1 = parseFloat("1234blue"); //1234 (整数) var num2 = parseFloat("0xA"); //0 var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.34.5"); //22.34 var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000
String 类型

浙公网安备 33010602011771号