01-集合
Array
Set
Map
02-遍历
- 普通for循环
1.只能遍历字符串和数组
-
for in
1.可以遍历字符串
2.专业遍历对象
3.可以遍历遍历数组 -
for of
1.遍历字符串
2.专业遍历数组
3.遍历集合(Set 和 Map)
for(var ele of arr){console.log(ele)}//ele直接为元素 -
forEach
1.遍历数组
arr.forEach(function(element,index){})
2.遍历集合
Set.forEach(function(element1,element2){})
Map.forEach(function(value,key){})
不要用for in遍历数组
for in 语句对数组对象进行遍历潜在的bug在于:如果原生Array类被其他的js脚本库进行了原型扩展(比如多加一个toJSON方法即Array.prototype.toJSON=xxxx),那么用for in遍历扩展后的Array对象的逻辑将与遍历原生Array对象的逻辑发生差异。
03-异常处理
当你觉得某些方法可能出现错误的时候来使用
特点:不会阻塞代码
- 捕获异常 try..catch..finally
try{
//觉得有问题的代码
}catch(err){
//捕获err
console.log(e.toString)
}finally{
//无论是否有异常都会走这里
} - 抛异常 throw new Error("阻塞")
04-js对象指针总结
栗子:不用new关键词 创建对象的两种方法
function Person (name){
//if(this == window){
//return new Person(name)
//}
if(this instanceof Person){
this.name = name;
return this;
}
return new Person(name);
}
var p1 = new Person("猫");
var p2 = Person("狗");
console.log(p1.name);
console.log(p2.name);
05-迭代器
for..of循环的内部实现
var str = "欢迎来到北京";
console.log(String.prototype[Symbol.iterator])
String.prototype[Symbol.iterator] = function(){
var index = 0;
var self = this;
return {
next : function(){
return {
value : self[index++],
done : index - 1 < self.length ? false : true
}
}
};
};
//for (var ele of str) {
// console.log(ele);
//}
var iteratorStr = str[Symbol.iterator]();
console.log(iteratorStr.next());
console.log(iteratorStr.next());
console.log(iteratorStr.next());
console.log(iteratorStr.next());
console.log(iteratorStr.next());
console.log(iteratorStr.next());
06-自定义对象迭代
var obj = {
name:"小雪",
age:18,
sex:"女",
eat:function(){
console.log("吃");
}
};
Object.prototype[Symbol.iterator] = function(){
var keysIndex = 0;
var valueIndex = 0;
var keysArr = Object.keys(this);
var valuesArr = Object.values(this);
return {
next : function(){
return {
value : valuesArr[valueIndex++],
key : keysArr[keysIndex++],
done : valueIndex - 1 < keysArr.length ? false : true
}
}
}
};
var iteratorObj = obj[Symbol.iterator]();
console.log(iteratorObj.next());
console.log(iteratorObj.next());
console.log(iteratorObj.next());
for ( var ele of obj ) {
console.log(ele);
}
/*
* 2、自定义构造函数 实现一个和系统自带的Map构造函数相同功能的数据结构
需要支持get set has delete size属性等功能
*/
function MyMap(){
this.elements = new Array();
//把参数变成对象放进数组里面
for(var items of arguments[0]){
this.elements.push({
key:items[0],
value:items[1]
})
}
//获取Map元素个数
this.size = function(){
return this.elements.length
};
//添加参数
this.set = function(key,value){
this.elements.push({
key:key,
value:value
})
};
//获取元素
this.get = function(key){
for(var i = 0 ; i < this.elements.length;i++){
if(this.elements[i].key == key){
return this.elements[i]["value"];
}
};
};
//删除元素
this.delete = function(key){
for(var i = 0; i < this.elements.length ; i++){
if(this.elements[i].key == key){
this.elements.splice(i,1);
}
}
};
//判断是否拥有has
this.has = function(key){
for(var i = 0 ; i < this.elements.length ; i++){
if(this.elements[i].key == key){
return true;
}else{
return false;
}
}
};
}
var map = new MyMap([["name","小雪"],["age",18]]);
map.set("sex","女");
map.delete("name");
console.log(map.size());
console.log(map);
console.log(map.elements);
console.log(map.has("age"));
console.log(map.has("fun"));
console.log(map.get("age"));