JS数据类型: 7种(四基两空一对象)
- number 整数和小数(比如1和3.14)
- string 文本(比如Hello World)。
- bool 表示真伪的两个特殊值,即true(真)和false(假)
- 空数组([])和空对象({})对应的布尔值,都是true。
- symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值。
- undefined 表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- null 表示空值,即此处的值为空。
- 区别是这样的:null是一个表示“空”的对象,转为数值时为0;undefined是一个表示"此处无定义"的原始值,转为数值时为NaN。
- object 对象
- 以下不是数据类型,是object
- 数组 \ 函数 \ 日期
-
JS 中的 number全都是以 小数(浮点数) 的形式存储的,没有单独的整数
-
通常,数值、字符串、布尔值这三种类型,合称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。至于undefined和null,一般将它们看成两个特殊值。
-
对象是最复杂的数据类型,又可以分成三个子类型。
- 狭义的对象(object)
- 数组(array)
- 函数(function)
number 数值
参考资料: 网道 / 数值
- 整数 1
- 小数 0.1
- 科学计数 1.23e4
- 八进制 00123
- 十六进制 0x3F
- 二进制 0b11
特殊值
- 正负0,都等于0
- 无穷大
- infinity \ +infinity \ -infinity
- 无法表示的数字 (依然是number)
- NaN (not a number)用来表示不能表示的数字。例如:0/0
范围和精度
- 范围 , 指数拉满 , 有效数字拉满 得到
- Number.MAX_VALUE:1.7976931348623157e+308
- Number.MIN_VALUE: 5e-304
- 精度 (有效数字)
- 最多只能得到52+1 个二进制位表达的有效数字
- 2^53 对应的十进制是9后面15个0
- 所有15位有效数字都能精确表达
- 16位 有效数字 如果90开头,也能精确表达
- 911000000000000001
字符串 string
有三种写法
- 单引号 '
- 双引号 "
- 反引号 ` (推荐)
转义
错误写法: 'it's ok'
正确写法: 'it/'s ok'
\ 反斜杠 用来转义
\" 表示"
\'表示'
\n表示换行
\r表示回车
\t表示tab制表符
\\表示\
\uFFFF 表示对应的Unicode字符
\xFF表示前256个Unicode字符
字符串长度
- string.length
`123`.length //3字符
`\n\r\t`.length // 3字符, \不算字符
''.length //0个字符
` `.length //1 空格是一个字符
通过下标读取字符串
- string[index]
let s = `hello`
s[0] // h , 为什么是h? 从0开始 n-1 就是最后一个字符的位置
- 注意index从0开始, 字符[0],是第一个字符
base64 转码
- window.btoa (
你的邮箱) //正常转Base64 - window.atob (
ZMFusllad31SAD) //转正常
boolean 布尔值
- 只有2个值 , true or false
下列运算符得到bool值
否定运算
- !value ,值前面加 ! 表示取它的反
相等运算
- 1==2 \ 1!==2 \ 3===4 \ 3!==4
比较运算
五个falsy的值
- undifined
- null
- 0
- NaN
- ''(空字符串)
- 非ie浏览器的第六个falsy值:document.all
两种空类型 null & undefined(多数是)
- 变量声明了, 但没赋值, 那默认就是 undefined
- 如果一个函数, 没有写return , 那么默认return就是undefined
- 习惯上, 把非对象的空值写为 undefined, 把对象的空值写为 null
symbol (不常用)
- 作为属性名避免属性名冲突
- 替代代码中多次使用的字符串(例如:abc),多次使用的字符串在代码中不易维护,而这时候定义一个对象的属性(属性名用Symbol格式),值为abc,就可以作为全局变量来使用了。
- 由于以Symbol值作为名称的属性,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。
- 这个有时,我们希望重新使用同一个Symbol值,Symbol.for方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
变量声明
- var a=1 // var 的「创建」和「初始化」都被提升了。
- function a(){} // function 的「创建」「初始化」和「赋值」都被提升了。
- let a=1 // 常用来声明新的变量, let 的「创建」过程被提升了,但是初始化没有提升。
- const a=1 // 声明时必须赋值,常用来声明常量
- const 和 let 只有一个区别,那就是 const 只有「创建」和「初始化」,没有「赋值」过程。
这四种声明,用下图就可以快速理解:
JS 变量声明的过程: 创建\ 初始化\ 赋值
- 创建create
- 初始化initialize
- 赋值assign
所谓暂时死区,就是不能在初始化之前,使用变量。
let 声明
- 块作用域, 使用范围 不能超过{}
- 不能重复声明
- 可以赋值, 也可以不赋值
- 必须先声明, 再使用
- 全局声明的let变量 ,不会变成window的属性
- for循环配合let有奇效
const 声明
- 跟let一样, 但声明就要赋值, 赋值后不能改
- const 只有「创建」和「初始化」,没有「赋值」过程。
name 和 'name' 区别
- name 是变量 , 类型不确定
- 值可变, 可能是 'name' ,可能是'hello'
- 'name' 类型就 是字符串
- 常量的就是不变量
类型转换
number=>string
String(n)
n+'' // 加单引号,变字符
string=>number
- Number(s)
- s-0 // -0 变数字
- +s // 给+正号 , 变数字
- parseInt(s)// 变正数 , 其实还是有浮点
x=>bool
- Boolean(x)
- !!x /取反再取反 , 就是原始布尔值
x=>string 任何东西变字符
- x.toString()
- 1.tostrubg() // 有BUG , 必须1..tostring()