【问题标题】:boolean returning 0 or 1 clashes with other function返回 0 或 1 的布尔值与其他函数冲突
【发布时间】:2014-01-05 15:19:58
【问题描述】:

我创建了一个通用函数filter(arr, func),它使用给定函数作为参数过滤数组。只有那些 func(elem) 返回 true 的元素才应该组成一个新数组。

问题在于,如果数组项小于 10,low function 返回 true,如果数组项是布尔值,bool function 返回 true。由于布尔值在 javascript 中返回 1 或 0,这与我的 low function 冲突。

我可以阻止布尔值返回数字吗?或以某种方式将布尔结果排除在low function

之外
var array = [4, 8, 'bob', true, 'stink', 55, false, 'pepo', 11];
function low(val) {
return val < 10;
}

function word(str) {
 if(typeof str == 'string')
    return true; 
}

function bool(b) {
 if (typeof b == 'boolean')
    return true;
}

function filter(arr, func) {

   var newArr = [];

   for(var i = arr.length; i >= 0; i--) {
      var result = func(arr[i]);
      if(result == true) {
        newArr.push(arr[i]);    
    }
}
return newArr;
}

alert(filter(array, low));

【问题讨论】:

  • 你应该使用三个 === 与 typeof... 比较时,即 if (typeof myVar === "undefined") { ... }
  • val &lt; 10 将始终是 truefalse,而不是 10

标签: javascript function parameters boolean


【解决方案1】:

我可以阻止布尔值返回数字吗?或者以某种方式将布尔结果排除在 low 函数之外

在数字上下文中计算的布尔值(例如true &lt; 10)被隐式强制转换为数字,它们的数值为:

Number(true) === 1
Number(false) === 0

所以true &lt; 10 的计算结果为1 &lt; 10,这是真的。

您可以在进行比较之前检查传递的参数是否为数字:

function low(val) {
    return typeof val == 'number' && val < 10;
}

我还要注意 ES5 有一个内置的 Array#filter 方法,它可以让你的生活更轻松:

var filteredArray = array.filter(low).reverse();
//reverse() because of the inverse iteration in your original filter function

【讨论】:

    【解决方案2】:

    这是一种方法:

    var array = [4, 8, 'bob', true, 'stink', 55, false, 'pepo', 11];
    function low(val) {
        return bool(val) === false ? val < 10 : false;
    }
    
    function word(str) {
        return typeof str === 'string' ? true : false;
    }
    
    function bool(b) {
        return typeof b === 'boolean' ? true : false;
    }
    
    function filter(arr, func) {
    
       var newArr = [];
    
       for(var i = arr.length; i >= 0; i--) {
          var result = func(arr[i]);
          if(result === true) {
            newArr.push(arr[i]);    
        }
    }
    return newArr;
    }
    
    
    alert(filter(array, low));
    

    还为小提琴添加了代码:http://jsfiddle.net/3AS4d/ 并使用“===”检查而不是“==”,因此值将与实际类型进行比较而无需转换。

    另请注意,您的函数(例如 bool)将在布尔值上返回 true,但在任何其他值上返回 undefined

    function bool(b) {
        if (typeof b === 'boolean')
            return true;
    }
    
    bool(true); // true
    bool("haa"); // undefined
    

    这就是我推荐这些方法的原因,比如:

    function bool(b) {
        if (typeof b === 'boolean')
            return true;
        return false; // important
    }
    

    或者像我喜欢的那样,用单行表示法:

    some condition ? true : false;
    

    这里的例子:

    function bool(b) {
        return typeof b === 'boolean' ? true : false;
    }
    

    或分配给变量:

    var myVar = 1000 > 0 ? 1 : 0; // will result myVar to be 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-28
      • 2017-11-13
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多