在这篇文章中,会阐述 ECMAScript 所定义的语法、数据类型。(ps. 流控制和函数会在下一章说明)。
语法
ES 中的一切(变量名、函数名和操作符)都大小写敏感
标识符
第一个字符:支持 字母、下划线(_) 和 $
其他支持 字母、下划线(_)、$ 或 数字
驼峰命名
禁用关键字、保留字、true、false 和 null
严格模式(strict mode)
ES5 引入, 为 JS 定义一种不同的解析与执行模型
对于不安全操作会抛出错误
兼容性:支持 IE10+、Firefox 4+、Safari 5.1+、Opera 12+ 和 Chrome
关键字和保留字
关键字
保留字
其实在我的理解上来看,看这个语言接下来会有怎么样的发展,在保留字里就可以得到一个大概的预测。
变量
ps. 给未经声明的变量赋值,在严格模式下会抛出 ReferenceError 错误。
数据类型
ES 定义的7种数据类型:
6种基本数据类型:Undefined、Null、Boolean、Number、String、Symbol(ES6 中定义的)
1种复杂数据类型:Object(有一组无序的KV组成)
typeof 操作符
typeof 操作符用于检测变量的数据类型,操作符的结果返回字符串。
'undefined' -> 这个值未定义
'boolean' -> 布尔值
'string' -> 字符串
'number' -> 数值
'object' -> 对象或 null
'function' -> 函数
'symbol' -> 符号类型
Undefined
Undefined 类型只有一个值,即 undefined。在声明变量但未对其初始化时,这个变量的值就是 undefined。
Null
Null 类型只有一个值,就是null,表示空指针对象,这也正式 typeof null 返回 'object' 的原因。如果定义的变量准备用来存放对象,最好初始化为null,这样可以判断此变量是否被赋值对象引用。
undefined 派生自 null 值,所以:
对于 undefined,没有必要在初始化时进行显式赋值
而对于 null,如果准备存储的类型为对象,则应该去赋值。
Boolean
Boolean 有 true 和 false 两个值(区分大小写)。
上面这段代码的结构,相信大家平时也经常用到,这背后究竟发生了什么,会让 message 返回 true?
原来,Boolean 的值与每个数据类型通过 都可以有等价的转换。
Boolean -> true false
String -> true: 任何非空字符串; false: 空字符串;
Number -> true: 任何非零的数字; false: 0 和 NaN;
Object -> true: 任何对象; false: null;
Undefined -> true: (没有对应的转换值); false: undefined;
所以,在上面那个例子中,其实message 自动转换为了 true
Number
Number 类型表示整数和浮点数,其使用的为 IEEE754 格式。
声明 十/八/十六 进制数值:不同的数值字面量格式
Number 类型同时支持通过不同的字面量意义 来声明十进制、八进制和十六进制。在运算时,都会转成十进制数值来进行算数计算。
声明浮点数值
浮点数相必大家都比较熟悉了,这里将 ES 中几个注意点罗列出来。
声明
浮点数精度
浮点数最高精度为17位小数,但是需要注意的是,算数计算时,精确度远远不如整数。
数值范围
取得 ES 中最小数:
取得 ES 中最大数:
如果超出这个阈值,则会将数值转换为 Infinity(正无穷) 或 -Infinity(负无穷)
判断 是否超出范围:
NaN 数值
NaN,即非数值(Not a Number),表示一个本来要返回数值却为返回数值的情况(容错)。例如, 就会返回 NaN。
有两个特点:
任何涉及 NaN 的操作都会返回 NaN。
NaN 与任何值 都不相等,包括 NaN 本身, 返回 。
所以,就有了isNaN() 函数, 来确定这个参数是否为 NaN:
同样也适用于 Object 类型,首先调用对象的 ,确定是否可以转换为数值,如果不能会再次调用 来判断返回值。
数值转换
可以通过 、、 将非数值转换为数值。
转换规则
Boolean 值 -> true:1;false:0;
null -> 返回零
undefined -> 返回 NaN
字符串:
只包含数字:返回十进制数,忽略前导零,例如 返回 11
有效浮点数: 返回对应的浮点数
有效十六进制:返回 相同大小的十进制整数值
空字符串:返回 0
其他的格式:返回 NaN
对象格式:首先调用对象的 ,确定是否可以转换为数值,如果不能会再次调用 来判断返回值。
我们来看几个例子:
因为 转换规则十分复杂而且不太合理,所以出现了 。
转换规则
忽略前置空格字符,找到第一个有效字符,不是数字或-,直接返回 NaN
如果是有效字符,则继续解析后续直至遇到非数字字符。
可识别字符串中 十进制、十六进制和八进制,八进制识别在 ES5 中被废弃。
依然,我们看几个例子:
为了解决进制转换混乱的问题,可以添加第二个参数来指定转换的进制,例如
建议,在转换时都指定进制,以保证结果正确。
转换规则
与 类似,不过有几点不同的地方:
字符串中只有 第一个小数点有效
始终忽略前导的零
十六进制数 永远返回 0
直解析十进制的有效数,所以不能指定转换进制
可以解析 科学计数法 表示的数
OK,为了加深印象,我们还是再来写几个例子:
String
String 类型用来定义字符串。以 "" 或 '' 来表示。String 类型支持转义序列。
转换为字符串
有两种方式: 和
返回相应值的字符串表现。Number、Boolean、Object、String 类型都有toString()方法。需要注意的是 null 和 undefined 是没有这个方法的。
输出 二/八/十六进制
一般情况下, 方法不必传递参数。但是对于Number对象我们可以通过传入输出数值的基数,来更改返回值的进制,举个例子:
在不知道转换的值是否为 null 或 undefined 时,使用 会造成异常。所以,就有了
可以将任何类型的值转换为字符串。规则如下:
如果值有 则会调用该方法并返回结果
如果值为 null,返回 'null'
如果值为 undefined,返回 'undefined'
还是来举几个例子:
Object
ES 中的对象就是一组数据和功能的集合。和 Java 一样,Object 类型是所有他的实例的基础。
Object 具有的属性与方法,同样他存在于所有的对象和实例中。
Constructor:用于创建当前对象的函数。
hasOwnProperty(proertyName): 用于检查给定的属性在当前的对象实例中是否存在。proertyName为 String 类型。
isPrototypeOf(object): 用于检查传入的对象是否为另一个对象的原型。
propertyIsEnumerable(proertyName): 检查给定的属性是否能够使用 for-in 语句来枚举。
toLocaleString(): 返回对象的字符串表示,该字符串与执行环境的地区对应。
toString(): 这个在上文有介绍哈,返回对象的字符串表示。
valueOf(): 返回对象的String、Number 或 Boolean 表示。通常和 toString() 返回值相同。
Symbol 类型
Symbol 类型是ES6 引入的一种新的原始数据类型。通过 声明的类型表示一种独一无二的值。这里我简单介绍一下Symbol类型,预先介绍一下,下一个系列 会计划 去介绍 ES6 中的一些特性,那时会专门开一篇文章,去详细介绍 symbol 类型。
类型定义:
因为 Symbol 类型,表示独一无二的值,所以,symbol 的变量互不相等。这里先简要介绍一下哈,更多的解析 会在下一个系列放出~~~
领取专属 10元无门槛券
私享最新 技术干货