JavaScript简单数据类型学习笔记

91 阅读2分钟

JS中的数据类型

8种

number, string, bool, symbol, bigint, undefined, null, object

数组、函数、日期不是数据类型,属于object

number

写法

整数、小数、科学计数法1.23e4、八进制(0|00|0o开头)、16进制(0x或0X)、2进制(0b或0B)

特殊值

正0和负0

都是0

无穷大

Infinity +Infinity -Infinity

无法表示的数字

NaN

但NaN仍然是一个数字

0/0 => NaN

NaN != NaN

64位浮点数

js数字的存储形式

浮点就是浮动的点,意思就是小数点会乱动

123.456 可以表示为 1.23456e10^2

也可以表示为 12345.6e10^-2

64位存储一个number

正负号占1位, 指数占11位(-1023~+1024), 有效数字占52位(开头的1省略)

范围和精度

范围 指数拉满, 有效数字拉满, 得到最大二进制数字; 指数负方向拉满, 有效数字最小1, 得到最小值

Number.MAX_VALUE Number.MIN_VALUE

精度 (有效数字)

最多只能到52+1个二进制位表示有效数字, 2^53 对应的十进制是 9 后面 15 个零, 所以15位有效数字都能精确表示

16位有效数字如果小于 90 开头,也能精确表示

9110000000000001 就存不下来

string

每个字符两个字节(阉割版UTF-8)

写法

单引号, 双引号, 反引号

注意: 引号不属于字符串的一部分, 如果要在单引号里面包含单引号, 就需要用到转义

转义

'It's ok' JS引擎会认为'it'就结束了

正确写法: 'It's ok' 或 "It's ok" 或 `It's ok`

\' 表示 '
\" 表示 "
\n 表示换行
\r 表示回车
\t 表示 tab 制表符
\\ 表示 \
\uFFFF 表示对应的 Unicode 字符
\xFF 表示前 256Unicode 字符

多行字符串

反引号

字符串的属性

后续讲

字符串的长度

string.length

'123'.length // 3
'\n\r\t'.length // 3
'\\\\\\'.length // 3
''.length // 0
' '.length // 1

通过下标读取字符

string[index] index从0到length

string[length] // undefined 不会报错

base64转码

window.btoa 正常字符串转为Base64编码的字符串

window.atob Base64编码的字符串转为原来的字符串

boolean

true和false

一些运算会得到bool值

否定运算 !value

相等运算 1 == 2、1 != 2、3 === 4、3 !== 4

比较运算 1 > 2、1 >= 2、3 < 4、3 <= 4

if 配 bool

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

5个falsy值

undefined null 0 NaN ''

两种空类型 undefined null

没有本质区别

细节一: 如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null

细节二: 如果一个函数,没有写 return,那么默认 return undefined,而不是 null

细节三: 前端程序员习惯上,把非对象的空值写为 undefined,把对象的空值写为 null 但仅仅是习惯上而已

变量声明

指定值

var a = 1

同时也指定了类型

var a = 1

但是值和类型都可以随意变化

a = 2

a = '字符串'

三种声明方式

var a = 1

let a = 1

const a = 1

a = 1

区别

var 是过时的、不好用的方式

let 是新的,更合理的方式

const 是声明时必须赋值,且不能再改的方式

最后这种方式是错误的,不准这样声明

var方式

代码不要用var

var变量提升 wangdoc.com/javascript/…

let方式

规则

  1. 遵循块作用域,即 使用范围不能超出 { }
{
    let b = 1
    console.log(b)
}

console.log(b)
// 1
// Uncaught ReferenceError: b is not defined
  1. 不能重复声明
let a = 1
let a = 2
// Uncaught SyntaxError: Identifier 'a' has already been declared
  1. 可以赋值,也可以不赋值

  2. 必须先声明再使用,否则报错

{
    console.log(b)
    let b = 1
}
// Uncaught ReferenceError: Cannot access 'b' before initialization
  1. 全局声明的 let 变量,不会变成 window 的属性
var abc = 'abc'
console.log(window.abc)
// abc

let abc = 'abc'
console.log(window.abc)
// undefined
  1. for 循环配合 let 有奇效

var

let

const方式

常量(只读变量)

声明时就要赋值,赋值后不能改

类型转换

number => string

String(n)

n + ''

string => number

Number(s)

parseInt(s) / parseFloat(s)

s - 0

x => bool

Boolean(x)

!!x

!!1
// true
!!0
// false

x => string

String(x)

x.toString()

1.toString() 
// Uncaught SyntaxError: Invalid or unexpected token
// js认为1.后面需要加数字
(1).toString()
1..toString()