数组
定义
- 构造函数
var arr = new Array();//使用构造函数定义,只有一个参数的时候,表示数组的长度,多个参数表示数组元素
- 字面量
var arr1 = [];//字面量
遍历数组
- for
for(var i=0;i<arr.length;i++){
arr[i]
}
- forEach,没有终止,没有返回值
arr.forEach((item,index)=>{
item//是数组的元素
index//数组下标
return//。没有用
})
- map,有返回值,返回新数组,没有改变原数组。可以挑选一些属性进行返回(数组返回的可以是数组元素的部分属性)
var arr2 = arr.map((item,index)=>{
item//是数组的元素
index//数组下标
return item + 1;
})
- filter,筛选元素,返回值是数组,返回满足条件的数组(数组元素就是原来的数组元素)
var arr2 = arr.filter((item,index)=>{
//item//是数组的元素
//index//数组下标
return item > 5//筛选的条件
})
- reduce(购物车,累加器)
var arr2 = arr.reduce((total,cur)=>{
//total//数组当前的和
//cur//数组当前的元素的值
return total + cur//筛选的条件
},10)//第二个参数10是初始值
- every,数组元素都满足条件,返回true,否则返false
var arr2 = arr.every((item,index)=>{
//item//是数组的元素
//index//数组下标
return item > 5//筛选的条件
})
对象
json键必须加双引号。方法的键不加。普通对象如果键有保留字必须加引号
- 构造函数
var obj1 = new Object();
obj1.name = 'alice';
obj1['age'] = 20;
- 字面量
var obj2 = {}//简单字面量
obj2.name = 'zs';
var obj3 = {
name: 'ls'//嵌套字面量,更加直观的看到对象中所有的属性
}
//json键必须加双引号。方法的键不加。普通对象如果键有保留字必须加引号
对象的属性和获取
obj.name和obj[‘name’]有什么区别?
[]取值,必须是变量。
.必须是字符串
删除属性:delete obj.name
检测属性
- in运算符,自身属性和继承属性都会返回true
var exist = 'name' in obj;//'name' 是否存在obj
- hasOwnProperty,只能检测自身属性。继承属性不能检测(也就是不能检测原型对象的属性。Person.prototype.color = ‘red’;p1.hasOwnProperty(‘color’))//false,因为color是继承过来的
obj.hasOwnProperty('name');
遍历对象
for(var key in obj){
key;//是键
obj[key];//是值
}
如果用for in遍历数组,那么key就是下标索引,arr[key]就是值
函数
函数定义
- 函数声明
function f() {
}
- 函数表达式
var fn = function () {
}
区别
预解析,提前解析var和function,函数调用位置不同
function比var优先级高
function f1() {
console.log(1111);
}
var f1;
console.log(f);//Function
var f1 = 222;
console.log(f);//222
构造函数
//构造函数
function Person(name,age) {
this.name = name;
this.age = age;
}
//实例化
var tom = new Person('tom','20');
序列化
JSON.stringify();//转成字符串
JSON.parse();//把字符串转对象
深拷贝和浅拷贝
- 与基本类型和引用类型有关
浅拷贝:比如对象的属性改变,那么原始的值也被改变了,影子
深拷贝:比如对象的属性改变,那么原始的值不被改变了,双胞胎 - 数组一级拷贝。二维,数组对象另说
concat() slice() - 深浅拷贝针对的是多级不是一级
- 对象浅拷贝:重写一遍
var a = {id:1}
var b = {};
b.id = a.id;
b.id = 22;