本文系总结作业,部分参考内容在
这里
在 JavaScript 规范中,共定义了6+1,七种数据类型,分为6种原始类型和对象。接下来我们分类讨论一下。
6种原始类型
1. String
String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。
- JavaScript的字符串类型用于表示文本数据。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。
- 在JavaScript中的字符串需要使用单引号或双引号括起来,表示该值是一个字符串。
- 字符串不可更改,但可基于原始字符串操作创建新的字符串。常用操作方法有:
- 字符操作:charAt,charCodeAt,fromCharCode
- 字符串提取:substr,substring ,slice
- 位置索引:indexOf ,lastIndexOf
- 大小写转换:toLowerCase,toUpperCase
- 模式匹配:match,search,replace,split
- 其他操作:concat,trim,localeCompare
2. Number
数字类型。在JavaScript里,数字类型能够代表的范围是 -(2的63次方-1) ~ (2的63次方-1) 。
- JavaScript 提供了几个特殊数值,用于判断数字的边界和其他特性 。如下所示:
- Number.MAX_VALUE:JavaScript 中的最大值
- Number.MIN_VALUE:JavaScript 中的最小值
- Number.MAX_SAFE_INTEGER:最大安全整数,为 253-1
- Number.MIN_SAFE_INTEGER:最小安全整数,为 -(253-1)
- Number.POSITIVE_INFINITY:对应 Infinity,代表正无穷
- Number.NEGATIVE_INFINITY:对应 -Infinity,代表负无穷
- Number.EPSILON:是一个极小的值,用于检测计算结果是否在误差范围内
- Number.NaN:表示非数字,NaN与任何值都不相等,包括NaN本身
- Infinity:表示无穷大,分 正无穷 Infinity 和 负无穷 -Infinity
- 有 3 个函数可以把非数值转换为数值,如下:
Number(value)
parseInt(string [, radix])
parseFloat(string)
Number() 可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。
对于字符串而言,Number() 只能对字符串进行整体转换,而 parseInt() 和parseFloat() 可以对字符串进行部分转换,即只转换第一个无效字符之前的字符。
3. Boolean
布尔类型。Boolean 类型只有两个字面值:true 和 false 。 在 JavaScript 中,所有类型的值都可以转化为与 Boolean 等价的值 。转化规则如下:
- 所有对象都被当作 true
- 空字符串被当作 false
- null 和 undefined 被当作 false
- 数字 0 和 NaN 被当作 false
4. Undefined
一个没有被赋值的变量会有个默认值undefined。它的语义是,希望表示一个变量最原始的状态,而非人为操作的结果 。 这种原始状态会在以下 4 种场景中出现:
- 声明了一个变量,但没有赋值
var foo;
console.log(foo); //undefined
- 访问对象上不存在的属性
console.log(Object.foo); // undefined
var arr = [];
console.log(arr[0]); // undefined
访问 Object 对象上的 foo 属性,返回 undefined , 表示Object 上不存在或者没有定义名为 foo 的属性。数组中的元素在内部也属于对象属性,访问下标就等于访问这个属性,返回 undefined ,就表示数组中不存在这个元素。
- 函数定义了形参,但没有传递实参
// 函数定义了形参 a
function fn(a) {
console.log(a); //undefined
}
fn(); // 未传递实参
函数 fn 定义了形参 a, 但 fn 被调用时没有传递参数,因此,fn 运行时的参数 a 就是一个原始的、未被赋值的变量。
- 使用 void 对表达式求值
void 0 ; // undefined
void false; // undefined
void []; // undefined
void null; // undefined
void function fn(){} ; // undefined
5. Null
只有一个值:null,表示空值。
null 是原始数据类型 Null 中的唯一一个值,但 typeof 会将 null 误判为 Object 类型 。
typeof null == 'object'
在 JavaScript 中,数据类型在底层都是以二进制形式表示的,二进制的前三位为 0 会被 typeof 判定为对象类型,如下:
- 000 - 对象,数据是对象的应用
- 1 - 整型,数据是31位带符号整数
- 010 - 双精度类型,数据是双精度数字
- 100 - 字符串,数据是字符串
- 110 - 布尔类型,数据是布尔值
而 null 值的二进制表示全是 0 ,自然前三位当然也是 000,因此,typeof 会误以为是对象类型。如果想要知道 null 的真实数据类型,可以通过下面的方式来获取:
Object.prototype.toString.call(null) ; // [object Null]
6. Symbol
符号类型,唯一且不可修改。
Symbol 是 ES6 新增的一种原始数据类型 。在 ES6 之前,对象的属性名只能是字符串,这样会导致一个问题,当通过 mixin 模式为对象注入新属性的时候,就可能会和原来的属性名产生冲突 。而在 ES6 中,Symbol 类型也可以作为对象属性名,凡是属性名是 Symbol 类型的,就都是独一无二的,可以保证不会与其他属性名产生冲突。
Object类型
javascript 中对象(物体)的概念可以比照着现实生活中实实在在的物体来理解。一个对象可以是一个单独的拥有属性和类型的实体。
ECMA262 把对象定义为:无序属性的集合,其属性可以包含基本值、对象或者函数。
对象可以通过new操作符后跟要创建的对象类型的名称来创建。
var o = new Object();
也可以直接创建一个对象。
var person = { name: 'Bob', age: 20, gender: 'male' };