当前位置: 首页 > 知识库问答 >
问题:

JavaScript中的'a'['toUpperCase']()如何以及为什么工作?

单于飞鸣
2023-03-14

JavaScript一直让我惊讶,这是另一个例子。我只是遇到了一些我起初不理解的代码。所以我调试了它,得出了这个结论:

alert('a'['toUpperCase']());  //alerts 'A'

现在,如果toUpperCase()被定义为字符串类型的成员,这一定是显而易见的,但最初对我来说没有意义。

不管怎样,

>

  • 这是否因为toUpperCase是“a”的成员而起作用?还是幕后还有别的事
  • 我正在阅读的代码具有如下功能:

    function callMethod(method) {
        return function (obj) {
            return obj[method](); //**how can I be sure method will always be a member of obj**
        }
    }
    
    var caps2 = map(['a', 'b', 'c'], callMethod('toUpperCase')); // ['A','B','C'] 
    // ignoring details of map() function which essentially calls methods on every 
    // element of the array and forms another array of result and returns it
    

    对任何对象调用任何方法都是一种通用函数。但这是否意味着指定的方法已经是指定对象的隐式成员?

    我确信我错过了一些对JavaScript函数基本概念的认真理解。请帮助我理解这一点。

  • 共有3个答案

    微生宝
    2023-03-14

    您可以使用访问任何对象的成员。propertyName表示法或[“propertyName”]表示法。这就是JavaScript语言的特点。要确保成员位于对象中,只需检查(如果已定义):

    function callMethod(method) {
        return function (obj) {
            if (typeof(obj[method]) == 'function') //in that case, check if it is a function
               return obj[method](); //and then invoke it
        }
    }
    
    廖琪
    2023-03-14

    foo。bar和foo['bar']是相等的,因此您发布的代码与

    alert('a'.toUpperCase())
    

    当使用foo[bar]时(注意没有引号),您不使用字面名称bar,而是使用变量bar包含的任何值。因此,使用foo[]符号代替foo 允许您使用动态属性名称。

    让我们看看callMethod

    首先,它返回一个以obj为参数的函数。当该函数被执行时,它将对该对象调用方法。因此,给定的方法只需要存在于obj本身或其原型链的某个地方。

    toUpperCase的情况下,该方法来自String。原型toUpperCase-对于存在的每个字符串都有一个单独的方法副本是相当愚蠢的。

    卢俭
    2023-03-14

    把它分解。

    • 。toUpperCase()字符串的一种方法。原型

    所以

    'a'['toUpperCase'];
    

    是通过属性toUpperCase上的括号表示法进行的访问,来自String.prototype。由于这个属性引用了一个方法,我们可以通过附加()来调用它

    'a'['toUpperCase']();
    
     类似资料:
    • 问题内容: 经常出现在Python模块中。即使阅读了Python的文档,我也不明白它的用途以及使用时间/方式。 有人可以举例说明吗? 关于我收到的基本用法的一些答案似乎是正确的。 但是,我需要了解有关工作原理的另一件事: 对我来说,最令人困惑的概念是当前的python版本如何包含未来版本的功能,以及如何使用当前版本的Python成功地编译使用未来版本的功能的程序。 我猜想当前版本包含了将来的潜在功

    • 问题内容: 我正在尝试自己学习Socket。我对Oracle网站上的文字感到有些困惑。我对此有一些疑问。在此先感谢您的明确解释。 setSoTimeout 公共无效setSoTimeout(int超时)引发SocketException 以指定的超时时间启用/禁用SO_TIMEOUT,以毫秒为单位。将此选项设置为非零超时后,与此套接字关联的调用将仅在此时间量内阻塞。如果超时到期,则尽管Socket

    • 问题内容: 正如我在标题中提到的 a + = b和a = + b以及a 和 a有什么区别?我有点困惑 问题答案: 相当于 相当于 且两者都增加1。不同之处在于,返回的是增量之前的值,而返回的是增量之后的值。 那是:

    • 问题内容: 什么时候以及为什么要使用JavaScript? 问题答案: 通常,在事件处理程序(如中)中,返回false是一种告诉事件实际上未触发的方法。因此,在这种情况下,这意味着将不提交表单。

    • 问题内容: 您经常在网络上读到使用闭包是JavaScript中大量内存泄漏的原因。在大多数情况下,这些文章都涉及混合脚本代码和DOM事件,其中脚本指向DOM,反之亦然。 我了解关闭可能是一个问题。 但是Node.js呢?在这里,我们自然没有DOM-因此像浏览器一样,没有机会出现内存泄漏的副作用。 关闭可能还会有什么其他问题?有人可以详细说明或指向我关于此的很好的教程吗? 请注意,此问题明确针对No

    • 我有一个用Eclipse编写的Java代码库,我正试图在IntelliJ中使用它。代码库由大约20个Java包组成,这些包作为单独的项目并排构建。(大约有二十个目录,每个目录包含一个和文件。)他们互相依赖。想必Eclipse中的一切都构建得很好。 我让IntelliJ从Eclipse构建格式导入了这些。除了显示许多项目对有一个未解析的依赖关系之外,它基本上都起作用了。这似乎来自文件中的以下条目: