对象(Object)类型
function test(person) {//函数传参,传递的是对象的指针副本
person.age = 26
person = {//p1作为入参,此时重新赋值
name: 'yyy',
age: 30
}
return person
}
const p1 = {
name: 'yck',
age: 25
}
const p2 = test(p1)
undefined
p2
{name: "yyy", age: 30}
p1
{name: "yck", age: 26}//震惊!!
typeof 是否能正确判断类型?不能
typeof console.log
"function"
typeof null
"object" //null:指向空对象的指针,{}才是空对象
(已声明但未赋值是:undefined)
instanceof 能正确判断对象的原理是什么? 内部机制是通过原型链来判断的
A instanceof B :B是否在A的原型链上
闭包:函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包。
for (var index = 0; index < 5; index++) {
console.log(index);
}
VM138:2 0
VM138:2 1
VM138:2 2
VM138:2 3
VM138:2 4
for (var i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i)//因为 setTimeout 是个异步函数,所以会先把循环全部执行完毕
},1000)
}
5VM179:3 6
解决方案一:
for (var i = 1; i <= 5; i++) {
(function(j){
setTimeout(function timer() {
console.log(j)
}, j * 1000)
})(i) //使用立即执行函数,将i绑定到函数内部
}
undefined
VM184:4 1
VM184:4 2
VM184:4 3
VM184:4 4
VM184:4 5
解决方案二:
for (var i = 1; i <= 5; i++) {
setTimeout(
function timer(j) {
console.log(j)
},
i * 1000,
i //将i作为参数传入setTimeout的第一个参数
)
}
解决方案三:
for (let i = 1; i <= 5; i++) { //let有块级作用域
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}
回顾: var: 1存在变量提升 2无块级作用域 3可重复声明
if(1){
var a=2
}
console.log(a);
VM237:4 2
let: 1无变量提升 2有块级作用域 3可重复声明
if(1){
let aaa=2
}
console.log(aaa);
VM314:4 Uncaught ReferenceError: aaa is not defined
at <anonymous>:4:13
const: 1无变量提升 2有块级作用域 3禁止重复声明 4只能声明常量,一旦声明不可再次修改其值。(const声明对象时,可修改对象)
const obj={
name:'dfd',
setName:function (params) {
console.log(this.name);
}
}
obj.name='qgz'
"qgz"
obj['age']=11
11
obj
{name: "qgz", age: 11, setName: ƒ}
浅拷贝
Object.assign
let a = {
age: 1
}
let b = Object.assign({}, a)
a.age = 2
2
b
{age: 1}
b=a //给了指针
{age: 2}
b
{age: 2}
...扩展符
let b = { ...a }
let a = {
age: 1,
jobs: {
first: 'FE'
}
}
let b = { ...a }//浅拷贝只解决了第一层的问题
a.jobs.first = 'native'
"native"
b
{age: 1, jobs: {…}}
age: 1
jobs:
first: "native"//第二层中还有对象的话,会享有相同的地址
__proto__: Object
__proto__: Object