在创建 toLowerCase 函数时,一种方式比另一种方式更好

Is one way better than the other when creating a toLowerCase function?

本文关键字:一种 方式比 另一种 更好 方式 toLowerCase 创建 函数      更新时间:2023-10-01

Angular 为 String.toLowerCase 创建了一个包装函数,因此它可以作为 Angular 方法调用。查看他们的代码 - 想获得有关他们方法的反馈,以及它是否比我看到和使用的其他模式/方法更好。

角路

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 

只是煮鸡蛋的方法不止一种......还是它们比第一种方法有什么明显的优势?

煮鸡蛋的方法肯定不止一种,两种解决方案似乎同样"有效",尽管它们并不完全做同样的事情,甚至不能产生相同的输出。

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

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

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>