基本数据类型:Undefined、Null、Boolean、Number、String、Symbol(ES6新增)
复杂数据类型:Object
Undefined
声明了变量但是没有初始化,默认为undefined,在if语句中默认转化为false。
let a
console.log(a) // undefined
console.log(a == undefined) // true
console.log(typeof a) //undefined
if (a) {
console.log('执行了1') // 不会执行
}
if (!a) {
console.log('执行了2') // 会执行
}
类型转换:
Boolean(undefined): false
Number(undefined): NaN
String(undefined): 'undefined'
Null
null表示一个空对象指针,在if语句中默认转化为false。
let a = null
console.log(typeof a) // object
if (a) {
console.log('执行了1') // 不会执行
}
if (!a) {
console.log('执行了2') // 会执行
}
类型转换:
Booleam(null): false
Number(num): 0
String(null): 'null'
Boolean
该类型只有两个值:true、false
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | 空字符串 |
Number | 非零数值 | 0、Nan |
Object | 任意对象 | null |
Undefined | N/A | undefined |
转换为`boolean`: `Boolean()`
Boolean(undefined):false
Boolean(null):false
Boolean(非空对象包括空数组[]和空对象{}):true
Boolean(非0): true || Boolean(0和NaN):false
Boolean(非空包括空格字符串):true || Boolean(''):false
Number
Number类型包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后面至少有一个数字)两种值。
浮点值
数值中必须包含小数点,而且小数点后面必修至少有个一数字。
let num1 = 1.1
let num2 = 0.1
let num2 = .1 // 不推荐
浮点值精度最高可达17位小数,但在算术计算中远不如整数精确
let num1 = 0.1
let num2 = 0.2
console.log(num1 + num2) // 0.30000000000000004
NaN
意思是“不是数值”,非数字类型,属于数值型基本数据类型
console.log(0/0) // NaN
console.log(-0/+0) // NaN
console.log(NaN == NaN) // false NaN不等于包括NaN在内的任何值
console.log(isNaN(NaN)) // true
console.log(isNaN(10)) // false,10可以是数值
console.log(isNaN("10")) // false,可以转换为数值10
console.log(isNaN("blue")) // true,不可以转换为数值
console.log(isNaN(true)) // false,可以转换为数值1
数值类型的转换:
Number():可以用于任何的数据类型
console.log(Number("hello")) // NaN
console.log(Number("")) // 0
console.log(Number("000011")) // 11
console.log(Number(true)) // 1
parseInt():提取 整数数值
console.log(parseInt("1234blue")) // 1234
console.log(parseInt("")) // NaN
console.log(parseInt("0xA")) // 10,解释为十六进制整数
console.log(parseInt(22.5)) // 22
console.log(parseInt("70")) // 70,解释为十进制
//parseInt()也可以接受第二个参数,用于指定底数(进制数)
console.log(parseInt("10",2)) // 2,按二进制
console.log(parseInt("10",8)) // 8,按八进制
console.log(parseInt("10",10)) // 10,按十进制
console.log(parseInt("10",16)) // 16,按十六进制
paseFloat():提取浮点数值
console.log(parseFloat("1234blue")) // 1234,按整数解析
console.log(parseFloat("0xA")) // 0
console.log(parseFloat("22.5")) // 22.5
console.log(parseFloat("22.34.5")) // 22.34
console.log(parseFloat("0908.5")) // 908.5
console.log(parseFloat("3.125e7")) // 31250000
String
字符串的单引号和双引号作用效果一样
字符串有length属性,可以取得字符串的长度
字符串的值是不可变的,所以很多的字符串的api不会改变原字符串值
获取长度
let a = '123456'
console.log(a.length) // 6
字符串转换:
String():适用于任何的数据类型
let a = 11
console.log(String(a)) // 11
let b = true
console.log(String(b)) // true
let c = null
console.log(String(c)) // null
let d
console.log(String(d)) // undefined
toString():null和undefined没有这个功能
let a = 11
console.log(a.toString()) // 11
console.log(a.toString(16)) //b
let b = true
console.log(b.toString()) // true
let c
console.log(c.toString()) // 报错
Symbol
Symbol是ES6新增的一种数据类型。只要你声明了Symbol, 那么就是唯一的了.
let message1 = Symbol('message') // Symbol()中的值是message1的描述
let message2 = Symbol('message')
console.log(message1 == message2) // false
console.log(message1) // Symbol(message)
console.log(message1.description) // message
如果想创建一个可共享的Symbol,要使用Symbol.for()方法。它只接受一个参数,也就是即将创建的Symbol的字符串标识符,这个参数同样也被用作Symbol的描述:
let uid = Symbol.for('uid');
let uid2 = Symbol.for('uid');
let object = {
[uid] : '12345'
} ;
console.log(uid === uid2); //true
console.log(object[uid]); //12345
console.log(object[uid2]); //12345
Symbol.for()方法首先在全局Symbol注册表中搜索键为‘uid’的Symbol是否存在,如果存在,直接返回已有的Symbol;否则,创建一个新的Symbol,并使用这个键在Symbol全局注册表中注册,随机返回新创建的Symbol。
由于其他类型没有与Symbol逻辑等价的值,所以不能将Symbol强制转换为字符串或是数字类型。
Symbol不是直接存储数据的, 而是, 作为一个独一无二的key, 放置数据的, 防止数据因为重复, 无法存进数据对象中,例如: obj中,存入key为1和‘1’的值, 后面的会把前面的覆盖掉。
class Cache{
static data = {}
static set(name, value) {
this.data[name] = value
}
static get(name){
console.log(this.data[name])
return this.data[name]
}
}
let user = {
name:'用户信息',
key:Symbol('用户信息')
}
let cart = {
name: '购物车信息',
key: Symbol('购物车信息')
}
Cache.set(cart.key, '这是购物车存储的信息')
Cache.set(user.key, '这是用户存储的信息')
Cache.get(user.key) // 这是用户存储的信息
Cache.get(cart.key) // 这里购物车存储的信息
console.log(Cache.data) // { [Symbol(购物车信息)]: '这是购物车存储的信息', [Symbol(用户信息)]: '这是用户存储的信息' }
Object
ECMAScript中的对象其实就是一组数据和功能的集合。通过new操作符后跟要创建的对象类型的名称来创建。
var o = new Object(); //创建一个Object对象
每个Object类型的实例共有的属性和方法:
constructor: 保存着用于创建当前对象的函数。
hasOwnProperty:用于检测给定的属性在当前对象的实例中是否存在。
isPrototypeOf : 用于检查传入的对象是否是当前对象的原型
propertyIsEnumerble : 用于检查给定属性能否使用for-in来枚举
toLocaleString() : 返回对象的字符串表示。
toString() : 返回对象的字符串表示。
valueOf() : 返回对象的字符串,数值,或布尔表示。通常和toString() 返回的值相同。