传值传地址的区别
值类型
function show(a) {
console.log(a); // 1
}
let a = 1;
show(a);
function show(a) {
a = 100;
console.log(a); // 100
}
let a = 1;
show(a);
console.log(a); // 1 外面的a不会受影响
引用类型
let user = { name: 'vvvvv' }
function show(user) {
user.name = 'xixi';
console.log(user); // {name: 'xixi'}
}
show(user);
console.log(user); // {name: 'xixi'}
展开语法实现函数参数合并
function upload(params) {
let config = {
type: "*.jpeg,*.png",
size: 10000,
};
params = { ...config, ...params };
console.log(params); // {type: '*.jpeg,*.png', size: 999}
}
upload({ size: 999 });
属性检测
hasOwnProperty只检查自己,in自己和父亲都看
let obj = { name: '后盾人'};
console.log(obj.hasOwnProperty('name')); //true
let arr = ["后盾人"];
console.log(arr.hasOwnProperty("length")); //true
console.log(arr.hasOwnProperty("concat")); //false concat是原型上的数组方法
console.log("concat" in arr); //true
let arr = ["后盾人"];
console.log(arr);
console.log(arr.hasOwnProperty("length")); //true
console.log(arr.hasOwnProperty("concat")); //false
console.log("concat" in arr); //true
使用in原型对象上检测
let obj = {name: "后盾人"};
let hd = {
web: "houdunren.com"
};
//设置hd为obj的新原型
Object.setPrototypeOf(obj, hd);
console.log(obj);
console.log("web" in obj); //true
console.log(obj.hasOwnProperty("web")); //false
补充:Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null。
对象的计算属性
对象属性可以通过表达式计算定义,这在动态设置属性或执行属性方法时很好用 eg: 数组转对象
const lessons = [
{
title: "媒体查询响应式布局",
category: "css",
},
{
title: "FLEX 弹性盒模型",
category: "css",
},
{
title: "MYSQL多表查询随意操作",
category: "mysql",
},
];
let lessonObj = lessons.reduce((obj, cur, index) => {
obj[`${cur["category"]}-${index}`] = cur;
return obj;
}, {})
console.log(lessonObj);
console.log(JSON.stringify(lessonObj,null,2));
没有原型的对象也是存在的
let vv1 = {}
console.log(vv1);
let vv = Object.create(null, {
name: {
value: 'xixi'
}
})
console.log(vv);
Object.create(proto,[propertiesObject])
@proto: 新创建对象的原型对象
@propertiesObject: 可选,传入一个对象
@return 一个新对象,带着指定的原型对象和属性
// 创建一个原型为null的空对象
let o = Object.create(null);