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