博客列表 >js对象与数组的解构赋值&&Object的访问器属性vs普通属性

js对象与数组的解构赋值&&Object的访问器属性vs普通属性

高空中的云
高空中的云原创
2022年11月04日 02:51:52335浏览

实例演示对象与数组的解构赋值

数组解构赋值

  1. let [brand,price] = ['苹果手机',8848];
  2. console.log(brand,price);
  3. // 苹果手机 8848
  4. // 更改数组参数的值
  5. [brand,price] = ['Huawei',8008];
  6. console.log(brand,price);
  7. // Huawei 8008
  8. console.log('--------------');
  9. // 1. 值数量 < 变量数量, 默认值
  10. [brand, price, stock = 99] = ['Xiaomi', 9988];
  11. console.log(brand, price, stock);
  12. // Xiaomi 9988 99
  13. // 2. 值数量 > 变量数量, ...rest
  14. [brand, ...arr] = ['Oppo', 6688, 99];
  15. console.log(brand, arr);
  16. // Oppo [ 6688, 99 ]
  17. console.log(brand, ...arr);
  18. // Oppo 6688 99
  19. console.log('--------------');
  20. console.log('-----交换变量----');
  21. //? 应用场景: 交接二个数
  22. let x = 10
  23. let y = 20
  24. console.log(`x = ${x}, y = ${y}`);
  25. [y, x] = [x, y];
  26. console.log(`x = ${x}, y = ${y}`);

对象解构赋值

  1. // ? 变量名 === 属性名
  2. let { brand, price } = { brand: "Apple", price: 5000 };
  3. console.log(brand, price); // Apple 5000
  4. ({ brand, price } = { brand: "华为", price: 6000 });
  5. console.log(brand, price); // 华为 6000
  6. let { stock, price: uniPrice } = { stock: 100, price: 8000 };
  7. console.log(stock, uniPrice); // 100 8000
  8. console.log('-----------------');
  9. // ? 应用场景1: 克隆对象
  10. let phone = { brand: 'Vivo', price: 8008 };
  11. console.log(phone); // { brand: 'Vivo', price: 8008 }
  12. let { ...obj } = phone;
  13. console.log(obj); // { brand: 'Vivo', price: 8008 }
  14. console.log('-----------------')
  15. // ? 应用场景2 : 解构传参
  16. let show = function (phone) {
  17. // user 是一个对象
  18. return `手机品牌: ${phone.brand} 价格:${phone.price}元`
  19. }
  20. phone = { brand: '诺基亚', price: 198 }
  21. console.log(show(phone)) // 手机品牌: 诺基亚 价格:198元
  22. // * 使用对象解构进行简化传参
  23. show = function ({ brand, price }) {
  24. // user 是一个对象
  25. return `手机品牌: ${brand} 价格:${price}元`
  26. }
  27. phone = { brand: '索尼', price: 498 }
  28. console.log(show(phone)) // 手机品牌: 索尼 价格:498元

实例演示访问器属性,并描述与普通属性之间的区别与联系

样例

  1. let phone = {
  2. info : {
  3. brand : 'Huawei',
  4. price : 998,
  5. },
  6. //访问器属性写法,前边加个get
  7. //如 get getInfo()...;后续如果调用,只需要写 .getInfo即可,区别于.getInfo()
  8. getInfo() {
  9. return {
  10. brand: this.info.brand,
  11. price: this.info.price
  12. }
  13. },
  14. //访问器属性写法,前边加个set
  15. // 如 set setPrice(price)...;后续如果调用,则需要用.setPrice = value,区别于.setPrice(value)
  16. setPrice(price){
  17. if(price >= 100 && price <=20000){
  18. this.info.price = price
  19. }else{
  20. console.log("你这手机价格就离谱")
  21. }
  22. },
  23. }
  24. console.log(phone.info.price)
  25. // 998
  26. console.log(phone.getInfo())
  27. // { brand: 'Huawei', price: 998 }
  28. phone.setPrice(699)
  29. console.log(phone.getInfo())
  30. // { brand: 'Huawei', price: 699 }

个人认为,
访问器属性和普通属性的区别在于:访问器属性增加对象的”函数方法”.
联系在于:当自定义了访问器属性值的configurable=false,则不可以被转化为普通属性;普通属性在被转化为访问器属性后,普通属性的value和writable就会被废弃

以下内容不是很理解,先放在这里

数据属性有 value,configurable,enumerablewritable**

  • Value
    包含这个属性的数据值。读取属性值的时候,从这个位置读取,写入值得时候,把新值保存在这个位置。这个特性得默认值为undefined

  • Configurable
    表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。直接在对象上定义的属性,它们的这个特性默认值为true

  • Enumerable
    表示能否通过for-in循环返回属性,直接在对象上定义的属性,它们的这个特性默认值为true

  • Writable
    表示能否修改属性的值,直接在对象上定义的属性,它们的这个特性默认值为true

访问器属性有get,set,其他还有configurableenumerable(类同数据属性)

  • get
    必须是一个函数,负责返回有效的值
  • set
    必须是一个函数,负责处理数据

普通属性可以和访问器属性互相转化[前提比较多,比如必须是通过Object.defineProperty来进行操作]

  • 给已有的普通属性(例如,getInfo 和 setPrice)可以通过添加 get和set转换为访问器属性,但是转换的同时,原有的普通属性的value,writable 属性值会被舍弃掉,会使用访问器属性的默认值
  • 访问器属性转为普通属性,前提是configurable特性值为true.只需要给现有的访问器属性设置value或writable这两个属性描述中的任意一个即可,其get和set就会被废弃,从而转为普通属性

其他

  • Array.prototype.map()Array.prototype.forEach()区别

    forEach() 针对每一个元素执行提供函数,不会返回执行结果
    map() 创建一个新的数组,其中每个数组由调用数组中的每一个元素执行提供函数得来,即:得到一个新数组,并返回

    1. let arr = [1,2,3,4,5]
    2. arr.forEach((num,index) =>{
    3. return (arr[index] = num * 2)
    4. })
    5. console.log(arr) // arr = [2,4,6,8,10]
    6. let doubled = arr.map(num => {
    7. return num*2
    8. })
    9. console.log(doubled)
    10. // doubled = [4,8,10,16,20] ,
    11. // 因为forEach 已经让arr翻倍了
    12. // 这时候如果打印arr,仍然是[2,4,6,...]
  • 为什么模板函数中字符串字面量数组长度=变量数组长度+1

    是为了保证返回值肯定是一个拼接字符串(需要借助’ ‘来和数字一起拼字符串),举个极端的例子

    1. // 声明一个模板函数
    2. const sum = function (strings, ...args) {
    3. // 字面量数组
    4. console.log(strings)
    5. console.log(strings.length)
    6. // 变量表达式数组
    7. console.log(args)
    8. console.log(args.length)
    9. }
    10. let num = 10
    11. sum `${num}`
    12. // 打印结果如下
    13. // [ '', '' ]
    14. // 2
    15. // [ 10 ]
    16. // 1
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议