在创建toLowerCase函数时,这种方法比另一种更好吗?

时间:2015-02-12 17:48:16

标签: javascript

Angular为String.toLowerCase创建一个包装器函数我假设它可以被称为角度方法。即。 angular.lowercase(字符串)。看看他们的代码 - 希望得到他们的方法的反馈,如果它比我看到和使用的另一种模式/方法更好。

角度方式

var lowercase = function(string) {
  return isString(string) ? string.toLowerCase : string;
};

lowercase("MYSTRING"); // mystring

另一种方式(我假设将在他们的代码中)

var lowercase = Function.prototype.call.bind(''.toLowerCase);

lowercase("MYSTRING"); // mystring

// notes
// ''.toLowerCase as in String.prototype.toLowerCase
// isString() in 1st function another function in angular 

只是有不止一种方法来烹饪鸡蛋...... 或者它们对第一种方法有什么明显的优势?

1 个答案:

答案 0 :(得分:1)

烹饪鸡蛋当然有不止一种方法,两种解决方案似乎同样“有效”,尽管它们不会做同样的事情,甚至会产生相同的输出。

如果输入数据是字符串,则角度解决方案仅选择尝试小写。我可以看到两个原因。第一个可能不想浪费时间将它传递给小写函数,如果它不是字符串。第二个是小写的副作用是输出,无论输入如何,都以字符串形式返回,也许他们不希望这样。

以下面的代码为例,假设上述两个函数之一:

var example = 1;
if (lowercase(example) + 1 === "11") {...}

通过当前的角度方式,这将返回false(1 + 1 = 2)。 通过另一种方式,这将返回true(“1”+ 1 =“11”)。

至于这是否是预期的副作用,我不知道。它与人们对本机javascript的期望不一致,但在评估方法是否更有利时,应该考虑这一点。

示例

function isString(value) {
  return typeof value === 'string';
}
var lowercase1 = function(string) {
  return isString(string) ? string.toLowerCase() : string;
};


var lowercase2 = Function.prototype.call.bind(''.toLowerCase);

var tests = ["ExAmPlE", "12345", 67890, "true", true, [1, 2, 3], {win: 1, lose: 0}];
var strings = ['"ExAmPlE"', '"12345"', '67890', '"true"', 'true', '[1, 2, 3]', '{bar: 1}'];

for (var i = 0; i < tests.length; i++) {
  var low1 = lowercase1(tests[i]);
  var low2 = lowercase2(tests[i]);
  $('#test').append('<th>' + strings[i] + '</th>');
  $('#ang').append('<td>' + typeof low1 + '</td>');
  $('#nat').append('<td>' + typeof low2 + '</td>');
}
table {
  border-collapse: collapse;
}
table, th, td {
  border: 1px solid black;
}
th, td {
  min-width: 60px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<table>
  <tr id="test">
    <td></td>
  </tr>
  <tr id="ang">
    <th>Angular</th>
  </tr>
  <tr id="nat">
    <th>Native</th>
  </tr>
</table>