数据类型
基本数据类型
ES5基本数据类型:number、boolean、string、null undefined
ES6新增基本数据类型:symbol
引用数据类型
ES5引用数据类型:Date、Math、Array、RegExp、Object、Function
ES6新增引用数据类型:Map、Set
浏览器提供的引用数据类型:document、window、Image
typeof的返回值
typeof的返回值有number、boolean、string、symbo、undefined、function、object这几个字符串。
symbol
symbol指数据是独一无二的,用变量保存数据。Symbol是官方内置的函数
re和re2尽管长得一样但也不是同一个数据
typeoof symbol数据返回symbol。
Map和Set
typeof 返回值
都返回object
Map
Map对象保存键值对,任何值(对象或者原始值) 都可以作为一个键或一个值。
创建Map对象初始传入参数是二维数组,new Map([["key1", "value1"], ["key2", "value2"]]);
var m1=new Map([["name","jzx"],["age",26]]);
console.log(m1);
判断某个元素是否在 Map 中可以使用
用has方法,返回布尔值。Object对象可以Object.prototype.hasOwnProperty() 来判断某个key是否是这个对象本身的属性,从原型链继承的属性不包括在内,也是返回布尔值。
var m1=new Map([["name","jzx"],["age",26]]);
console.log(m1.has("name"));
Map与Object区别:
1.Object的键只能是字符串或者 Symbols,但Map的键(key值)可以是任意值;
set():用于Map对象存成员,第1个参数是key值,第2个参数是key关联的存入的数据。get():用于Map对象取成员,key传入的是什么,取成员的key就是什么。
Map对象存成员时key是引用数据时,取成员时即使key写得一样也会取出undefined。因为这两个引用数据只是长得一样,却是两个不同的引用数据,在内存空间中它们不是同一个引用。
Map对象key用引用数据时,需要将引用数据保存在某个变量中,用变量当作key,取成员时key才是同一个引用。可以用这个变量操作引用数据中的数据,只要不直接改变变量的引用就行。
var m1=new Map();
var re=[function(){}];
m1.set(re,function fm(){console.log(67);});//给re属性存入function fm(){console.log(67);
re.push(20);
console.log(re);
console.log(m1.get(re));
2.Map中的键值是有序的(先入先出),而添加到对象中的键则不是;Map 会按照插入顺序保持元素的顺序,而Object做不到。
3.Map的键值对个数可以从 size 属性获取,而 Object 的键值对个数通过Object.keys()获取后手动计算;size属性表示Map对象中保存的数据个数
4.Object都有自己的原型,原型链上的键名有可能和自己在对象上设置的键名产生冲突。
Map对象删除元素
在 Object 中没有原生的删除方法,可以用delete
使用 delete 会真正的将属性从对象中删除,而使用赋值 undefined 的方式,仅仅是值变成了 undefined。属性仍然在对象上,也就意味着 在使用 for … in… 去遍历的时候,仍然会访问到该属性。
Map 有原生的 delete 方法来删除元素,delete方法传入的参数是Map对象的键值。size属性也会改变。
var m1=new Map([["name","jzx"],["age",26]]);
m1.delete("age");
console.log(m1);
清空所有元素,可以用clear方法。
var m1=new Map([["name","jzx"],["age",26]]);
m1.clear();
console.log(m1);
JSON 直接支持 Object,但不支持 Map。Map 是纯粹的 hash, 而 Object 还存在一些其他内在逻辑,所以在执行 delete 的时候会有性能问题。所以写入删除密集的情况应该使用 Map。Map 在存储大量元素的时候性能表现更好,特别是在代码执行时不能确定 key 的类型的情况
Map对象遍历
1.forEach
2.for of for...of遍历Map对象,取出每个键值对的键key和值value。返回一个新的数组,包含了 Map 对象中元素的 [key, value] 数组。 i是一个数组就相当于var [key,value]=i解构赋值。
Map 与 Array的转换
1.Map构造函数可以将一个二维键值对数组转换成一个 Map 对象
[["key1", "value1"], ["key2", "value2"],..,["keyn", "valuen"]]=>二维数组
2.使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
Map的克隆
Map 对象构造函数,会迭代出新的对象。克隆的对象只是长得一样,却是两个不同的对象。
Map的合并
合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的
Set
Set对象允许存储任何类型的唯一值,无论是原始值或者是对象引用
Set对象用add()方法添加数据,Set对象取数据只能遍历把数据全部取出。size属性表示Set对象中数据的个数,因为Set对象存储任何类型的唯一值,所以基本数据的值不能重复,虽然存了4个数据,其中重复存储了1次,所以size属性值未3,只存储了3个数据。而引用数据只要引用不同,即使值相同,Set 也能存储,因为引用不同不恒等。
Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
undefined 与 undefined 是恒等的,所以不重复;
NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。
Array和Set转换
用...操作符,将 Set 转 Array。...x表示取出x数据容器中所有元素
String和Set转换
ps:Set 中 toString 方法是不能将 Set 转换成 String