引入
问题一. 数据为什么需要类型?
问题二. 都是一,问什么要分 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 位浮点数形式储存,即使整数也是如此。所以,
1
与1.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
""
或''
(空字符串)
除了上面这六个值是假的,其他所有值都是真的,包括数组、函数、对象等。
这六个值中,将 undefined
、null
、0
、NaN
、''
称为 falsy
值,falsy
指相当于 false
但是又不是 false
的值。
null 和 undefined
null
和 undefined
都是空类型,其实它们没有本质区别,但是需要注意几个细节:
- 如果一个变量声明了,但没有赋值,那么默认值就是
undefined
,而不是null
。 - 如果一个函数,没有写
return
,那么默认return undefined
,而不是null
。 - 前端程序员习惯上,把非对象的空值写为
undefined
,把对象的空值写为null
,但仅仅是习惯上而已。
symbol 符号
Symbol
是不怎么常用的数据类型,Symbol
可以生成一个全局唯一的值。
类型转换
number 转为 string
- String(n)
- n + ''(空字符串)
let n = 1
String(n) //"1"
n + '' //"1"
string 转为 number
- Number(s)
- parseInt(s) / parseFloat(s)
- s - 0
let s = '123'
Number(s) //123
parseInt(s) //123
s - 0 //123
+s //123
把任何东西转为 string
- String(x)
- 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"