JS 数据类型
一、数据类型
- 数字 Number
- 字符换 String
- 布尔 Bool
- 符号 Symbol
- 空 Undefined
- 空 Null
- 对象Object
前6种属于简单数据类型(也称为原始类型): Undefined、 Null、 Boolean、 Number、String 和 Symbol。
Object(对象)属于复杂数据类型,Object 是一种无序名值对的集合。
2020 年 6 月 JS 新增了一种类型:bigint
总结:四基两空一对象
数组、函数、日期 都属于object。
1.Number
写法:
let a = 1; //整数写法
let b = 3.14; //小数写法
let c = 123e4; //科学计数法
/*
0123、 0x3F、 0b11 进制写法用得少
*/
特殊值:
- 正0和负0
>1/0
<Infinity
>1/+0
<Infinity
>1/-0
<-Infinity
- 无穷大 Infinity/-Infinity
- 无法表示的数字 NaN(Not a number)
**用于表示本来要返回数值的操作失败了(而不是抛出错误) **
NaN === NaN //false
/*
可以理解为一个你不知道的数字和另一个你不知道的数组无法比较
*/
2.String(UTF-8定长2字节)
String(字符串)数据类型表示零或多个 16 位 Unicode 字符序列。字符串可以使用双引号( ")、单引号( ')或反引号( `)标示,因此下面的代码都是合法的:
写法:
let firstName = "John";
let lastName = 'Jacob';
let lastName = `Jingleheimerschmidt`
转义:
let s1 = 'it's ok' //错误写法
let s2 = 'it\'s ok' //转义
let s3 = "it's ok" //双引包括
let s4 = `it's ok` //反单引包括
\' 表示 '
\" 表示 "
\n 表示换行
\r 表示回车
\t 表示 tab 制表符
\\ 表示 \
\uFFFF 表示对应的 Unicode 字符
\xFF 表示前 256 个 Unicode 字符
多行字符串
let s = `这样是
可以的
用反引号很容易做到`
字符串的属性
- string.length
'123'.length // 3
'\n\r\t'.length // ?---->3
''.length // 0
' '.length // 1
- string[index]
let s = 'hello';
s[0] // "h"
s[4] // 'o'
s[5] // undefined
注意: index 从 0 开始,s[5]不报错但是后面的值均为undefined。
3.Boolean
特点
- 有两个字面值: true 和 false。
- 这两个布尔值不同于数值,因此 **true 不等于 1, false 不等于 0。 **
Boolean()转型函数
虽然布尔值只有两个,但所有其他 ECMAScript 类型的值都有相应布尔值的等价形式。要将一个其他类型的值转换为布尔值,可以调用特定的**Boolean()转型函数: **
let message = "Hello world!";
let messageAsBoolean = Boolean(message);
| 数据类型 | true | false |
|---|---|---|
| Boolean | true | false |
| Number | 非零数值(包括无穷值) | 0、 NaN |
| String | 非空字符串 | ""(空字符串) |
| Undefined | N/A(不存在) | undefined |
| Object | 任意对象 | null |
自动转型
理解以上转换非常重要,因为像 if 等流控制语句会自动执行其他类型值到布尔值的转换,例如:
let message = "Hello world!";
if (message) {
console.log("Value is true");
}
五个falsy值要牢记:
- 0/NaN '' undefined null
- 注意空字符串和空格字符的区别
let s1 = ''; //空字符串
let s2 = ' '; //空格字符
运算符得到bool
-
否定运算
!value -
相等运算
3 === 43 !== 4 -
比较运算
1>23<4
4.Symbol(略)
5.Undefined 和 Null(两空)
Undifined
- Undefined 类型只有一个值,就是特殊值 undefined。
- 当使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值:
let message;
console.log(message == undefined); // true
-
一般来说,**永远不用显式地给某个变量设置 undefined 值。 增加这个特殊值的目的就是为了正式明确空对象指针( null)和未初始化变量的区别。 **
-
包含 undefined 值的变量跟未定义变量是有区别的
Null
-
Null 类型同样只有一个值,即特殊值 null。
-
逻辑上讲, null 值表示一个空对象指针,这也是给typeof 传一个 null 会返回"object"的原因:
let car = null;
console.log(typeof car); // "object"
- 在定义将来要保存对象值的变量时,建议使用 null 来初始化,不要使用其他值。这样,只要检查这个变量的值是不是 null 就可以知道这个变量是否在后来被重新赋予了一个对象的引用,比如:
if (car != null) {
// car 是一个对象的引用
}
区别
-
没本质区别
-
细节一:如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null
-
细节二:如果一个**函数,没有写 return,那么默认 return undefined,**而不是 null
-
细节三:前端程序员习惯上,把非对象的空值写为 undefined(但是不必显示设置),把对象的空值写为 null
二、变量声明
let
- 块作用域
- 不允许冗余声明
- 暂时性死区(没有变量提升)
- 声明全局变量时不会成为 window 的属性
var 与 let 相反,但是为了兼容以前的程序
在升级js版本的时候,保留了var,这跟python3
的做法截然不同。
const
-
用来声明常量
-
声明时必须初始化
-
const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象,那么修改这个对象内部的属性并不违反 const 的限制。
三、类型转化
1.number => string
- n + ' '
- String(n)
2.string => number
- s - 0
- Number(s)
- ParseInt(s) / ParseFloat(s)
3.其他类型 => bool
- Boolean(x)转型函数
- !!x
4.bool => string
- String(x)
- x.toString