持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
js的语言类型其实指的就是js的数据类型。根据最新的ECMAScript 标准定义了 8 种数据类型,其中包括七种基本数据类型和对象。下面就会详细介绍这些数据类型。
基本数据类型
1. 布尔值(Boolean)
有两个值,分别是true和false。
2. 字符串(String)
字符串是一串表示文本值的字符序列。它是一组16位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引是0,下一个索引是1。字符串的长度是它的元素的数量。
JavaScript的字符串是不可更改的,但是可以基于对原始字符串的操作来创建新的字符串。
- 获取一个字符串的子串可通过选择个别字母或者使用String.substr();
- 两个字符串的连接使用连接运算符(+)或者String.concat();
3. 数字 (Number)
数字类型是一种基于IEEE754标准的双精度64位二进制格式的值(从-(2^53-1)到2^53-1之间的数字)。除了整数或者浮点数之外,还可以表示+Infinity、-Infinity和NaN。
3.1 校验数字是否大于或小于无穷
正无穷可以使用Number.MAX_VALUE表示,负无穷可以使用Number.MIN_VALUE表示。一般用做判断中进行比较。
if (num1 * num2 <= Number.MAX_VALUE) {
...
}
3.2 0的特殊表示方法
在使用数字型表示变量时,+、-是用来区分数字的正负类型的。只有一个数字例外,那就是0,0可以用0,+0,-0表示都可,它们都表示同样的值,在逻辑上是全等关系。
+0 === -0; // true
4. null
一个表明null值的特殊关键字,表示缺少的标识,指变量没有指向任何对象。JavaScript是大小写敏感的,因此null与Null、NULL或变体完全不同。
4.1 null和undefined的区别
foo不存在,因为它从来没有被定义过或者初始化过
foo; // "ReferenceError: foo is not defined"
foo已经存在,但是它没有类型或者值
var foo = null;
foo; // null
当检测null或者undefined时需要注意相等和全等两个操作符的区别。null会执行类型转换
typeof null; // 'object'
typeof undefined; // 'undefined'
null === undefined; // false
null == undefined; // true
null === null; // true
null == null; // true
!null; // true
isNaN(1 + null); // false
isNaN(1 + undefined); // true
5. undefined
和null一样是一个特殊的关键字,undefined表示变量未赋值时的属性。一个没有被赋值的变量的类型是undefined。如果方法或者语句中操作的变量没有被赋值,则会返回undefined
5.1 undefined的场景
没有被赋值的变量的类型
a; // undefined
函数没有使用return语句指定返回值
function test(a) {
console.log(a);
}
test(); // undefined
5.2 严格相等和undefined
一般使用undefined和严格相等或不相等操作符来决定一个变量是否拥有值。
var x;
if (x === undefined) {
// 执行这些语句
} else {
// 这些语句不会被执行
}
这里是必须使用严格相等操作符,因为x==undefined会检查x是不是null, 如果是null也会返回true。但是严格相等不会检查。
5.3 typeof操作符和undefined
var x;
if (typeof x === 'undefined') {
// 执行这些语句
}
// 这里没有声明y
if (typeof y === 'undefined') { // 没有错误,执行结果为true
console.log('y is' + typeof y); // y is undefined
}
if(y === undefined) { // ReferenceError: y is not defined
}
建议在开发的时候尽量避免使用typeof和undefined。
5.4 Void操作符和undefined
var x;
if (x === void 0) {
// 执行这些语句
}
// 没有声明y
if (y === void 0) {
// 抛出一个RenferenceError 错误 (与`typeof`相比)
}
这种方式可以避免上面那种typeof不能区分是否定义的问题。
6. 代表(symbol)
这个是es6中新增的类型。一种实例是唯一且不可改变的数据类型。
Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它支持语法"new Symbol()"
6.1 语法
Symbol([description]);
description是可选的,字符串类型,作为对symbol的描述。
const sym1 = Symbol();
const sym2 = Symbol('foo');
const sym3 = Symbol('foo');
sym2 == sym3; // false
使用上述方法创建的是一个symbol值而不是一个Symbol对象。
const sym = Symbol('foo');
typeof sym; // 'symbol'
const symObj = Object(sym);
typeof symObj; // 'object'
7. 任意精度的整数(BigInt)
可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。
7.1 创建方式
BigInt是通过在整数末尾附加字母n或调用构造函数来创建。
// 构造函数
const bigNum = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
// 直接使用BigInt
const bigVal = BigInt(10); // 10n
// 末尾附加n
const y = 20n; // 20n
特别说明:BigInt只能定义整数类型,如果定义其他类型的话会报错。
7.2 BigInt使用运算符
可以对BigInt使用运算符+、-、*、/、%、**,类似于数字(严格意义上将并不等于数字),但是这些运算只能用于BigInt类型的数据之间,也就是说不能用于BigInt和其他类型的数据之间,否则会报错TypeError。
const bigVal = BigInt(10);
const y = 20n;
bigVal + y; // 30n
bigVal - y; // -10n
bigVal * y; // 200n
bigVal / y; // 0n
bigVal % y; // 10n
bigVal ** y; // 100000000000000000000n
7.3 BigInt转换为Boolean
在将BigInt转换为Boolean时(例如:if、||、&&、Boolean 和!),它的行为类似于一个数字。
const y = 20n;
y || false; // 20n
y && false; // false
Boolean(y); // true
!y; // false
对象
对象是指内存中的可以被标识符引用的一块区域。
1. 属性
在JavaScript中,对象可以被看作是一组属性的集合。用对象字面量语法来定义一个对象时,会自动初始化一组属性。而后,这些属性还可以被添加和移除。属性的值可以是任何类型的值。包括其他对象。属性用键(key)来标识,它的键值可以是一个字符串或者符号值。
对象拥有两种属性:数据属性和访问器属性
1.1 数据属性
数据属性是键值对,并且每个数据属性拥有以下几个特性:
| 特性 | 数据类型 | 描述 | 默认值 |
|---|---|---|---|
| [[Value]] | 任何JavaScript类型 | 包含这个属性的数据值 | undefined |
| [[Writable]] | Boolean | 如果该属性的特性不能被修改 | false |
| [[Enumerable]] | Boolean | 如果该值为true,则该值可以用for...in循环来枚举 | false |
| [[Configurable]] | Boolean | 如果该值为false, 则该属性不能被删除(对于访问器属性则不能被修改), 并且除了[[Value]]和[[Writable]]以外的属性都不能被修改 | false |
| Read-only | Boolean | ES5[[Writable]]属性的反状态 | |
| DontEnum | Boolean | ES5[[Enumerable]]属性的反状态 | |
| DontDelete | Boolean | ES5[[Configurable]]属性的反状态 |
1.2 访问器属性
访问器属性有一个或者两个访问器函数(get和set)来存取数值。 特别说明: 在类里面有一个访问器方法,在这里是访问器属性。我们可以将函数作为值赋给JavaScript对象的访问器使得对象表现得像一个类,但是它仍然不会是一个类。
访问器属性具有以下特性:
| 特性 | 类型 | 描述 | 默认值 |
|---|---|---|---|
| [[Get]] | 函数对象或者undefined | 该函数使用一个空的参数列表,用于在有权访问的情况下读取属性值。 | undefined |
| [[Set]] | 函数对象或者undefined | 该函数有一个参数,用于在有权访问的情况下写入属性值 | undefined |
| [[Enumerable]] | Boolean | 如果该值为true,则该属性可以用for...in循环来枚举 | false |
| [[Configurable]] | Boolean | 如果该值为false, 则该属性不能被删除,且不能被转变成数据属性 | false |