js对象如何通过变量读取属性

本文介绍了JavaScript中通过.和[]操作符读取对象属性的基本方法,并探讨了如何在函数中动态根据参数属性名修改对象值。通过实例演示了`obj.a`的undefined行为以及使用[type]访问对象属性的技巧。

先看看js读取属性的常见的方法。

1.通过.的方式读取

let obj = {
  name:"javascript",
  price:20000
}
console.log(obj.name,obj.price)

2.通过[变量名]的方式读取

let obj = {
  name:"javascript",
  price:20000
}
console.log(obj['name'],obj['price'])

如果有这样一段代码,输出结果会是什么呢?

let a = 'name
let obj = {
    name:"javascript"
}
console.log(obj.a)

结果如下:

为什么是undefined,而不是JavaScript,英文obj.a的意思是obj['a'],他是去找obj里面的a这个属性,而不会把a当作一个变量,这是关键。如果是obj[a]的话结果就是'javascript' ,obj[a]等价于obj['name']等价于obj.name。

 

好,如果我们要给一个函数传参数,参数是一个对象,对象的属性是一个变量该如何传递。看下面的代码。

//这是一个将表格中某一个输入框内的小写字母变为大写字母的函数
const lowerToUpper = (type,value)=>{
    //form1就是那个表格,setFieldsValue是改变表格值的方法,参数是一个对象,你想要改变那个一输入框的值,就把该输入框的name属性的值当作key,输入框的值当作value传递.
   /*
    form1.setFieldsValue({
      password:value.toUpperCase()//就是把name值为password的输入框的值改为大写
    })
    */

    //当传递的type不同时,要进行改变的输入框也就不同(可能是在操作不同的输入框),这时候我们读取type值作为对象的属性就要使用[type]的方法才能正确拿到不同的属性
    form1.setFieldsValue({
      [type]:value.toUpperCase()
    })
  }

JavaScript 中,优化对象属性读取可以从多个方面入手,以下是一些常见的优化方法: ### 缓存属性值 当需要多次读取同一个对象属性时,将该属性值缓存到一个局部变量中,避免重复的属性查找操作,从而提高性能。 ```javascript const myObject = { prop1: 'value1', prop2: 'value2', prop3: 'value3' }; // 未优化 for (let i = 0; i < 1000; i++) { const value = myObject.prop1; // 使用 value 进行一些操作 } // 优化后 const cachedValue = myObject.prop1; for (let i = 0; i < 1000; i++) { const value = cachedValue; // 使用 value 进行一些操作 } ``` ### 使用对象解构赋值 对于需要同时读取对象的多个属性的情况,使用解构赋值可以使代码更简洁,同时可能会有一定的性能提升。 ```javascript const myObject = { name: 'John', age: 30, city: 'New York' }; // 未优化 const name = myObject.name; const age = myObject.age; const city = myObject.city; // 优化后 const { name, age, city } = myObject; ``` ### 避免嵌套过深的属性访问 如果对象属性嵌套层次过深,每次访问都需要进行多层查找,会影响性能。可以将嵌套属性提前提取出来。 ```javascript const myObject = { level1: { level2: { level3: { prop: 'value' } } } }; // 未优化 const value = myObject.level1.level2.level3.prop; // 优化后 const level2Obj = myObject.level1.level2; const value = level2Obj.level3.prop; ``` ### 使用 Map 替代普通对象 当需要频繁地进行属性读取和查找操作时,使用 `Map` 对象可能会比普通对象有更好的性能,特别是在处理大量数据时。`Map` 的查找操作的时间复杂度是 O(1)。 ```javascript const myMap = new Map(); myMap.set('key1', 'value1'); myMap.set('key2', 'value2'); const value = myMap.get('key1'); ``` ### 使用 Proxy 对象进行拦截和优化 可以使用 `Proxy` 对象来拦截属性读取操作,进行一些额外的优化处理,如缓存、验证等。 ```javascript const target = { prop1: 'value1', prop2: 'value2' }; const cache = new Map(); const handler = { get(target, property) { if (cache.has(property)) { return cache.get(property); } const value = target[property]; cache.set(property, value); return value; } }; const proxy = new Proxy(target, handler); const value = proxy.prop1; // 第一次读取,会进行缓存 const anotherValue = proxy.prop1; // 第二次读取,直接从缓存中获取 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值