【问题标题】:Determine if a word is a reserved Javascript identifier确定一个词是否是保留的 Javascript 标识符
【发布时间】:2013-04-15 23:23:54
【问题描述】:

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

【问题讨论】:

  • 我就去here,把所有的保留字放在一个数组中并检查字符串。
  • 这个问题的上下文是什么?您是动态创建变量名,还是只是想确保在编码时不会意外使用保留字(在这种情况下,使用 IDE 或 Notepad++ 之类的东西就可以了)。或者使用 jsLint 来检查这个 stff。

标签: javascript keyword reserved-words


【解决方案1】:

仅供参考,某些单词仅在 strict 模式下会引发错误

例如:包

eval('var package = 1') // No error
'use strict'
eval('var package = 1') // throws error

【讨论】:

    【解决方案2】:

    我想你可以使用 eval 来解决它,但这似乎有点像 hack。我会去检查所有保留字。像这样的:

    var reservedWords = [
        'break',
        'case',
        ...
    ];
    
    function isReservedWord(str) {
        return !!~reservedWords.indexOf(str);
    }
    

    这里是所有保留字的列表:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Reserved_Words

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

    【讨论】:

    • 不需要那个对象。数组应该这样做,如果该值存在于数组中,那么它是一个保留字。 return !!~reservedWords.indexOf(str);
    • 为什么不只是return reservedWords.indexOf(str) > -1;
    【解决方案3】:

    一种选择是:

    var reservedWord = false;
    try {
      eval('var ' + wordToCheck + ' = 1');
    } catch {
      reservedWord = true;
    }
    

    唯一的问题是,对于无效变量名但不是保留字的单词,这将给出误报。

    正如 cmets 中所指出的,这可能存在安全风险。

    【讨论】:

    • 这是一个潜在的安全整体。
    • 这是一个很好的观点,但根据上下文,这可能不是问题。我认为仅获取完整列表的解决方案是最好的,但 OP 询问您如何这样做,所以我想我会回答。
    • 您也可能会得到误报,因为某些浏览器允许您使用一些关键字作为变量名。
    • @Reason,出于好奇,哪些浏览器和哪些单词?我认为 ECMA 脚本规范不允许这样做。
    • eval('(function(' + wordToCheck + '){})') 怎么样。这不会污染当前范围(想象一下wordToCheck=='reservedWord'...)。另外,为了避免安全问题,只需添加一个测试,如/^[a-z]+$/i.test(wordToCheck)
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2010-09-16
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多