javascript - 为什么这段函数运行的不符合预期?
巴扎黑
巴扎黑 2017-04-11 13:18:23
[JavaScript讨论组]
var a = ["a","b","c"];
var b = ["a","b"];

function diff(arr1,arr2){
    var newArr = arr1.length>=arr2.length?arr1:arr2.filter(function(ele){
     if(arr1.length>=arr2.length?arr2:arr1.indexOf(ele)==-1){
          return ele
      }
    }) 
    
    return newArr; 
}

diff(a,b)

结果是

["a", "b", "c"]

a.filter(function(ele){
      if(b.indexOf(ele)==-1){
          return ele
      }
})

的结果是
["c"]

在函数中

arr1.length>=arr2.length?arr1:arr2

结果确实是数组a。

arr1.length>=arr2.length?arr2:arr1

也确实是数组b

但运行结果却是不一样。这是为什么?

巴扎黑
巴扎黑

全部回复(2)
ringa_lee

因为.运算符的优先级高于:运算符啊,
var newArr = arr1.length>=arr2.length?arr1:arr2.filter实际上是
var newArr = arr1.length>=arr2.length?arr1:(arr2.filter)
你要的是(var newArr = (arr1.length>=arr2.length?arr1:arr2).filter)
看懂了吗?

ringa_lee

貌似楼主的需求是要对a,b数组中的不同元素作为函数执行的结果返回。
1、楼上兄弟说的运算符优先级问题,但是首先.是不是运算符有待讨论,翻了下犀牛书下,没发现把.归在运算符中,而是称之为调用表达式。但从楼主的意图看,的确如1楼兄弟所说,楼主可能认为是先运算了?:操作,再执行的filter函数。
2、第一,在这段代码中,>=的优先级要高于?:,所以先运算这部分,根据它的结果来决定执行赋值,是赋arr1,还是arr2.filter()之后的结果。第二,filter的写法有点怪怪的,虽然这么写也没有什么问题。
filter返回一个新的数组,不会对原数组进行修改,返回的数组的元素就是通过了传入的函数真值检测的值。
第一段中,如果arr1的长度大了,返回一个数组,结果必定是true,如果arr2的长度大了,会检测arr1中的是否包含传入的元素,结果为true,返回了这个元素。绕到这才看的明白,函数要对arr2过滤,返回和arr1中相同的元素。那么问题来了,第一,从这段代码中无法保证filter函数中的返回值符合预期,因为通过了filter中条件后return回去的ele不能保证一定为true,比如ele是0,undefined,null等。而没有通过if条件检测时则隐式的返回了undefined,也就是false。所有感觉怪怪的。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号