数据类型
- 数值 number :整数和小数(比如1和3.14)
- 字符串 string : 文本(比如Hello World)
- 布尔 bool :只有两个值,true 和 false,注意大小写
- 符号 symbol
- 空 undefined :表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- 空 null :表示空值,即此处的值为空
- 对象 object : 各种值组成的集合
总结:四基两空一对象
注:数组、函数、日期属于特殊的对象
一、数值(number)
数值的存储方式
JS中,数字是用64位浮点数的形式存储的。(二进制)
其中符号占1位,指数部分有11位,范围从-1023到+1024,有效数字有 52 位,需要省略开头的 1 。 例如:0.5的存储方式是 0|-1|0 。
浮点数的范围
(1)最大值
- 把指数部分11位和有效数字的52位全设为1(拉满),可得最大的二进制数字
- 换成十进制为 Number.MAX_VALUE: 1.7976931348623157e+308
(2)最小值
- 指数负方向拉满、有效数字最小1,得到最小的二进制数字
- 换成十进制为Number.MIN_VALUE: 5e-324
精度
- 最多只能到52+1个二进制位表示有效数字
- 2^53对应的十进制是9后面15个零
- 所以对于十进制来说15位数字都能精确表示
- 16位有效数字如果小于90开头,也能精确表示
- 91 10000000000001就存不下来
数值的表示法:
- 整数 1
- 小数 0.1
- 科学计数法 1.23e4 (e4就是乘以10的4次方)
- 八进制(用得少)0123,00123,0o123
- 十六进制 0x3F 0X3F (用得少)
- 二进制 0b11 或0B11 (用得少)
数值的进制
JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制
- 十进制:没有前导0的数值
- 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。如0123或00123或0o123
- 十六进制:有前缀0x或0X的数值。如0x3F或0X3F
- 二进制:有前缀0b或0B的数值。如0b11或0B11
特殊数值
- 正0 和 负0都等于 0, 但是是三个数
- 无穷大: Infinity 、+Infinity 、-Infinity
- 无法表示的数字:NaN(Not a Number),但他是一个数字 。(比如0除以0,返回NaN) NaN不等于任何值,包括NaN。
二、字符串(string)
每个字符两个字节
写法:
'你好'//单引号
"你好"//双引号
`你好`//反引号
如果想在字符串里回车,那么可以直接用反引号
let s = `这样是
可以的
用反引号很容易做到`
注意:引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
转义
\'
表示'
\"
表示"
\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"
注意index从0开始,s[0]是第一个字符,最后一个字符应该是length-1
let s = 'hello';
s[5] // undefined,居然不报错
s[4]// 'o'
三、布尔(bool)
只有两个值,true和false
下列运算符会返回布尔值:
- 前置逻辑运算符:
! (Not)
- 相等运算符:
===
,!==
,==
,!=
- 比较运算符:
>
,>=
,<
,<=
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true
undefined
null
false
0
NaN
""
或''
(空字符串)
四、undefined和null
- null与undefined都可以表示“没有”,没有本质区别
- 细节一:如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是null
- 细节二:如果一个函数,没有写return,那么默认return undefined,而不是null
- 细节三:前端程序员习惯上,把非对象的空值写为undefined,把对象的空值写为null,但仅仅是习惯上而已
五、symbol符号
六、变量声明
三种声明方式
var a = 1
是过时的、不好用的方式let a = 1
是新的,更合理的方式const a = 1
是声明时必须赋值,且不能再改的方式a = 1
最后这种方式是错误的,不准这样声明
let声明
- 遵循块作用域,适用范围不能超过{}
- 不能重复声明
- 可以赋值,也可以不赋值
- 必须先声明再使用
- 全局声明的let变量,不会变成window属性
- for循环配合let 有奇效
const声明
- 跟let规则一样
- 只有一条不同,声明时就要赋值,赋值后不能改
注意:声明变量的同时,也指定了类型,但是值和类型都可以随时变化
类型转换
1、number => string
String(n)
n+''
''+n
2、string => number
Number(s)
parseInt(s)
parseFloat(s)
s-0
+s
3、x => bool
Boolean(x)
!!x
一个感叹号可把任何东西取反布尔值,再来一个就是反布尔值的反布尔值,也就是原始布尔值
4、X => string
String(x)
x.toString()
- 数字1不可用上面的,因为默认1.后面应是小数。bug!
(1).toString()
1..toString()
1 .toString()
参考资料
内容参考 JavaScript 教程
有时间必看 JS秘密花园