1.四基两空一对象
在JavaScript脚本语言中,一共有7种数据类型,分别是数字number、字符串string、布尔bool、符号symbol、空undefined、空null、对象object。总结起来就是四基两空一对象。
后来新增了一种大整形 bigint
2. 数字number
JS中的数字是严谨的,如0就有三种,+0、0、-0,值的大小是没有区别,但是当其做分母时,就会得到三个不同的值,+Infinity、Infinity(无穷大)、-Infinity,这些在电脑中存储的方式是不一样的。
JS中还有一种数字是无法表示的数字NAN(not a number),NAN一般用来表示数学上暂时无法认知的数字,如0/0=NAN。
存储方式
JS中的number数据类型都是以一个64位的浮点数进行存储的,所谓浮点数就是小数点可以移动的数。JS中的数字都统一用二进制的科学记数法表示,如101.01=1.0101*22,则存储是,第一位为正0,中间为2(转为二进制),后52位为0101,第一位为正JS存储数字时的具体存法为:
0(正)/1(负) (1位) 指数部分(11位) 有效数字(52位)
如上所示,二进制位为64位,第一位用来表示正负,中间11位用来表示指数部分,并且指数部分有正负之分,正负各占一半。后52位用来表示有效数字,由于二进制位的科学计数法的小数点前面的都是1,就为了节省空间不将小数点前的1放入后52位,只放小数点后的。总的来说64位的存储分布为:
符号占1位,指数占11位(表示的范围为-1023~1024),有效数字占52位(去掉小数点前的1)。
表示范围
表示范围指的是包括正负、指数部分和有效数字部分都用上所能表示的最大数值。
Number.Max_VALUE:可查看number能表示的最大数字转换为十进制为1.7976931348623157e+308
Number.MIN_VALUE:可查看number能表示的最小数字转换为十进制为5e-324
精确度
精确度指的是有效数字部分能表示的数字的大小,即转为科学计数法后小数点后的有效位。加上未存入后52位的小数点前的数字1,共253=9007199254740992。所有对于15位有效数字都能表示,16位有效数字的必须以90开头的才能存储,超过精确度的数字存储时会有丢失。这只是说的有效位,如果后面加0是可以存储的。
3. 字符串string
字符串写法
JS中的字符串是用定长的两个字节进行存储的。ES6最新版本的JS的字符串的写法如下:
- 单引号 ‘hello’
- 双引号 “hello”
- 反引号
hello
,(就是感叹号!左边的`,且最新版本的反引号的好处是可以在字符串中有回车,但单引号和双引号中字符中的回车不起作用)
并且,这些引号不属于字符串的一部分,若想在字符串中出现这些引号,需要用转义字符或其他方式,如下:
- 用转义字符\ ‘it\’s ok’
- 引号交替使用,如”it’s ok”。
转义字符
转义字符指的是在ES6中有特殊含义的字符若想显示出来必须要告诉系统自己此时不再是特殊作用的字符,而是普通字符,那就是通过转义的方式,在特殊作用字符前加 \ ,用两个字符表示一个字符。如下:
- \’表示 ‘
- \”表示”
- \表示\
- \n表示换行
- \r 表示回车
- \t表示Tab制表符
- \Unicode编号
字符串属性
string.length:获得字符串的长度
string[index]:通过下标获取字符串数组中的单一字符
字符串可再编码
字符串可以通过 base64转码 进行字符串转码,用法如下:
- window.btoa(“正常字符串”) = “base64编码的字符串”
- window.atob(“base64编码的字符串”) = “正常字符串”
4. 布尔boolean
布尔值
boolean只有两个值,true和false(全是小写),表示真和假。
可以得到bool布尔值的运算有:
- 否定运算,如!value
- 相等运算,如21、1!=2、3=4等
- 比较运算,如2>3等
六个falsy值
falsy值指的是不是false但是相当于false的值,在做为判断条件 if(value) 时被认为是假,JS中一共有6个,分别是undefined、null、0、NAN、‘’(注意中间没有空格,空字符串)、document.all(具体看DOM编程博客)。一旦运算获得的值是这6个,则布尔值均为false。除此之外的值都被认为是true值。
注意:[] ,空数组不是 falsy 值,其有对象地址,只是里面没有内容而已。
if([]){
console.log('ok');
}
//输出 ok
5. 符号Symbol
不怎么常用,有以下大佬写的博客可供参考学习链接:
6. 两个空undefined和null
JS在设计的时候是有两种类型的空值,虽然二者在意义上没区别,但在细节上有区别,一般来说,undefined是被动的空值,null是主动赋予的空值。具体情况如下例所示:
- 变量声明未赋值,默认变量值是undefined,而不是null
- 函数没有return,默认return值是undefined,而不是null
- 一般习惯上将非对象的空值写为undefined,把对象的空值写为null
6. 对象object
函数、数组、日期都是对象object。对象比较复杂,用一篇博客专门写对象。
6.1 大整数 bigint
7. 变量声明
旧版本的JS的变量声明的关键字是var,ES6后的新版本的变量声明的关键字多了两个,分别为let和const,具体区别如下:
var
var是过时的变量声明方式,而且在函数外只要是用var声明过的变量都会被挂在window上,变成window的属性,可用window.变量名获取得到,也就是所谓的全局变量,但在函数内声明的局部变量不会被挂碍window上。
let
let是ES6新版本的JS变量声明的方式。在同一作用域不能有重复变量名的声明。可以在声明时赋值,或先声明后赋值。但有一点是必须变量先声明再使用。新版本的let和var不同之处在于,全局声明的let变量不会挂在window上成为window的属性,用window.变量名获取不到。let可以与for循环配合,如下所示:
for(var i=0; i < 5; i++){
setTimeout(()=>console.log(i),0)
}//结果会打出5个5,i会被挂到window上
for(let i=0; i < 5; i++){
setTimeout(()=>console.log(i),0)
}//结果会打出0到4,是期望的效果
const
const是ES6新版本的变量声明的方式,特点是该类型的变量在声明时必须赋值,且是不能再改的常量,因此const用来声明定义一个不可改变的常量
JS中的变量是在赋值时才确定的变量的类型
8. 类型转换
数据类型间可以进行数据转换,如下所示:
number==>string
- string = String(number)
- string = number + ‘’(空字符串)(加法会将数字转化为字符串)
string==>number
- number = Number(string)
- number = string - 0 (减法会将字符串转化为数字)
- number = +string (正号将字符串转化为数字)
- number = parseInt(string, [进制类型]),在旧版本的JS中,后面的进制类型必须加,如十进制就必须加10,否则以0开头的数字会被认为是八进制数字,但是新版本的进制类型不需要加,会默认是10进制。
x(任意类型)==>bool
- bool = Boolean(x)
- bool = !!x
x(任意类型)==>string
- string = String(x)
- string = x.toString() 但是在该种情况下有个bug,就是如1.toString()会报错,1.会触发小数点的逻辑,所以可以改为(1).toString()或者1..toString()。
9. 知识扩展区
更多JS的奇葩之处可看JS秘密花园