JS数据类型与运算

232 阅读6分钟

编程很简单,只有对和错两种情况

数据为什么需要类型?

数字与字符串

都是一,为什么要分 1 和'1'

功能不同

  • 数字是数字,字符串是字符串,要严谨
  • 数字能加减乘除,字符串不行
  • 字符串能表示电话号码,数字不行

存储形式不同

  • JS 中,数字是用 64 位浮点数的形式存储的
  • JS 中,字符串是用类似 UTF8 形式存储的(UCS-2)
  • 数字是变成二进制直接存的,字符是要经过编码再变成数字再存起来。字符串'1'最终存的是 49,数字 1 存的就是 1

JS 中的数据类型

7 种(大小写无所谓)

  • 数字 number
  • 字符串 string
  • 布尔 bool
  • 符号 symbol(用得很少,忘掉也没关系)
  • 空 undefined
  • 空 null
  • 对象 object
  • 总结:四基两空一对象

以下不是数据类型

  • 数组、函数、日期
  • 它们都属于 object

数字 number——64 位浮点数

特殊值

正 0 和负 0

  • 都等于 0,没区别,但只有一个时候有区别,1/0 得到 Infinity,1/-0 得到-Infinity

无穷大

  • Infinity、+Infinity、-Infinity

无法表示的数字

  • NaN(Not a Number)。比如 0/0,得到的是 NaN
  • 但它是一个数字。从历史角度来讲,人类在发明负数、分数、有理数、无理数之前,这些数字都是 NaN,所以,NaN 不是不是数字,而是我们不知道它是什么数字,全人类都不知道它是什么数字。
  • NaN==NaN,是 false。因为一个你不知道的数字和另一个你不知道的数字怎么相等

64 位浮点数

JS 数字的存储形式

  • 浮点就是浮动的点,意思就是小数点会乱动
  • 123.456 可以表示位 1.23456e10^2
  • 也可以表示为 12345.6e10^-2

64 位存储一个 number

  • 符号占 1 位(正数从 0 开始,负数从 1 开始,所以正存 0 负存 1)
  • 指数占 11 位(-1023~1024)
  • 有效数字占 52 位(开头的 1 省略)

字符串 string——每个字符两个字节(阉割版 UTF8)

写法

单引号

  • '你好'

双引号

  • "你好"

反引号

  • `你好`

注意

  • 引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
  • 如果要在单引号里面包含单引号,就需要用转义

转义

错误写法

  • 'it's ok'
  • JS 引擎会认为'it'就结束了,后面的看不懂

正确写法

  • 'it's ok'//这就是转义
  • "it's ok"
  • `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

注意:空字符串和空格字符串是不同的字符串,空和空格是两种不同的东西。严谨就可以学好 JS,一定要搞清楚,脑子不清楚是学不好 JS 的。

通过下标读取字符

string[index]

  • let s = 'hello';
  • s[0] // "h"

注意 index 从 0 开始

  • s[0]是第一个字符

注意 index 到 length

  • let s = 'hello';
  • s[5] // undefined,居然不报错
  • s[4] // 'o'

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 语句常常需要判断真假

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

问题来了

  • 如果 value 是 bool 值还好说
  • 如果 value 不是 bool 值咋办,谁真谁假
  • 1 是真还是假,0 是真还是假
  • '1'是真还是假,'0'是真还是假

JS 有五个 falsy 值(再加一个 false,JS 一共有六个假值)

falsy 就是相当于 false 但又不是 false 的值

分别是 undefined null 0 NaN '',两个空两个数字一个字符串

''和' '不是一个玩意!

再次声明,请保持严谨

undefined 和 null 两种空类型

为什么有两个空

这是 JS 的原(la)创(ji)之处

区别

没有本质区别

细节一

  • 如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null。换句话说,undefined 是一个没有值的变量的默认值

细节二

  • 如果一个函数,没有写 return,那么默认 return undefined,而不是 null
  • 所以,undefined 更多是一个默认的空,null 是一个主动的空

细节三

  • 前端程序员习惯上,把非对象的空值 undefined,把对象的空值写为 null
  • 但仅仅是习惯上而已。打破这个习惯也是没问题的

symbol 符号————不怎么常用的数据类型

直接看文章

变量声明

三种声明方式

  • var a=1
  • let a=1
  • const a=1
  • a=1 // 错的声明方式

区别

  • var 是过时的、不好用的方式
  • let 是新的,更合理的方式(一般认为是变量声明)
  • const 是声明必须赋值,且不能再改的方式(一般认为是常量声明)
  • 最后这种方式是错误的,不准这样声明

var 变量提升

  • 押题时再学,现在有时间可以提前看网道教程
  • 以后所有的代码,都不准用 var,只能用 let 或者 const

var 声明

直接跳过

  • 我们写代码不用 var
  • 面试押题前单独学习

let 声明

规则

  • 遵循块作用域,即:使用范围不能超出{}
  • 不能重复申明,在同一个作用域里不能有相同的变量
  • 可以赋值,也可以不赋值
  • 必须先声明再使用,否则报错
  • 全局声明的 let 变量,不会变成 window 的属性
  • for 循环配合 let 有奇效,为了满足不好好学习 JS 的人的幻想

const 声明

规则

  • 跟 let 几乎一样
  • 只有一条不一样:声明时就要赋值,赋值后不能改

变量声明

指定值

  • var a=1

同时也指定了类型

  • var a=1

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

  • a=2
  • a='字符串'

name 和'name'的区别

name 是变量

  • 值可变,可能是'name',也可能是'hello'

'name'是字符串常量

  • 常量就是不变量
  • 'name'只能是'name',不能是其他值

类型转换

number=>string

  • String(n)
  • n+''

string=>number

  • Number(s)
  • s-0
  • +s
  • parseInt(s)/parseFloat(s)

x=>bool

  • Boolean(x)
  • !!x // 取反的反,即取 x 的原始布尔值,这种写法在前端里更流行

x=>string

  • String(x)
  • x.toString() // 数字用这个方法转换会有 bug,这样写:(1).toString,1..toString,1 .toString

六种类型

  • undefined
  • null
  • number
  • string
  • bool
  • symbol

上面这些都是简单类型

  • 只有 object 叫做复杂类型,下一节我们开始学习