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
只是有不止一种方法来烹饪鸡蛋...... 或者它们对第一种方法有什么明显的优势?
答案 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>