JavaScript 数据类型

660 阅读5分钟

引入

问题一. 数据为什么需要类型?

问题二. 都是一,问什么要分 1 和 '1' ?

以数字和字符串为例来比较一下,他们的区别是:

1. 功能不同

  • 数字是数字,字符串是字符串,要严谨
  • 数字能加减乘除,字符串不能
  • 字符串能表示电话号码,数字不行

2. 存储形式不同

  • JS 中,数字是用 64 位浮点数的形式存储
  • JS 中,字符串是用类似 UTF-8 的形式存储(UCS-2)

JS 中的数据类型

JS 中的数据类型共有七种:数字 number、字符串 string、布尔 bool、符号 symbol、空 undefined、空 null、对象 object

总结:四基两空一对象

注意:

  • 数组、函数、日期不是数据类型,他们都属于 object
  • number、string、bool、symbol、null、undefined 这六种类型(大小写无所谓)都是简单类型,只有 object 是复杂类型

数字 number

JavaScript 内部,所有数字都是以 64 位浮点数形式储存,即使整数也是如此。所以,11.0是相同的,是同一个数。

  • 整数写法 1
  • 小数写法 0.1
  • 科学计数法 1.23e4(1.23*10^4)
  • 八进制写法(用的少) 0123 / 00123 / 0o123
  • 十六进制写法 0x3F / 0X3F
  • 二进制写法 0b11 / 0B11

特殊值

1. 正 0 和负 0

+0-0 都等于 0 ,但是它们是不一样的,区别就是 64 位浮点数表示法的符号位不同。它们是等价的:

-0 === +0 // true
0 === -0  // true
0 === +0  // true

2. 无穷大

Infinity+Infinity-Infinity

1 / 0    // Infinity 正无穷
1 / +0   // Infinity
1 / -0   //-Infinity 负无穷

3. NaN

NaN 是一个数字,指无法表示的数字

0 除以 0,会得到 NaN

0 / 0   // NaN

NaN不等于任何值,包括它本身。

NaN === NaN    // false

字符串 string

  • 单引号 '你好'
  • 双引号 "你好"
  • 反引号 `你好`

每个字符两个字节,注意,引号不属于字符串的一部分,就像书名号不属于书名一样。

1. 转义符

反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。

在单引号里面包含单引号的错误写法:

'It's ok'  //JS 引擎会认为 'It' 就结束了,后面的看不懂

正确写法:

'It\'s ok'  //单引号
"It\'s ok"  //双引号
`It's ok`   //反引号

需要用反斜杠转义的特殊字符,主要有下面这些。

  • \' 表示 单引号
  • \" 表示 双引号
  • \n 表示 换行符
  • \r 表示 回车键
  • \t 表示 tab 制表符
  • \\ 表示 \
  • \uFFFF 表示 对应的 Unicode 字符
  • \xFF 表示 前256个 Unicode 字符
'\u4f60'  //"你"
'\x31'  //"1"

2. 多行字符串

字符串默认只能写在一行内,分成多行将会报错。

let longString = 'Long
long
long
string ';  
//SyntaxError: Invalid or unexpected token

用反引号很容易做到在字符串里回车。

let longString = `Long
long
long
string`;

以前没有反引号时的做法,写起来很麻烦,可以看看网道教程

3. 字符串的属性

  • 长度 string.length
'123'.length     //3
'\n\r\t'.length  //3
'\\\\\\'.length  //3(三个转义符)
''.length        //空字符串,长度为 0
' '.length       //空格字符串,长度为 1

注意 '' 是空字符串,' ' 是空格字符串,两者是不一样的。

  • 下标 string[index] index 从 0 开始,string[0] 是第一个字符。
let s = 'hello'
s[0] //'h'
s[4] //'o'
s[5] //undefined,不会报错

4. name 和 'name' 的区别

name 是变量,值可变,可能是'name',也可能是'hello'

let name = 1
name = 2  //2
name = 'hello'  //"hello"

'name' 是字符串常量,常量就是不变量,'name' 只能是 'name', 不能是其他值。

布尔 boolean

布尔值只有两个值: true/false,注意大小写。

下列运算符会得到 bool 值:

  • 否定运算: !value
  • 相等运算:1 == 2(false)、1 != 2(true)、3 === 4(false)、3 !== 4(true)
  • 比较运算:1 > 2(false)、1 >= 2(false)、3 < 4(true)、3 <= 4(true)

五个 falsy 值

if 语句常常需要判断真假:

if(value) {...} else {...}

如果 value 不是 bool 值时该如何判断?此时 value 值将自动转为布尔值,转换规则是除了下面六个值被转为false,其他值都视为true

  • undefined
  • null
  • false
  • 0
  • NaN
  • ""''(空字符串)

除了上面这六个值是假的,其他所有值都是真的,包括数组、函数、对象等。

这六个值中,将 undefinednull0NaN'' 称为 falsy 值,falsy 指相当于 false 但是又不是 false 的值。

null 和 undefined

nullundefined 都是空类型,其实它们没有本质区别,但是需要注意几个细节:

  1. 如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null
  2. 如果一个函数,没有写 return,那么默认 return undefined,而不是 null
  3. 前端程序员习惯上,把非对象的空值写为 undefined,把对象的空值写为 null,但仅仅是习惯上而已。

symbol 符号

Symbol 是不怎么常用的数据类型,Symbol 可以生成一个全局唯一的值。

推荐阅读:「每日一题」JS 中的 Symbol 是什么?

类型转换

number 转为 string

  1. String(n)
  2. n + ''(空字符串)
let n = 1
String(n) //"1"
n + ''    //"1"

string 转为 number

  1. Number(s)
  2. parseInt(s) / parseFloat(s)
  3. s - 0
let s = '123'
Number(s)   //123
parseInt(s) //123
s - 0       //123
+s          //123

把任何东西转为 string

  1. String(x)
  2. x.toString()
true.toString()  //"true"
false.toString()  //"false"

使用 toString()1 转换为字符串 '1' 的错误写法:

1.toString()  //SyntaxError: Invalid or unexpected token

JavaScript 会认为小数点后面是数字,所以会报错,JavaScript 秘密花园中有相关介绍。正确写法是:

(1).toString()  //"1"
1..toString()   //"1"
1 .toString()   //"1"

相关链接

「每日一题」JS 中的 Symbol 是什么?

网道 JavaScript 教程

JavaScript 秘密花园