call apply bind
// call apply bind 更改方法里面this的指向
let obj1 = {
name:'李现',
age:30,
sayHi(a,b){
console.log(`Hi!我叫${this.name},今年${this.age}岁。${a}-${b}`);
}
}
let obj2 = {
name:'彭于晏',
age:32
}
// 使用call()改变方法里面,this的指向
// call()方法的第一个参数必须是指定的对象,方法的原有参数,挨个放在后面
obj1.sayHi.call(obj2,200,100)
let obj3 = {
name:'胡歌',
age:35
}
// 使用apply(),也可以改变方法里面this的指向,第一个参是指定的对象,方法的原有参数,统一放到第二个数组参数中
obj1.sayHi.apply(obj3,[200,100])
let obj4 = {
name:'胡军',
age:40
}
// 使用bind(),也可以改变方法里面this的指向,用法给call()一样
// call()是直接运行方法,bind()是返回新的方法,然后再重新调用。
obj1.sayHi.bind(obj4,200,100)()
将一个对象转为字符串
//定义一个对象
let obj1 = {}
//给对象添加属性有两种方式:
obj1.name = '张三'
console.log(obj1);
obj1['age'] = 20
console.log(obj1);
console.log('----------------------------------');
//定义一个手机对象
let phone = {
name: "小米10",
color: '红色',
size: '1000*200*500',
price: '2999'
}
//转成下面的字符串
//"name=小米10&color=红色&size=1000*200*500&price=2999"
// for in 循环,可以遍历出对象的所有key(key就是属性名称)
//方式一:
let arr = [] // 定义一个空数组
for(let key in phone){
//获取对象的属性值,可以通过['属性名']
arr.push(key+'='+phone[key])
}
let str = arr.join('&')
console.log(str);
//方式二:
// Object.keys方法,用于返回对象的所有属性名,返回值是一个数组
let keys = Object.keys(phone)
// Object.values,用于返回对象的所有属性值,返回值是一个数组
// let values = Object.values(phone)
let arr2 = keys.map(function(k){
return [k,phone[k]].join('=')
})
let str2 = arr2.join('&')
console.log(str2);
//方法二:简化写法
let str3 = Object.keys(phone).map(k=>[k,phone[k]].join('=')).join('&')
console.log(str3);
统计字符串中每个字符串出现的次数
//字符串
let str = "fasdfsadfsegsageqwgersfdhrhdfsergterwhefweteqheq"
//对象
let obj = {}
// 循环字符串中的所有的字符串
for(let i=0;i //根据字符的名称,查找对象中,有没有对应的属性 if(obj[str[i]]){ //如果有,对应的属性值加1 obj[str[i]]++ }else{ //如果没有,添加这个属性,属性值赋为1 obj[str[i]] = 1 } } console.log(obj); console.log('-----------------------'); //定义一个出现次数最多的字符对象 let max = { name:'', count:0 } Object.keys(obj).forEach(k=>{ //判断是否有别的字符串大于max if(obj[k]>max.count){ max.name = k max.count = obj[k] } }) console.log(max); 结果为: //定义数组 let arr1 = [11,22,33,44,55] console.log(arr1); //定义对象 let obj1 = { name:'张三', age:20, sayHi:function(){ console.log(`Hi!我叫${this.name},今年${this.age}岁`); } } console.log(obj1); obj1.sayHi() obj1.name = '李四' obj1.age = 30 obj1.sayHi() console.log('------------------------------'); let arr2 = [ { name:'张三', age:20 }, { name:'李四', age:22 }, { name:'王五', age:24 } ] console.log(arr2); // 定义一个学生管理对象 let studentManager = { //定义一个学生数组 students:[ { no:'1001', name:'张三', age:22, sex:'男' }, { no:'1002', name:'李四', age:24, sex:'女' }, { no:'1003', name:'王五', age:26, sex:'男' } ], //显示所有学生信息的方法 show:function(){ let str = "学号 姓名 年龄 性别\n" // 循环出所有的学生信息,并拼接到str中 this.students.forEach(s=>{ str+=`${s.no} ${s.name} ${s.age} ${s.sex}\n` }) alert(str) }, //添加学生信息的方法 add:function(){ //输入学生的基本信息 let no = prompt('请输入学号:') //判断学号是否重复 let index = this.students.findIndex(r=>r.no===no) while(index!==-1){ no = prompt('学号重复!请重新输入学号:') index = this.students.findIndex(r=>r.no===no) } let name = prompt('请输入姓名:') let age = parseInt(prompt('请输入年龄:')) let sex = prompt('请输入性别:') // 创建学生对象 let stu = { no:no, name:name, age:age, sex:sex } // 将学生对象添加到数组中(学号不能重复) this.students.push(stu) alert('添加成功!') }, //修改学生信息的方法 update:function(){ //输入学生的基本信息 let no = prompt('请输入学号:') //根据学号,到数组中查找并返回指定的学生对象 let stu = this.students.find(r=>r.no===no) //根据学号判断,有没有找到该学生,找到了修改该学生的其他信息,没有找到提示学号不存在 while(!stu){ no = prompt('您输入的学号不存在,请重新输入:') stu = this.students.find(r=>r.no===no) } stu.name = prompt('请重新输入该学生的姓名:') stu.age = parseInt(prompt('请重新输入该学生的年龄:')) stu.sex = prompt('请重新输入该学生的性别:') alert('修改成功!') }, //删除学生信息的方法 delete:function(){ //输入学生的基本信息 let no = prompt('请输入学号:') //查找该学生在数组中的位置 let index = this.students.findIndex(r=>r.no===no) while(index===-1){ no = prompt('学号不存在!请重新输入学号:') index = this.students.findIndex(r=>r.no===no) } this.students.splice(index,1) alert('删除成功!') }, //系统主菜单方法 menu:function(){ //接收用户的输入 let no = prompt('*****学生管理系统*****\n1.查询学生 2.添加学生 3.修改学生 4.删除学生 0.退出系统') //判断用户输入的是什么 switch(no){ case '1': //调用显示所有学生信息的方法 this.show() break; case '2': //调用添加学生信息的方法 this.add() break; case '3': //调用修改学生信息的方法 this.update() break; case '4': //调用删除学生信息的方法 this.delete() break; default: alert('成功退出系统!欢迎下次使用!') return //跳转整个方法 } // 再次调用自身方法(递归) this.menu() } } // 使用学生管理对象,调用menu方法 studentManager.menu()对象数组
// 对象数组,指的是数组里面存放的是对象
综合案例:学生管理系统