JavaScript一直让我惊讶,这是另一个例子。我只是遇到了一些代码,一开始我不理解。所以我对它进行了调试,得到了这样的发现:

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

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

不管怎么说,

does this work because toUpperCase is a member of 'a'? Or there is something else going on behind the scenes? the code I was reading has a function as follows: 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 It is kinda generic function to call ANY methods on ANY object. But does that mean the specified method will already be an implicit member of the specified object?

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


当前回答

您可以使用.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
    }
}

其他回答

把它分解。

.toUpperCase()是String.prototype的一个方法 'a'是一个基本值,但会转换为它的Object表示形式 我们有两种可能的表示法来访问对象属性/方法,点表示法和括号表示法

So

'a'['toUpperCase'];

是String.prototype中通过括号符号对属性toUpperCase的访问。由于此属性引用了一个方法,因此可以通过attach()调用它。

'a'['toUpperCase']();

您可以使用.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
    }
}

toUpperCase是一个标准的javascript方法:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/toUpperCase

它像'a'['toUpperCase']()一样工作的原因是toUpperCase函数是字符串对象'a'的属性。可以使用object[property]或object.property引用对象的属性。语法'a " toUpperCase'表示您正在引用'a'字符串对象的'toUpperCase'属性,然后调用它()。

如果你问它是怎么工作的我就是这么读的。这是一个简单的数学函数。要理解它,您需要查看ascii表。给每个字母赋一个数值。要隐藏它,竞争对手只需使用一个逻辑语句来隐藏,例如 If(ChcrValue > 80 && charValue < 106) //小写字母集合 那么charValue = charValue - 38;//下集和上集之间的距离

就是这么简单,我实际上并没有费心去查找正确的值,但这基本上是将所有小写字母转换为大写值。

anyObject['anyPropertyName']与anyObject相同。当anyPropertyName没有问题字符时。

参见MDN中的“使用对象”。

toUpperCase方法附加到类型String上。当你在一个基本值上调用一个函数时,这里'a',它会自动提升为一个对象,这里是String:

在要对基本字符串或对象调用方法的上下文中 属性查找时,JavaScript会自动换行字符串 元素,并调用该方法或执行属性查找。

你可以通过记录String.prototype.toUpperCase来看到这个函数的存在。