为何JS简写代码仅在变量含'='时生效?不含时返回undefined
嘿,我来帮你拆解一下这个问题哈!
首先咱们先看你写的两段代码为啥会在hashtag.indexOf('=')返回-1时出现undefined的情况:
核心问题:JS的真值判断逻辑
在JavaScript里,只有0、""、null、undefined、NaN、false这些值是“假值”,其他所有值(包括-1)都会被当成“真值”。你代码里的条件hashtag.indexOf('='),当找不到=时返回-1,这个-1会被判断为true,所以会执行冒号前面的分支——但这时候findParam还没被赋值呢!直接调用findParam.split()自然会抛出ReferenceError,最终导致findParam变成undefined。
咱们逐个看你的代码:
第一段代码的问题
var hashtag = getParameterByName('find') var findParam = hashtag.indexOf('=') ? findParam.split('=')[1] : getParameterByName('find');
当hashtag里没有=时,hashtag.indexOf('=')返回-1(真值),执行findParam.split('=')[1],但此时findParam还未定义,直接调用split方法就会报错,结果findParam就是undefined。
第二段代码的问题
var hashtag = getParameterByName('find') var findParam = hashtag.indexOf('=') ? findParam.split('=')[1] : hashtag;
和第一段完全一样的逻辑问题:-1被当成真值,执行未定义变量的split方法,报错后findParam变成undefined。
修正后的代码方案
方案一:修正条件判断逻辑
把条件改成判断indexOf('=') !== -1(即存在=时才拆分),这样就不会走错误分支了:
var hashtag = getParameterByName('find'); var findParam = hashtag.indexOf('=') !== -1 ? hashtag.split('=')[1] : hashtag;
不过这里要注意,如果参数值里有多个=(比如find.aspx?f=something&a=1),split('=')[1]只会取第一个=后面的内容,不符合你“移除最后一个'='前的内容”的需求,所以推荐下面更贴合需求的方案。
方案二:直接取最后一个=后面的内容
用split('=').pop()可以直接拿到最后一个=后面的部分,不管有没有=都能正常工作:
var hashtag = getParameterByName('find'); var findParam = hashtag.split('=').pop();
- 如果没有
=:split后数组只有一个元素,pop()返回原字符串; - 如果有多个
=:pop()返回最后一个=后面的内容,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者XanderMan

