确定单词是否为保留Javascript标识符

确定单词是否为保留Javascript标识符,javascript,keyword,reserved-words,Javascript,Keyword,Reserved Words,在Javascript中,是否可以确定某个字符串是否是保留的语言关键字,例如开关,如果,函数,等等。? 我想做的是在动态生成的代码中转义保留标识符,这种转义方式不会破坏特定于浏览器的扩展。 我唯一想到的是在try-catch块中使用eval,并检查语法错误。但我不知道该怎么做。有什么想法吗?一个选择是: var reservedWord = false; try { eval('var ' + wordToCheck + ' = 1'); } catch { reservedWord =

在Javascript中,是否可以确定某个字符串是否是保留的语言关键字,例如
开关
如果
函数
,等等。? 我想做的是在动态生成的代码中转义保留标识符,这种转义方式不会破坏特定于浏览器的扩展。
我唯一想到的是在try-catch块中使用
eval
,并检查语法错误。但我不知道该怎么做。有什么想法吗?

一个选择是:

var reservedWord = false;
try {
  eval('var ' + wordToCheck + ' = 1');
} catch {
  reservedWord = true;
}
唯一的问题是,这将为无效变量名但不是保留字的字提供假阳性


正如评论中指出的,这可能是一种安全风险。

一种选择是:

var reservedWord = false;
try {
  eval('var ' + wordToCheck + ' = 1');
} catch {
  reservedWord = true;
}
唯一的问题是,这将为无效变量名但不是保留字的字提供假阳性


正如评论中所指出的,这可能是一种安全风险。

我想你可以使用eval解决它,但这似乎是一种黑客行为。我会去检查所有保留的单词。大概是这样的:

var reservedWords = [
    'break',
    'case',
    ...
];

function isReservedWord(str) {
    return !!~reservedWords.indexOf(str);
}
以下是所有保留字的列表:


另外,eval方法的一个问题是,某些浏览器有时允许您使用一些保留字作为标识符。

我想您可以使用eval解决这个问题,但这似乎有点像黑客攻击。我会去检查所有保留的单词。大概是这样的:

var reservedWords = [
    'break',
    'case',
    ...
];

function isReservedWord(str) {
    return !!~reservedWords.indexOf(str);
}
以下是所有保留字的列表:


另外,eval方法的一个问题是,某些浏览器有时允许您使用一些保留字作为标识符。

我只需将所有保留字放入数组并检查字符串。这个问题的上下文是什么?您是在动态地创建变量名,还是只是想确保在编码时不会意外地使用保留字(在这种情况下,使用IDE或类似记事本++的东西就可以了)。或者使用jsLint检查这个stff。我会抓取所有保留字,将它们放在一个数组中并检查字符串。这个问题的上下文是什么?您是在动态地创建变量名,还是只是想确保在编码时不会意外地使用保留字(在这种情况下,使用IDE或类似记事本++的东西就可以了)。或者使用jsLint检查此stff。这是一个潜在的安全整体。这是一个很好的观点,但取决于上下文,这可能不是一个问题。我认为只获取完整列表的解决方案是最好的,但OP问你如何做到这一点,所以我回答。你也可能会被误判,因为有些浏览器允许你使用一些关键字作为变量名。@原因,出于好奇,哪些浏览器和哪些单词?我认为ECMA脚本规范不允许这样做。那么
eval('(函数('+wordToCheck+'){})
呢。这不会污染当前范围(想象一下
wordToCheck=='reservedWord'
…)。另外,为了避免安全问题,只需添加一个测试,如
/^[a-z]+$/i.test(wordToCheck)
这是一个潜在的安全整体。这是一个很好的观点,但取决于上下文,这可能不是一个问题。我认为只获取完整列表的解决方案是最好的,但OP问你如何做到这一点,所以我回答。你也可能会被误判,因为有些浏览器允许你使用一些关键字作为变量名。@原因,出于好奇,哪些浏览器和哪些单词?我认为ECMA脚本规范不允许这样做。那么
eval('(函数('+wordToCheck+'){})
呢。这不会污染当前范围(想象一下
wordToCheck=='reservedWord'
…)。另外,为了避免安全问题,只需添加一个测试,如
/^[a-z]+$/i.test(wordToCheck)
不需要该对象。数组应该这样做,如果数组中存在该值,则它是一个保留字<代码>返回~保留单词。indexOf(str)为什么不
返回reservedWords.indexOf(str)>-1?不需要该对象。数组应该这样做,如果数组中存在该值,则它是一个保留字<代码>返回~保留单词。indexOf(str)为什么不
返回reservedWords.indexOf(str)>-1