第3章 变量和常量
3.1 变量和常量
const 定义常量;
let 定义变量;
应尽可能使用常量。
ES6之前使用var来定义变量。
使用浏览器控制台调试时,用const、let定义变量后,不能再重新提交相同的代码,否则会报错“ ... has already been declared”。可以使用F5 刷新。
3.3 标识符命名
变量和常量统统称为标识符。必须以字母、$、下划线( _ )开头。
驼峰命名法、蛇型命名法。
3.4 字面量
本质上,字面量是一种创建值的方式,JavaScript会使用开发人员提供的字面量去创建一个数据值。
3.5 基本类型和对象
在JavaScript中,只有基本类型和对象这两种值。
基本类型的值是不可变的。不可变不是指变量不可变。
六种基本类型:
-
数字
-
字符串
-
布尔
-
null
-
underfined
-
符号 (ES6新特性)
JavaScript有几种内置对象:
-
Array
-
Date
-
RegExp
-
Map 和 WeakMap
-
Set 和 WeakSet
基本类型的数字、字符串、布尔值有对应的对象类型,Number、String、Boolean。这些对象不会真的存储一个值(基本类型则会存储值),它们只是具备关联到对应基本类型的功能。
3.6 数字
JavaScript有两种格式的近似值:IEEE-764 双精度和浮点型。
JavaScript只有一种数值数据类型。
JavaScript能识别4种类型的数字字面量:十进制数、二进制数、八进制数和十六进制数。
此外,还有一些特殊值,比如正负无穷大,以及NaN(从技术上讲,它们不是数字,但会返回数值)。特殊值可以用作占位符。
3.7 字符串
字符串是最简单的文本数据。在JavaScript中表示Unicode文本。
单引号、双引号或者重音符都可以表示字符串字面量。
重音符是ES6引入的,它是为了启用模板字符串。
使用反斜杠( \ )进行转义。
3.8 特殊字符
反斜线可以表示某些不可打印的字符。
-
\n 换行
-
\r 回车
-
\t 制表符
-
\' 单引号
-
\" 双引号
-
` 重音符(tab键上方的按键)
-
\$ 美元符
-
\\ 反斜线
-
\u XXX 任意的Unicode码
-
\x XX Latin1字符
其他不常用的特殊字符:
-
\0 NUL字符
-
\v 垂直制表符
-
\b 退格
-
\f 分页
3.8.1 模板字符串
ES6之前,使用字符串连接是唯一的实现方式。现在可使用模板字符串。
${ } ,如果紧跟 $ 的值被包裹在大括号中,那么该值就会被注入到字符串中。
模板字符串使用重音符 ( ` )
let currentTemp = 19.5;
const message = `The curren temperatrue is ${currentTemp} \u00b0C`;
3.8.2 多行字符串
const multiline = "line1\n"+
"line2\n"+
"line3";
3.8.3 数字用作字符串
给数字加上引号,数字就会变成字符串。
3.9 布尔型
true、false
3.10 符号
ES6的新特性。
它是一种新的数据类型,代表一个唯一的标志。它不会匹配其他任何符号。
Symbol() 构造方法可用来创建符号。还可在构造方法中传入一些描述信息。
const RED = Symbol();
const ORSNGE = Symbol("The color of a sunset!");
RED === ORANGE; //false:每个符号都是唯一的
3.11 null 和 underfined
一般来说,null 给开发者使用,而 underfined 给 JavaScript 使用,用来表示未赋值的内容。
只有在有意的模仿变量未赋值的时候,才会使用underfined。
3.12 对象
基本类型只能代表一个值,而对象可以代表多个值或者复制的值,而且这个值在其生命周期内都是可变的。
本质上,对象是一个容器,容器的内容可以随着时间推移而改变。
对象的语法:大括号 {}
对象的内容称作属性(或成员),属性是由名称(或键)和值做成。
键必须是字符串或者符号,值可以是任意类型。
const obj = {};
//size是合法的字符串标识符
obj.size; //underfined
//"
not an identifier"是不合法的字符串标识符
obj["not an identifier"] = 3;
obj["not an identifier"] ; //3
//使用符号
const SIZE = Symbol();
obj[SIZE] = 8;
obj[SIZE]; //8
对象还可以包含函数。
3.13 Number,String 和 Boolean 对象
数字、字符串和布尔型都有对应的对象类型。
这些对象有两个用途:一是存储特殊值;二是以函数形式提供某些功能。
3.14 数组
数组是一种特殊类型的对象。
数组的内容天生具有自然排序特性。键是数字,并且是有序的。它具有强大的传递信息的能力。
数组特性:
-
数组长度不固定,可以随时添加和删除元素。
-
数组中元素的类型是多样的,每个元素都可以是任意类型。
-
数组从下标0开始。
数组属性length,返回数组元素的个数。
3.15 拖尾逗号
const arr = [
"one",
"two",
"three", //可加可不加
];
JSON 不允许存在拖尾符号。
3.16 日期
//创建当前日期
const now = new Date();
//创建指定日期,注意月份是从0开始的,9=10月
const halloween = new Date(2016,9,31);
//创建指定日期和时间,19:00 = 7:00 pm
const halloweenParty = new Date(2016, 9, 31, 19, 0);
//一些方法检索Date对象的组件
halloweenParty.getFullYear(); //2016
halloweenParty.getMonth(); //9
halloweenParty.getDate(); //31
halloweenParty.getDay(); //1:周一
halloweenParty.getHours(); //19
halloweenParty.getMinutes(); //0
halloweenParty.getSeconds(); //0
halloweenParty.getMilliseconds; //0
3.17 正则表达式
正则表达式算是一个子语言。通过一种简洁的方式完成字符串的复杂搜索和替换。
//简单邮件识别器
const email = /\b[a-z0-9._-]+@[a-z_-]+(?:\.[a-z]+)+\b/;
//US手机号码识别器
const phone = /(:?\+1)?(:?\(\d{3}\)\s?|\d{3}[\s-]?)\d{3}[\s-]?\d{4}/;
3.18 映射和集合(Map 和 Set)
ES6引进Map 和 Set,以及它们的“弱”引用类型WeakMap 和 WeakSet。
映射也是一种对象,它将键和值关联映射在一起,但在某些特定的场合它比对象更有优势。
集合类似于数组,但它不允许重复元素。
弱引用类型的功能与其对应的类型相似,但在某些情况下,它们在功能上做了权衡以换取更好的性能。
见第10章。
3.19 数据类型转换
3.19.1 转换成数字
第一种方法,使用Number对象的构造方法:
const numStr = "33.3";
const num = Number(numStr);
如果字符串内容不符合数字格式,就会返回NaN。
第二种方法,使用内置函数 parseInt 和 parseFloat 。它们会忽略任何跟数字不相关的信息。parseInt第二个参数指定一个基数,代表将要把数字转成什么格式,如十进制、十六进制。parseFloat始终假定参数为十进制。
const a = parseInt("16 volts", 10); //16
const b = parseInt("3a", 16); //58
const c = parseFloat("15.5 kph"); //15.5
日期转成数字:
const d = new Date();
const ts = d.valueOf();
布尔值转数字,1(true)或 0(false),使用条件操作符
const b = true;
const n = b? 1 : 0 ;
3.19.2 转成字符串
JavaScript任何对象都有toString() 方法,返回该对象的字符串形式。
数字转字符串:
const n = 33.5;
n; //33.5
const s = n.toString();
s; //"33.5"
数组转字符串:
const arr = [1,true,"hello"];
arr.toString(); //"1,true,hello"
Date对象重新实现了一个很有用的toString() 方法,但是大部分对象都只是简单的返回字符串“[object Object]”。
3.19.3 转换成布尔型
可以使用两次“not”操作符( ! ) 将任何值转换成布尔值。使用一次,布尔值跟预期的相反。
数字转布尔值,Boolean对象的构造方法(没有new关键字)也是一个很好的方式:
const n = 0;
const b1 = !!n; //false
const b2 = Boolean(n); //false