js的数据类型
总体来讲有 五种基本类型,一个复杂类型,一个新增 symbol
一. 常见的数据类型有 es5
1 基本类型:Number,String,Boolean,Null,undefined
引用类型:object (Object,Array,Function,Date,RegExp)
2 基本的数据类型是不可以改变的,只有对象可以改变。
(1) 基本数据类型的检测用typeof 操作符,所有的返回值都是字符串;可能有以下几种:’undefined’、’boolean’、’string’、’number’、’object’、’function’
(2) 其中,使用 typeof 检测 object array date regexp 返回都是 object
自定义函数或者构造函数返回的是 function
null 返回的是object
(3) null 和undefined 的区别
1)null是一个对象,typeof返回object, 这个是js中的一个bug,在进行二进制转换过程中,如果前三位都是0,则ypeof时就返回object,而null转换为二进制时所用的位都是0
undefined不是一个对象typeof 返回的是undefined
2)null 是一个关键字,undefined不是关键字
3)null 转化为数字是 0 ,undefined是NaN
Number(null) === 0 // true isNaN(Number(undefined)) === true // NaN
4)定义不同
javaScript权威指南: null 和 undefined 都表示“值的空缺”,你可以认为undefined是表示系统级的、出乎意料的或类似错误的值的空缺,而null是表示程序级的、正常的或在意料之中的值的空缺。
null: Null类型,代表“空值”,代表一个空对象指针,使用typeof运算得到 “object”,所以你可以认为它是一个特殊的对象值。
undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是undefined。
null是javascript的关键字,可以认为是对象类型,它是一个空对象指针,和其它语言一样都是代表“空值”,不过 undefined 却是javascript才有的。undefined是在ECMAScript第三版引入的,为了区分空指针对象和未初始化的变量,它是一个预定义的全局变量。没有返回值的函数返回为undefined,没有实参的形参也是undefined。
null和undefined相同点
1)都是值类型
2)转化为Boolean都为false
Boolean(null) === false // true Boolean(undefined) === false // true
null 进行比较undefined
null == undefined // true null === undefined // false
二. es6 新的数据结构 (参考 http://es6.ruanyifeng.com/#docs/set-map)
1.symbol 新引入的原始数据类型
1) 通过 Symbol(dscription)声明 表示独一无二的值
2)使用 typeof 检测为 symbol
3) 不能和其他值进行运算,否则会有类型错误
4)作为对象的key 要使用 放入 [ ] 中
2.map weakMap set WeakSet
1)map [ [a,b ],[ 2, 3] ]
键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
可以使用 size set get has delete clear keys values entries forEach
2)set
新的数据结构,类似于数组。
特点:成员值唯一,没有重复的值,不可使用数组的方法
可以使用 add delete has size keys values entries forEach
// 去除数组的重复成员 [...new Set(array)]
[...new Set('ababbc')].join('')
// 字符串去重
WeakSet 的成员只能是对象,而不能是其他类型的值 ,
WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中
使用 typeof 检测为 object
instanceof 可以进行区分