JS七种数据类型(4基础2空1对象)
注意 typeof 可以判断这些数据类型,唯独null比较特别,
typeof null === 'object'typeof function(){} === 'function'
- number
- string
- bool
- symbol(没人用)
- undefined
- null // 以上是6种简单类型
- object // 复杂类型
类型转换的几种方式
String('1') // 以下数字转字符串
1+''
(1).toString() // 1.toString()不行
Number('123') // 以下字符串转数字
'123'-0
+'123'
parseInt('123')
Boolean(1) // 以下是转换为bool
!!1 // true
数组 函数 日期都属于object类型
如何理解NaN
- NaN 无法表示的数字 但NaN依旧是数字
- 0/0 => NaN
- 当人们没有发明负数的时候1-5=NaN,但现在知道了是-4
- NaN === NaN ===> false // 两个不知道是什么数字的数字怎么会相当呢?
八进制 十六进制 二进制写法
数字与字符串
- 所有数字不论你是整数还是小数都是以64位浮点数形式存储的
- 字符串能表示电话号码,数字不能表示电话号码,如果有多个0打头,以数字方式储存的话,显然就会丢失
- 字符串是以类似UTF8形式存储的
进制的英文表示法
- BIN:binary,二进制的
- OCT:octal,八进制的
- HEX:hexadecimal,十六进制的
- DEC:decimal,十进制的
JS如何存数字的
十进制=>二进制
计算器最快速计算进制转换
如图,计算十进制的31=>二进制
如图,计算十六进制数3C5A=>二进制
JS如何存字符的
基础知识
- 2位二进制数可表示 2^2=4 个数
- 7位2进制数可表示 2^7=128 个数
- 每8个二进制位组成了一个字节(Byte)
- 计算机最小存储单位是字节
ASCII码
此处可查标准ASCII 标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)即0-127这128个数表示键盘上的所有符号
之后的所有编码的前128位都是从此而来
字符0是48号 A是65号
GB2312字符集
- 国标2312是第一个汉字字符集
- 每个汉字是HEX的形式,16位的二进制0/1,即两个字节,组成的
- 整个国标2312最多可容纳2^16=65536个字符,(1位二进制0/1可容纳下2^1=2个字符)
- 比如可以在这里查到“你”对应的GB2312是C4E3
- 但是GB2312太早期,有许多生僻汉字没有存在里面
微软的GBK字符集
- GBK国标扩完全兼容GB2312,将多国所用到的汉字拓展到2w+
- 依旧是16位
Unicode万国码
- Unicode是一种字符集,而UTF-8是一种编码规则
- 定长至少3个字节
- 比如: 这里可以查到'a'在unicode中是HEX的0061
- 对应BIN是 00000000 00000000 01100001
- 这便是定长的意思,即使是0也会占很多空位
- 对于Unicode的字母来说,有效位也就两个字节
- 这相对于GB2312而言,体积扩大百分之五十,**导致unicode根本不会流行 **
- 会不断扩充,以后会逐渐变成4个5个字节
- Unicode 为世界上所有字符都分配了一个唯一的数字编号,每个字符都有一个唯一的 Unicode 编号,编号一般写成 16 进制,在前面加上 U+。例如:“马”的 Unicode 是U+9A6C
- Unicode 就相当于一张表,建立了字符与编号之间的联系
- Unicode 本身只规定了每个字符的数字编号是多少,并没有规定编号之间如何存储
- 编号怎么对应到二进制表示呢?有多种方案:主要有 UTF-8,UTF-16,UTF-32
UTF-8
- UTF-8 不是一种字符集的名称,它代表一种 Unicode 字符集的编码规则
- UTF-8让Unicode码能够'变长'而不再定长,合理节省空间
- UTF-8使用的字节数从 1 到 4 不等,存储一个字符的最小容量可以是1个字节即是8位,因此得名UTF-8
字符串
- 引号不包含在字符串里面
- 如果要在引号里面表示引号,应该用转义符号
- "it's ok" ==> "it's ok"
- \n\t\r长度是3
- 推荐使用反引号``
- 字符串是有属性的,不仅仅对象有属性
- 空字符串的长度是0 空格字符串的长度是1
转义
"\n" // 换行
"\r" // 回车
"\t" // tab制表符
"\'" // "'"
"\u4f60" // "你" 可以用转义unicode方式输出字符串
base64
window.btoa('123') // MTIz
window.atob('MTIz') // 123
bool
falsy值是什么
- 相当于是假但又不是false的值
- null undefined 0 NaN '' 这五个是falsy值// 其中0和NaN是数字、
- 由上得到1是真,'1' '0'都是真
整个js有多少值是false?**
答案:6个, false null undefined 0 NaN ''
undefined与null 两种空类型
- 本质都是空,没有大的区别
- undefined: var a; 但不赋值,则系统默认给undefined
- undefined: function a(){ //此处没有return } 则系统默认在执行函数时返回undefined
- undefined: 程序员习惯位为非对象的空值赋值undefined,仅仅是习惯
- null: 程序员习惯位为对象的空值赋值null,仅仅是习惯
let const
- 不准再写var
- 相同: 会形成暂时性死区
- 相同: 取消了var的声明提前现象
- 相同: 在相同作用域中不可重复声明同一个变量名
- 不同: 在声明变量时let可不立即完成赋值操作,const不行; 在声明一个变量后let可修改这个变量,const不行
- 特例: const obj={age:11} ; obj.age=22; const遇上引用类型array和object时可修改
- 如果你不希望引用类型被修改可以使用Object.freeze()
var的缺点/特点
- var声明的变量存在变量提升,可以先使用后声明
- 提前使用时值是undefined
- var可以在相同的作用域内重复声明同一个变量,后来的值会覆盖之前的值。
- 如果特别频繁在全局作用域中使用var,会造成全局污染。
块级作用域对var是不起效果的
// code1
var monkey='123';
{
console.log(monkey);
var monkey='456';
}
console.log(monkey); // 先输出123后输出456 因为block无法限制var
暂时性死区
暂时性死区指的是块级作用域搭配let/const使用,let/const在块级作用域中声明了一个变量则他们会使块形成封闭的作用域,这个变量即使在外部作用域是存在的也不会产生关联。
// code2
var monkey='123';
{
console.log(monkey); // 对照code1,block将let声明的monkey锁死在里面,let不支持未声明就使用,因此报错
let monkey='456';
}
console.log(monkey);
取消了声明提前
若在声明之前使用变量,就会报错,这就是取消了声明提前。在代码块内,使用 let const声明变量之前,该变量都是不可用的。