为何在filter函数中用`.`而非`[]`调用对象属性失效?
为什么不能用
.运算符代替[]访问对象属性? 一、.和[]的核心区别
.运算符(点符号):仅支持静态属性名,也就是写代码时就固定的属性名,比如x.name里的name是字面量,无法用变量替代。[]运算符(方括号):支持动态属性名,可以用变量、表达式的结果作为属性名,比如x[prop]里的prop是变量,运行时会取它的实际值(比如你传入的"name")作为属性名去访问对象。
你的第一段代码用x[prop],正是正确的动态属性访问方式,所以能根据传入的prop参数,灵活获取对应属性的值。
二、第二段代码返回[undefined, undefined]的原因
你第二段代码的逻辑完全偏离了目标需求:
function filter(array, prop) { var result = array.map(x=>{ if(x.name===prop){ // 这里是判断x的name属性值是否等于prop参数 return x } }) return result }
当你传入prop="name"时,x.name的实际值是"TV LCD"和"PC",这两个值和字符串"name"完全不相等,导致if条件永远不成立。而map的回调函数如果没有返回值,会默认填充undefined,最终结果自然是[undefined, undefined]。
如果想用点符号实现类似第一段的效果,只能固定写死属性名(比如return x.name),但这样函数就失去了动态性,无法通过prop参数指定不同属性。要保留动态获取属性的能力,必须使用x[prop]的方括号写法。
内容的提问来源于stack exchange,提问作者Bytexr
相关产品推荐
相关产品推荐

