Blogger Information
Blog 26
fans 0
comment 0
visits 12173
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
js对象与数组的解构赋值&&Object的访问器属性vs普通属性
高空中的云
Original
337 people have browsed it

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

数组解构赋值

  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
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:作业一直完成的都很好, 继续加油
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post