前言:进入红宝书的第三章,关于JavaScript的语言基础。本章主要的内容包括了以下几点:
1、变量声明var\let\const的区别和联系。
2、标识符的声明规定。
3、JavaScript的6种基本数据类型简介。
一、基础语法和变量声明
首先我们需要注意的是,JS是一门十分注重大小写的语言,无论是变量、函数名还是操作符。
标识符的定义原则和其他语言相似:
1、第一个字母必须是字母下划线或美元符号$。
2、剩下的字母可以是字母、数字、下划线、美元符号等。
3、标识符默认使用的是驼峰的大小写形式。
4、关键字和保留字不能用于标识符。
二、变量
ECMAScript的变量是松散类型的,其可以声明任意类型的数据,每个变量本质上不过是一个用于保存任意值的命名占位符。
var\let\const声明变量的区别和联系
1、var声明的一个变量在函数中具有局部作用域,为局部变量,在函数退出时被销毁。
2、var的声明的变量存在变量提升现象,也就是把所有的变量的声明都会自动提升到函数作用域的顶部。
3、let 声明的变量的作用域是块级作用域,let不允许同一个块级作用域中存在冗余的声明
4、暂时性死区(template dead zone),在let声明之前的执行瞬间,在此阶段引用任何后面才声明的变量都会抛出ReferenceError的错误。
5、与var不同,let在全局作用域中声明的变量不会成为window对象的属性。
6、const 和let基本类似,但是其重要的区别就是使用其声明变量的同时必须初始化变量,且尝试修改const 声明的变量会导致运行时的错误。
7、const的一个潜在的重要用法就是声明一个不会被修改的for循环变量,每次迭代的时候都创建一个新的变量。对于for-of和for-in循环很有意义。
let i=0;
for(const j=99;i<9;i++){
console.log(j);
}
上述代码输出结果为:
三、数据类型
ECMAScript有6种基本的数据类型:Undefined\Null\Number\String\Boolean\Symbol()。还有一种由无序的键值对组成的数据类型Object,可以使用typeof操作符来判断具体的数据类型。如下所示
let message="msg1";
let right=true;
let b={
name:"lwh",
age:23
}
console.log(typeof message); //string
console.log(typeof right); //boolean
console.log(typeof b); //object
3.1 Undefined
此数据类型只有一个值,就是undefined。一般来说,永远不要显式的给某个变量设置undefined的值,字面量undefied的作用主要是用于比较,其增设的目的就是为了区分空对象指针和未初始化变量的区别。
3.2 Null类型
Null类型同样只有一个值,也就是null。逻辑上说,null表示的是一个空对象指针,使用typeof返回的是object。在定义将来要保存对象值的变量时,建议使用null来初始化,仅需判断此变量的值是不是null,就可知道此变量是否被重新赋予了一个对象的引用。undefined是由null值派生而来的,其表面上是相等的。
console.log(undefined==null); //输出为true
3.3 Boolean类型
Boolean类型的使用频率非常高,存在true和false两个字面值。其他类型的数据都存在相应的布尔值的等价形式。记住等价为false的几个值就够了。
false \" "\0\NaN\null\undefiend
3.4Number类型
数值类型存在多种进制形式,最基础的就是十进制形式。其次常用到的有0开头的八进制和0x开头的十六进制,如果字面量超出了应有的范围,则就会忽略前缀0,自动转换为十进制数值。
所有使用八进制和十六进制创建的数值在所有的数学操作中都被视为十进制数值。
关于浮点值的说明
1、ECMAScript由于浮点值占据的内存是整数值的2倍,总是会想办法将浮点值转换为整数值,小数点后面全是0的时候。
2、对于非常大或者非常小的浮点值可以使用科学计数法进行表示。
3、浮点值的精确度可以达到17位小数,但其数值计算的精度很差,如0.1+0.2计算无法得到0.3,因为ECMAScript会将小数点后至少包含6个零的浮点值转换为科学计数法。
关于值的范围和NaN
1、内存的客观限制了存储数值的最大和最小值,超出存储的极限值会以Infinity或者-Infinity,此时不能用于任何的进一步计算。
2、NaN 用于表示本来要返回数值的操作失败了(不是抛出错误),任何涉及NaN的操作都将返回NaN
数值的转换
存在三个函数可以将非数值类型数据转换为数值类型数据
Number():基于一定的规则转换成数值
parseInt() :转换成整数数值类型,自动过滤小数部分内容,第二个参数接收的是要转换的进制数,默认是十进制。
parseFloat() :转换成浮点值数值类型,自动过滤小数部分内容,第二个参数接收的是要转换的进制数,默认是十进制。
3.5 String类型
此数据类型表示的是0或多个16位Unicode字符序列,可以使用双引号、单引号、或者反引号。
常见的字符字面量意义如下:
转换为字符串
几乎所有的值都自带了toString方法,使用此方法将其转换为当前值的字符串等价物。多数情况下此方法不接受参数,但是在对数值调用此方法时,可以接收一个进制数的参数,指名将此数值转换成什么进制的字符串输出。
使用+号和一个空的字符串也可以将其转换为字符串。
什么为模板字面量?
使用反引号可以实现跨行定义字符串,在定义HTML模板时特别有用。
字符串插值可以通过${}中使用一个JavaScript表达式,代码如下:
let value=19;
let exponent='second';
let interpolatedString=`${value} to the ${exponent} power is ${value*value}`;
console.log(interpolatedString);
//输出 19 to the second power is 361
3.6 Symbol类型
符号是原始值,且符号实例唯一,不可变的,其作用就是确保对象属性使用唯一标识符。符号就是用于创建唯一的记号,进而用作非字符串形式的对象属性。
let generalSym=Symbol('six'); //传入一个字符串参数用于对符号的描述
let otherSym=Symbol('six');
console.log(generalSym==otherSym); //false
Symbol()函数不能与new关键字一起作为构造函数使用。
使用全局符号注册表:
运行时不同部分需要共享和重用符号实例时,则可以使用一个字符串作为键,在全局符号注册表中创建并重用符号。需要调用以下方法:
let fooGlobalSymbol=Symbol.for('foo');
let otherFooGlobalSymbol=Symbol.for('foo');
console.log(fooGlobalSymbol==otherFooGlobalSymbol); //true
使用符号作为属性
凡是可以使用字符串或数值作为属性的地方都可以使用符号:
let s1=Symbol.for('foo'); //创建全局的注册表符号
console.log(Symbol.keyFor(s1)); //输出foo
let s2=Symbol('bar');
let s3=Symbol('baz');
let s4=Symbol('qux');
let obj={
[s2]:'foo val'
}
关于ECMAScript中的内置符号说明:
内置符号的作用是用于暴露语言的内部行为,便于开发者直接访问、重写或模拟这些行为。需要注意的是所有的内置符号属性都是不可写的、不可枚举、不可配置的。
引用内置符号在规范中的名称前缀@@。
常见的内置符号暂时不做过多介绍:
3.7 object类型
ECMAScript中对象本质上就是一组数据和功能的集合。对象可以通过new操作符后跟对象类型的名称来创建。每一个Object实例都具有以下的属性和方法:
1、constructor 用于创建当前对象的函数。
2、hasOwnProperty(propertyName) 用于判断当前的对象实例上是否存在给定的属性,检查的属性名必须是字符串形式。
3、isPropertyOf(Object) 用于判断当前对象是否是另外一个对象的原型。
4、toString() 返回对象的字符串形式的表达式。
5、valueOf() 返回对象的对应的字符串、数值或布尔值表示。通常与toString()的返回值相同。
6、toLocalString() 返回对象的字符串表示,反应了对象在本地化执行环境。
ECMAScript中的Object是所有对象的基类,所以在任何对象都有上述的属性和方法。
四、总结归纳
本篇博客是红宝书第三章的第一篇,对JS种的标识符的声明规定、常见的变量声明方法var、let、const的区别进行了简单的介绍,再对JS的基本数据类型进行了补充说明。对于JS的基础语法有了一个大致的了解,下一篇博客将记录学习操作符、语句和函数基础相关内容。
JavaScript高级程序设计读书进度 56/865