起因:见到一个题目,发现竟然用字符串比较的方式确定相同得公共前缀
//题目 编写一个函数来查找字符串数组中的最长公共前缀
//输入: ["flower","flow","flight"]
//输出: "fl"
var longestCommonPrefix = function(strs) {
if (strs === null || strs.length === 0) return "";
if(strs.length === 1) return strs[0]
let min = 0, max = 0
for(let i = 1; i < strs.length; i++) {
//解题思路: 获取数组中的最大值及最小值字符串,最小字符串与最大字符串的最长公共前缀也为其他字符串的公共前缀,即为字符串数组的最长公共前缀
//例如 abc 、 abcd 、ab 、ac ,最小 ab 与最大 ac 的最长公共前缀一定也是 abc 、 abcd 的公共前缀
if(strs[min] > strs[i]) min = i
if(strs[max] < strs[i]) max = i
}
for(let j = 0; j < strs[min].length; j++) {
if(strs[min].charAt(j) !== strs[max].charAt(j)) {
return strs[min].substring(0, j)
}
}
return strs[min]
};
首先要明确,js中不同类型间是可以比较的,并且会针对不同类型作隐式转换
直接上总结:
- 比较对象中存在对象时,都会调用对象的toString()方法,转换成字符串进行比较;
- 比较对象中存在数字时,都会给不是数字的先调用Number()方法,转换成数字再进行比较;
- 字符串之间进行比较则是比较他们的第一个不同的ascii码
接下来看例子
- 对象与字符串
let obj = {z:1}
obj.toString = function(){
console.log('toString被调用了')
return Object.prototype.toString.call(this)
}
console.log(obj < 'obj')
// toString被调用了
// true
-
如果将字符串与数字进行比较,那么在做比较时 JavaScript 会把字符串转换为数值。空字符串将被转换为 0。非数值字符串将被转换为始终为 false 的 NaN。
-
题目中遇到的采用第三种 ascii码,区分大小写,大写字母A在65,小写字母a在97