JS数据类型 & 5个falsy值

195 阅读5分钟

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

有三种写法

  1. 单引号 '
  2. 双引号 "
  3. 反引号 ` (推荐)

转义

错误写法: '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 //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 (不常用)

每日一题JS 中的 Symbol 是什么?知乎

  1. 作为属性名避免属性名冲突
  2. 替代代码中多次使用的字符串(例如:abc),多次使用的字符串在代码中不易维护,而这时候定义一个对象的属性(属性名用Symbol格式),值为abc,就可以作为全局变量来使用了。
  3. 由于以Symbol值作为名称的属性,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。
  4. 这个有时,我们希望重新使用同一个Symbol值,Symbol.for方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。

变量声明

《我用了两个月的时间才理解 let》

  • var a=1 // var 的「创建」和「初始化」都被提升了。
  • function a(){} // function 的「创建」「初始化」和「赋值」都被提升了。
  • let a=1 // 常用来声明新的变量, let 的「创建」过程被提升了,但是初始化没有提升。
  • const a=1 // 声明时必须赋值,常用来声明常量
  • const 和 let 只有一个区别,那就是 const 只有「创建」和「初始化」,没有「赋值」过程。

这四种声明,用下图就可以快速理解:

JS 变量声明的过程: 创建\ 初始化\ 赋值

  1. 创建create
  2. 初始化initialize
  3. 赋值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()