按照 ECMAScript
有六种基本数据类型(undefined,null,Boolean,Number,String,Symbol(ES6 新增),Object)
严格来说函数在ECMAScript中被认为是对象,并不代表一种数据类型.
typeof这个操作符就可以区分函数和其他对象
typeof null返回的是object,这是因为null会被认为是一个空对象的引用
undefined 类型
undefined类型只有一个值就是undefined,当使用var或者let定义了变量但是没有赋值时,就相当于给变量赋了undefined
- 其实 undefined 的存在就是为了区分空对象指针(null)和未初始化的变量的区别
let message;
console.log(message == undefined); //true
let message = undefined; //没必要
console.log(message == undefined); //true
var message;
if (message) {
//这个代码块不会被执行
}
if (!message) {
//这个会执行
}
if (a) {
//报错
}
null 类型
null类型也是只有一个值,就是null
从逻辑上说,null还表示一个空对象指针,也就是为什么typeof null 返回obj的原因
- 定义空对象的初始值最好附上 null,不然不好和 undefined 区分
Number 类型
八进制(第一个数必须是0,后面是相应的八进制数字(0~7)),严格模式下无效,直接报错
十六进制
- 由于内存的限制,ES 中的数字有范围,Number.MIN_VALUE 与 Number.MAX_VALUE 之间,可以用 isFinite 这个函数测试输入的数字是否在 ES 的数字范围
浮点数
储存浮点的内存空间是储存整数的两倍,ES会想方设法的把浮点数转换成整数
不要测试某个特定的浮点值,例如:a + b = 0.3
因为Es使用了IEEE754数值
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。
IEEE 754:
规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。只有32位模式有强制要求,其他都是选择性的。大部分编程语言都有提供IEEE浮点数格式与算术,但有些将其列为非必需的。例如,IEEE 754问世之前就有的C语言,有包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。
延伸阅读:
IEEE 754由1985年电子与电气工程师协会IEEE制定,用以表示浮点数的格式,包括0、INF、NAN等,以及这些数值的浮点数运算符。标准的指定便于不同处理器之间程序的移植及研制更为复杂的数值运算程序等。
String 类型
字符串类型表示16为的Unicode字符序列
可以用双引号,单引号,反引号表示
字符串数据类型包含一些字符字面量(如/n:换行),表示非打印字符或有其他用途的字符
字符串不可变,要更改变量当中的字符串,必须先销毁原字符串,然后将新的字符串保存到这个变量
let str = "java";
str = str + "Script";
//整个过程首先分配一个足够10个字符的空间,然后填充上"java"和"script",最后销毁"java"和"script"
let age = 11;
age.toString(); // "11"
let bool = true;
bool.toString(); //"true"
//该方法常见于数值,布尔值,字符串值.null和undefined没有这个方法
//对数值调用这个方法的时候,可以给里面传数字,控制输出的进制,如:
let num = 10;
num.toString(); //"10"
num.toString(2); //"1010"
//如果不确定这个变量是否为null或者undefined,则使用转型函数String()
es 新增模板字面量定义字符串``
可以换行定义字符串,html 模板
可以进行模板插值${},插入的值都会强行 toString 转型为字符串
boolean类型
true和false,true不等于1,false不等于0
流程控制语句的条件会自动执行Boolean()
string-->非空字符串为true
Number-->非零数值(包括无穷值)为true
object-->任意对象为true除了null
symbol类型
let symbol = Symbol("sym");
let obj = {
name: "symbol_name",
[symbol]: "唯一性"
};
// 访问对象的基本属性
for (const key in obj) {
console.log(key); //name
}
for (const key of Object.keys(obj)) {
console.log(key); //name
}
// 访问对象中的私有属性
for (const key of Object.getOwnPropertySymbols(obj)) {
console.log(key); // Symbol(sym)
}
for (const key of Reflect.ownKeys(obj)) {
// 访问对象的所有属性
console.log(key); // name 、Symbol(sym)
}