JS 数据类型

239 阅读2分钟

JS 数据类型

一、数据类型

  • 数字 Number
  • 字符换 String
  • 布尔 Bool
  • 符号 Symbol
  • 空 Undefined
  • 空 Null
  • 对象Object
6种属于简单数据类型(也称为原始类型): UndefinedNullBooleanNumberStringSymbol
 Object(对象)属于复杂数据类型,Object 是一种无序名值对的集合。
20206 月 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 表示前 256Unicode 字符

多行字符串

let s = `这样是
可以的
用反引号很容易做到`

字符串的属性

  1. string.length
'123'.length // 3
'\n\r\t'.length // ?---->3
''.length // 0
' '.length // 1

  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);
数据类型truefalse
Booleantruefalse
Number非零数值(包括无穷值)0、 NaN
String非空字符串""(空字符串)
UndefinedN/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 === 4 3 !== 4

  • 比较运算 1>2 3<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 的属性
varlet 相反,但是为了兼容以前的程序
在升级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