数据类型

133 阅读6分钟

数据类型

JavaScript 是一种弱类型或者说是动态语言。意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。意味着你可以用一个变量保存不同的数据。

最新的 ECMAScript 标准定义了 8种数据类型,顺便做一下 typeof 的结果:

  • 7种原始类型
    • undefined:typeof instance === ’undefined'
    • null:typeof instance === ’object‘ // 特别注意
    • Boolean:typeof instance === ’boolean'
    • Number:typeof instance === 'number'
    • String:typeof instance === 'string'
    • bigInt:typeof instance === 'bigint'
    • Symbol:typeof instance === 'symbol'
  • Object:typeof instance === 'object'

下面会一一讲解;

先说一下 typeof,

typeof 操作符唯一的目的就是检查数据类型,但是如果该数据是从 Object 派生出来的,typeof 总是会得到 object

typeof 123 // 'number'
typeof new Number(123) // 'object'typeof '123' // 'string'
typeof new String('123') // 'object'

还有一个 null,

为啥 typeof null 等于 object 呢,下面会讲到。

后续章节会告诉你们怎么去检查数据类型

原始值

Undefined 类型

undefined 代表该变量声明了但未初始化;

let message; //等同于 let message = undefined;

undefined 值的变量跟未定义的变量是有区别的。

let message;
// let age;
console.log(message) // undefined
console.log(age) // 报错

但是使用 typeof 又会让人看不懂

console.log(typeof message); // undefined
console.log(typeof age); // undefined

无论是未声明和声明,typeof 返回的变量都是 undefined。

Null 类型

null 是原始类型,那为啥 typeof null 是 object,

这个在 你不知道的javascript上卷 103页 写到

在 JavaScript 中 二进制前三位都为 0 的话会被判断为 object 类型,null 的二进制表示全0,自然前三位也是 0,所以执行 typeof 时会返回 “object”。

所以这就是一个 bug。

当然后续有提案说把这 bug 修正,但是被拒绝了。

Boolean 类型

true 和 false

能转换成 false 的值,

  • 0
  • ”“(空字符串)
  • false
  • undefined
  • null
  • NaN

Number 类型

Number 类型使用 IEEE 754格式表示整数和浮点值(在某些语言中也叫双精度值)

  • 十进制:55
  • 八进制(第一个数必须是零(ECMAScript 2015 或 ES6 中的八进制的前缀是 0o),后面是 0~7):070 // 56
  • 十六进制(前缀为 0x,后面是09 AF):0xA // 10

使用八进制和十六进制格式创建的数值在所有数学操作中都被视为十进制数值。

浮点值

要定义浮点值,数值中必须包含小数点,而且小数点后面必须至少有一个数字。

因为存储浮点值使用的内存空间是存储整数数值的两倍,所以 ECMAScript总是想方设法把值转换为整数。在小数点后面没有数字的情况下,或者后面跟着 0,它会被转换为整数。

非常大或者非常小的数值,会用科学计数法来表示。

浮点值的精确度最高可达 17 位小数,但在算术计算中远不如整数精确

0.1 + 0.2 // 0.300 000 000 000 000 04

永远不要拿小数来做计算

数值精度

根据 IEEE 754,64 个二进制位,从最左边开始

  • 第1位:符号位,0 表正数,1 表负数
  • 第2位到第12位(11位):指数部分
  • 第13位到第64位(52位):小数部分(即有效数字)

64 = 1 + 11 + 52;

指数部分 11 位,那指数的值的范围在,0~2047

IEEE 754 标准还规定了,如果指数的值在 0-2047之间,小数部分默认第一个值为 1,但不保存在 64 位浮点数中,所以小数位为 53 位

那小数部分 53位,那小数的范围在,-2^53~2^53;(我觉得这里默认第一个值为 1 了,所以我觉得范围都要 -1,应该是 -(2^53 - 1) 到 2^53 - 1

超出小数范围的,整数运算的结果开始出现错误,大于 2^53 的,多出来的有效数字都会变成 0。

值的范围

双精度 64 位二进制的值(精度范围在 -(2^53 - 1) 到 2^53 - 1)(数值范围在 2^1024 到 2^-1023

超出的值会,等到 Infinity(正无穷) 或 -Infinity(负无穷)

这里太恶心,赶紧做个小结

  • 64位,1(符号,0正1负)+11(指数)+52(小数)
  • 因为 754,指数位为 0~2047之间,就会小数就会多一位 1,所以精度范围 (-(2^53 - 1) 到 2^53 - 1)
  • 别用小数操作运算

BigInt 类型

BigInt类型是 JavaScript 中的一个基础的数值类型,可以用任意精度表示整数。使用 BigInt,您可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。BigInt 是通过在整数末尾附加 n或调用构造函数来创建的。

这里没怎么用过

String 类型

字符串的特点

ECMAScript 中的字符串是不可变的,一旦创建,它们的值就不能变了。要修改,只能销毁原始的字符串,在将新值放进去。

let lang = 'java';
lang = lang + 'script';
// 销毁再创建

转换为字符串

toString() 和 String();

toString:

基本所有值都有 toString() 方法。返回当前值的字符串等价物。 null 和 undefined 值没有 toStrin() 方法。

String:

String()函数遵循如下规则。

  • 如果值有 toString()方法,则调用该方法(不传参数)并返回结果。
  • 如果值是 null,返回"null"。
  • 如果值是 undefined,返回"undefined"。

字符串与数组

字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符

var s = 'hello';
s[1] //'e'

但是,不能改变或删除

var s = 'hello';
​
delete s[0];
s // "hello"
​
s[1] = 'a';
s // "hello"
​
s[5] = '!';
s // "hello"

Symbol 类型

Symbol(符号)是 ECMAScript 6 新增的数据类型。符号是原始值,且符号实例是唯一、不可变的。 符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。

给对象定义 [Symbol.iterator] 迭代器,就可以被for...of循环,这个后面再写。

写到这里,我就想是不是将属性和方法都写上去呢。

我想这篇只是个大概介绍的样子吧。

Object 类型

ECMAScript 中的对象其实就是一组数据和功能的集合。对象通过 new 操作符后跟对象类型的名称 来创建。开发者可以通过创建 Object 类型的实例来创建自己的对象,然后再给对象添加属性和方法。

我下次应该不会写这种文章,有点枯燥和繁琐,我自己都不能提出兴趣来看。