引入
问题一. 数据为什么需要类型?
问题二. 都是一,问什么要分 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。
undefinednullfalse0NaN""或''(空字符串)
除了上面这六个值是假的,其他所有值都是真的,包括数组、函数、对象等。
这六个值中,将 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"