1.对象数组
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);
2.学生管理系统
//定义一个学生管理对象
let studentManager = {
//定义一个学生数组
student:[
{
no:'1001',
name:'张三',
age:22,
sex:'女'
},
{
no:'1002',
name:'李四',
age:24,
sex:'女'
},
{
no:'1003',
name:'王五',
age:26,
sex:'男'
}
],
//显示所有学生信息的方法
show:function(){
let str = "学号 姓名 年龄 性别\n"
this.student.forEach(r=>str += Object.values(r).join(' ') + '\n')
alert(str)
},
//添加学生信息的方法
add:function(){
let no = prompt('请输入学号:')
//判断学号是否重复
let index = this.student.findIndex(r=>r.no===no)
while(index!==-1){
no = prompt('学号重复!请重新输入学号:')
index = this.student.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.student.push(stu)
alert('添加成功!')
},
//修改学生信息的方法
update:function(){
let no = prompt('请输入学号:')
//判断学号是否重复
let index = this.student.find(r=>r.no===no)
while(!index){
no = prompt('学号不存在!请重新输入学号:')
index = this.student.find(r=>r.no===no)
}
index['name'] = prompt('请输入姓名:')
index['age'] = parseInt(prompt('请输入年龄:'))
index['sex'] = prompt('请输入性别:')
alert('修改成功!')
},
//修改学生信息的方法
delete:function(){
let no = prompt('请输入学号:')
//判断学号是否重复
let index = this.student.findIndex(r=>r.no===no)
while(index===-1){
no = prompt('学号不存在!请重新输入学号:')
index = this.student.findIndex(r=>r.no===no)
}
this.student.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':
alert(4)
break;
default:
alert('成功退出系统!欢迎下次使用!')
return //跳出整个方法
}
//再次调用自身方法(递归)
this.menu()
}
}
//使用学生管理对象,调用menu方法
studentManager.menu()
3.值类型和引用类型
// 值类型:string,number,boolean
let num1 = 100
let num2 = num1 //num2的值由num1传入
console.log(`num1=${num1},num2=${num2}`);
num2 = 200 //num2的值重新修改后,num1不受影响
console.log(`num1=${num1},num2=${num2}`);
console.log('--------------------------');
//引用类型:数组,对象
let obj1 = {
name:'张杰',
age:20,
sex:'男'
}
//将obj1传给obj2,其实传的是obj1的地址
let obj2 = obj1
console.log('obj1',obj1);
console.log('obj2',obj2);
console.log('---------');
//修改obj2的属性值,obj1也会发生变化,因为obj1和obj2的地址是一样的。
obj2.name = '谢娜'
obj2.age = 25
obj2.sex = '女'
console.log('obj1',obj1);
console.log('obj2',obj2);
console.log('---------');
obj2 = {
name:'周杰伦',
age:35,
sex:'男'
}
console.log('obj1',obj1);
console.log('obj2',obj2);
4.js经典面试题
1.
console.log(a) //undefined
var a = 12
function fn() {
console.log(a) //undefined
var a = 13
}
fn()
console.log(a) //12
2.
console.log(a) //undefined
var a = 12
function fn() {
//注意:当前作用域里面没有a,就会到上一层作用域里面去寻找a
console.log(a) //12
a = 13
}
fn()
console.log(a) //13
3.
// console.log(a) //报错
let a = 12 //let定义的变量,不存在提升
function fn() {
// console.log(a)
//报错,注意:只要是当前作用域里面的存在的变量,就不会去上层作用域找了
let a = 13 //let定义的变量,不存在提升
}
fn()
console.log(a)
4.
// console.log(a) //报错
a = 12 // 定义变量可以不使用任何关键字,但是在定义该变量之前,不能使用该变量
(这是一种不规范写法)
function fn() {
// console.log(a) //报错
let a = 13
}
fn()
console.log(a)
5.
var foo = 1
function bar() {
if (!foo) {
var foo = 10 //这个foo会提升到当前作用域的顶部定义
}
console.log(foo) //10
}
bar()
6.
var foo = 1
function bar() {
if (!foo) {
foo = 10
}
console.log(foo) //1
}
bar()
7.
var n = 0
function a() {
var n = 10 //11 12
function b() {
n++ //11 12
console.log(n) //11 12
}
b()
return b
}
var c = a()
c()
console.log(n) // 0
8.
var a = 10
var b = 11
var c = 12
function test(a) {
a = 1
var b = 2 //方法里面的作用域b是2
c = 3 //会将外层作用域的c的值换掉
}
test(10)
console.log(a) // 10
console.log(b) // 11
console.log(c) // 3
9.
// in关键字,用于检查一个属性是否包含在指定的对象中,如果包含就返回true
if (!('a' in window)) {
var a = 10
}
console.log(a)
10.
var a = 4
function b(x, y, a) {
console.log(a) // 打印形参的值 3
arguments[2] = 10 // 又将形参a改成而来 10
console.log(a) // 10
}
a = b(1, 2, 3) //b方法,没有返回任何内容,默认返回undefined
console.log(a) //undefined
11.
var a = 9
function fn() {
// 1 2
a = 0
return function (b) {
// 5 + 1
// 5 + 0
return b + a++
}
}
var f = fn()
console.log(f(5)) //5
console.log(fn()(5)) //5
console.log(f(5)) //6
console.log(a) //2
12.
var ary = [1, 2, 3, 4]
function fn(ary) {
ary[0] = 0 // 修改了原数组中第一位的值
ary = [0] // arr形参重新赋值一个新的数组
ary[0] = 100 // 形参arr再修改第一个位置的值,就跟原数组没关系
return ary
}
var res = fn(ary) // [100]
console.log(ary) // [0,2,3,4]
console.log(res) // [100]
13.
// 10->11
function fn(i) {
// 30
return function (n) {
console.log(n + i++) //41
}
}
var f = fn(10)
f(20) //30
fn(20)(40) //60
fn(30)(50) //80
f(30) //41
14.
// var定义的变量会成为window对象的属性,var定义函数也会成为window对象的方法
var num = 10 //60 65
var obj = { num: 20 } // 30
// 20 21
obj.fn = (function (num) {
//this->window
this.num = num * 3
num++ // 21
// 5 10
return function (n) {
this.num += n // 30
num++ //22 23
console.log(num) //22 23
}
})(obj.num)
var fn = obj.fn
console.log(fn) //function(n){this.num +=n;num++;console.log(num)}
fn(5) // 22
obj.fn(10) //23
console.log(num, obj.num) //65 30
15.
var fullName = 'language'
var obj = {
fullName: 'javascript',
prop: {
getFullName: function () {
return this.fullName
}
}
}
console.log(obj.prop.getFullName()) // undefined
// 将getFullName方法传给test
var test = obj.prop.getFullName
console.log(test()) // language
16.
// var定义的变量会成为window的属性
var name = 'window'
var Tom = {
name: "tom",
show: function () {
console.log(this.name) // window
},
wait: function () {
var fun = this.show
fun()
}
}
Tom.wait() // window