布尔值返回0或1与其他函数冲突

时间:2014-01-05 15:19:58

标签: javascript function parameters boolean

我创建了一个泛型函数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));

2 个答案:

答案 0 :(得分:1)

  

他们是否可以停止返回数字的布尔值?或者以某种方式将布尔结果保留在low函数

之外

在数字上下文中评估的布尔值(例如true < 10)被隐式强制转换为数字,其数值为:

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

所以true < 10评估为1 < 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

答案 1 :(得分:0)

这是一种方法:

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;
相关问题