0

我认为我的代码的作用很明显。

如果我使用运算符,为什么我的代码会返回一个完整的字符串!==?我知道 Javascript 中的数组从 index 开始,在0这里我输入整个文件名作为参数,所以indexOf(".")总是会更大 then 0。不,我没有在这里传递 .htaccess 文件。

function getFileExtension(i) {

    // return the file extension (with no period) if it has one, otherwise false
   if(i.indexOf(".") !== 0) { // 
       return i.slice(i.indexOf(".") + 1, i.length);
   } else {
       return false;
   }
}

// here we go! Given a filename in a string (like 'test.jpg'),

getFileExtension('pictureofmepdf'); return given string
// both operand are same type and value

但是,如果我将比较更改为

(i.indexOf(".") > 0) // logs false 

PS我的情况是你问的,这是usvsth3m的形式。

4

3 回答 3

2

String 方法indexOf返回(如果已建立)您搜索的字符串的第一个索引,并且记住,索引可以为零,这就是为什么您必须进行严格比较以检查indexOf它是否没有返回布尔值 false

我建议您在lastIndexOf这种情况下使用,因为名为 as 的文件something.min.jsmin.js作为有效扩展名返回,不。

于 2013-10-07T17:30:23.223 回答
2

indexOf()返回子字符串的索引,所以它可以返回0,这意味着子字符串出现在位置0。如果未找到子字符串,则会返回-1,因此请更改您的if语句以反映此逻辑:

if(i.indexOf(".") >= 0)

此外,您应该使用substring()从字符串中提取子字符串 -slice()用于数组。

return i.substring(i.indexOf(".") + 1, i.length);

不过,我认为更好的方法是split()

var fileNameArray = i.split("."); // "foo.txt" --> ["foo" "txt"]
if(fileNameArray.length >= 2) {
    return fileNameArray[1];
} else {
    return false; //maybe you want to return "" instead?
}
于 2013-10-07T17:25:33.530 回答
1

好吧,为了简化,我省略了 indexOf 返回的index,它是 typeof 数字或-1,在未找到给定值的情况下不返回布尔值 FALSE。因此,如果将 -1 与 0 进行比较,结果为真,这就是为什么我实际上得到输出给定字符串的原因,而不是假的。嗯,MDN现在在我的书签栏中

var z = -1;
console.log(z >= 0); // evaluates false because -1 < 0
console.log(z !== 0); // evaluates true because -1 !== 0
// also if z > 0 it is !== 0, but could be < 0 

所以下一个代码就像一个魅力。

function getFileExtension(i) {

    // i will be a string, but it may not have a file extension.
    // return the file extension (with no period) if it has one, otherwise false
   if(i.indexOf(".") >= 0) {
       return i.substring(i.indexOf(".") + 1, i.length);
   } else {
       return false;
   }
}

getFileExtension('pictureofmepdf');
于 2013-10-07T19:29:16.303 回答