#第3章 类型、值和变量
- <a href="#no1">3.1 数字</a>
- <a href="#no2">3.2 文本</a>
- <a href="#no3">3.3 布尔值</a>
- <a href="#no4">3.4 null 和 undefined</a>
- <a href="#no5">3.5 全局对象</a>
- <a href="#no6">3.6 包装对象</a>
- <a href="#no7">3.7 不可变的原始值和可变的对象引用</a>
- <a href="#no8">3.8 类型转换</a>
- <a href="#no9">3.9 变量声明</a>
- <a href="#no10">3.10 变量作用域</a>
##<a name="no1">3.1 数字</a>
> js中不区分整数值和浮点数值,所有的数字均用浮点数值表示。
###3.1.1 整型直接量
> 略
###3.1.2 浮点型直接量
> 浮点型直接量可以含有小数点,它们采用的是传统的实数写法。一个实数由整数部分、小数点和小数部分组成。还可以用指数计数法表示浮点类型直接量,即在实数后跟字母`e`或`E`,后面在跟负号,其后再加一个整形的指数。
###3.1.3 JavaScript中的算术运算
> js程序是使用语言本身提供的算术运算符来进行数字运算的。(+、-、*、/、%)。更复杂的运算通过`Math`对象的属性定义的函数和常量来实现。
###3.1.4 二进制浮点数和四舍五入错误
> 略
###3.1.5 日期和时间
> js语言核心包括`Date()`构造函数,用来创建表示日期和时间的对象。
##<a name="no2">3.2 文本</a>
> js通过字符串类型来表示文本。
###3.2.1 字符串直接量
> 在JS程序中的字符串直接量,是由单引号或双引号括起来的字符序列。
###3.2.2 转义字符
> 略
###3.2.3 字符串的使用
> JS的内置功能之一就是字符串连接。
var s = 'hello, world';
s.charAt(0); //=> h
s.charAt(s.length - 1); //=> d
s.substring(1, 4); //=> ell
s.slice(1, 4); //=> ell
s.slice(-3); //=> rld
s.indexOf('l') //=> 2
s.lastIndexOf('l') //=> 10
s.split(', '); //=> ['hello', 'world']
s.replace('h', 'H'); //=> Hello, world
###3.2.4 模式匹配
> JS定义了`RegExp()`构造函数,用来创建表示文本匹配模式的对象。具体第10章会有介绍。
##<a name="no3">3.3 布尔值</a>
> 布尔值指代真或假、开或关、是或否。这个类型只有两个值,保留字`true`和`false`。
##<a name="no4">3.4 null 和 undefined</a>
> `null`是JS语言的关键字,它表示一个特殊值,常用来描述“空值”。
#
> `undefined`也表示值得空缺。变量没有初始化,如果要查询对象属性或数组元素的值时返回`undefined`则说明这个属性或元素不存在。
**如果你想将`null`和`undefined`赋值给变量或者属性,或将它们作为参数传入函数,最佳选择是使用`null`。**
##<a name="no5">3.5 全局对象</a>
> 全局对象(`global object`)在JS中有着重要的用途:全局对象的属性是全局定义的符号,JS程序可以直接使用。在JS解释器启动时,它将创建一个新的全局对象,并给它一组定义的初始属性:
- 全局属性,比如`undefined`、`Infinity`和`NaN`
- 全局函数,比如`isNaN()、parseInt()、eval()`
- 构造函数,比如`Date()、RegExp()、String()、Object()和Array()`
- 全局对象,比如`Math`和`JSON`
##<a name="no6">3.6 包装对象</a>
> JS对象是一种复合值:它是属性或已命名值得集合。通过“.”符号来引用属性值。当属性值是一个函数的时候,称其为方法。
**存取字符串、数字或布尔值的属性时创建的临时对象成为包装对象。**
##<a name="no7">3.7 不可变的原始值和可变的对象引用</a>
> JS中的原始值(`undefined、null、`布尔值、数字和字符串)与对象(包括数组和函数)有着根本的区别。原始值是不可更开的:任何方法都无法更改一个原始值。
#
**原是值的比较是值的比较:只有在它们的值相等时它们才相等。**
#
**对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,它们也是不相等的。各个索引元素完全相等的两个数组也不想等。**
#
**对象的比较是引用的比较,当且仅当它们引用同一个基对象时,它们才相等。**
##<a name="no8">3.8 类型转换</a>
###3.8.1 转换和相等性
> **一个值转换为另一个值并不意味着两个值相等。**
###3.8.2 显示类型转换
> 做显示类型转换最简单的方法就是使用`Boolean()`、`Number()`、`String()`或`Object()`函数。当不通过`new`运算符调用这些函数时,它们会作为类型转换函数按相应规则进行类型转换。
**除了`null`和`undefined`之外的任何值都具有`toString()`方法。**
###3.8.3 对象转换为原始值
- 对象到布尔值的转换非常简单:所有的对象(包括函数和数组)都转换为`true`。对于包装对象也是如此。
- 对象到字符串和对象到数字的转换是通过调用待转换对象的一个方法来完成的。
> 所有对象继承了两个转换方法:1、`toString()`:它的作用是返回一个反映这个对象的字符串。2、`valueOgf()`:如果存在任意原始值,它就默认将对象转换为表示它的原始值。
##<a name="no9">3.9 变量声明</a>
> 在JS中,使用一个变量之前应当先声明。变量是使用关键字`var`来声明的。
##<a name="no10">3.10 变量作用域</a>
> 一个变量的作用域是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JS代码中的让你和地方都是有意义的。**局部变量的优先级高于同名的全局变量。**
###3.10.1 函数作用域和声明提前
> JS中的函数作用域:函数内声明的所有变量在函数体内始终是可见的。变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。
> **声明提前:即JS函数里声明的所有变量都被“提前”至函数体的顶部。这意味着变量在声明之前甚至已经可用。**
###3.10.2 作为属性的变量
略
###3.10.3 作用域链
> JS是基于词法作用域的语言:通过阅读包含变量定义在内的数行源码就能知道变量的作用域。全局变量在程序中始终都是有定义的,局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的。P59《JavaScript权威指南-第六版》