Javascript 我有几个问题与call()和apply()的使用有关,或者在本例中如何调用这两种类型,Array()和Math

Javascript 我有几个问题与call()和apply()的使用有关,或者在本例中如何调用这两种类型,Array()和Math,javascript,prototype,Javascript,Prototype,从 我有两个问题要问大家 为什么我们需要使用Array().slice,而不是Math().max 为什么我们要使用Array().slice,而不是Array.prototype.slice(我注意到Array.prototype.slice可以工作,但我试图理解为什么我会使用一个而不是另一个,不仅在本例中,而且在任何情况下) 谢谢。我的最佳拍摄: Array()将返回一个空数组实例,而Array只是一个构造函数。Array.slice不起作用,因为.slice方法仅通过其原型存在于数组实例上

我有两个问题要问大家

  • 为什么我们需要使用Array().slice,而不是Math().max
  • 为什么我们要使用Array().slice,而不是Array.prototype.slice(我注意到Array.prototype.slice可以工作,但我试图理解为什么我会使用一个而不是另一个,不仅在本例中,而且在任何情况下)
  • 谢谢。

    我的最佳拍摄:

  • Array()将返回一个空数组实例,而Array只是一个构造函数。Array.slice不起作用,因为.slice方法仅通过其原型存在于数组实例上。Math不是一个构造函数,它是一个包含许多实用方法的对象,其中一个是max

  • 我不确定Array().slice和Array.prototype.slice之间是否有很大的区别,除了concision之外,您发布的代码似乎高度重视concision

  • 您通常不会看到调用构造函数时故意不使用'new'关键字,我认为这不是很好的做法。这绝对是聪明的代码,通常意味着不太可维护。

    为什么我们需要使用Array().slice,而不是Math().max? 之所以使用
    Array()
    代替
    Array.prototype
    ,是因为在这个特定实例中,一个是另一个的缩写

    首先:
    Array().slice.call(参数,1)
    [].slice.call(参数,1)具有相同的效果因为它们都是:

    • 可以用作
      Array.prototype.slice.call(参数1)的“速记”
    所以要回答你的第一个问题,他们不“需要”在那里使用它。在那里使用它仅仅是出于偏好<代码>数组.原型.切片.调用(参数,1)
    [].slice.call(参数,1)可以被替换,该函数仍按预期工作

    至于
    Math.max.apply(Math,allButFirst)
    Math
    不像
    Array
    那样是一个“类”,因为
    Math
    对象无法实例化(试试看)。由于它无法实例化,因此不会以与
    Array()
    /
    []
    相同的方式对其进行语法访问或操作

    这也应该回答你的第二个问题


    正如bmceldowney所说,如果没有
    new
    关键字,通常不会调用构造函数。虽然这是合法的,但我(个人)很讨厌看到它,而且我也不相信这是现实生活中的好做法。

    好吧,我在这里感到有点内疚,因为在我发布我的问题后,我意识到我可以查找数学和数组之间的差异,你是对的。数学不是一个对象,没有原型也没有构造器,所以现在我明白了为什么帕伦不存在。我仍在努力思考原型以及如何正确使用它们。我觉得我在阅读中理解了它们(比如来自忍者约翰网站的例子),但每当涉及到实现它们时,我就完全失败了。另外,我没有意识到你可以这样使用文字[]。好吧,这是一个非常有趣的答案,因为我认为它使我更接近于理解原型。。Array.slice是仅存在于new Array()实例上的方法。在本例中,调用new Array()时不使用new,但仍然可以访问prototype方法?这到底是如何工作的?数组的实现(可能还有其他内置的包装类)导致调用方忘记使用他
    new
    关键字()。当使用
    new
    关键字实例化对象时,它的prototype被设置为构造函数的prototype,因此Array实例和Array.prototype都有
    slice
    方法的副本,但Array构造函数函数没有。我强烈建议您选择一本“Javascript:The Good Parts”来进一步解释这一点。再次感谢您的解释。我有好的部分,我已经通读了Javascript忍者的秘密(部分由John Resig编写)。我以为我在那里,但是你所说的关于数组构造函数的话让我感到困惑。如果数组构造函数没有使用
    new
    关键字实例化而没有切片,我仍然不知道它是如何工作的。这个例子取自John Resig的书和他的网站,所以我知道他知道他不使用
    new
    做什么。我得重读好的部分。我可能引用了错误的书,因为我回顾了好的部分,但找不到相关的信息。基本上,构造函数可以这样编写:如果在没有
    new
    关键字的情况下调用,它们仍然会返回有用的内容。这对于数组构造函数是正确的,但通常不是正确的,这取决于具体的实现(我上面链接的问题对此有很好的解释)。John知道他可以在不使用
    new
    关键字的情况下调用Array(),因为他知道规范。很酷,谢谢你的链接“已定义工厂行为”不是我会猜到的,但它是有意义的,考虑到javascript中遗漏的许多内容,该语言通过为您添加它来弥补。。。我认为这些是最让我困惑的事情。但这个链接为我解决了这个问题。
    function multiMax(multi){
    // Make an array of all but the first argument
    var allButFirst = Array().slice.call( arguments, 1 );
    
    // Find the largest number in that array of arguments
    var largestAllButFirst = Math.max.apply( Math, allButFirst );
    
    // Return the multiplied result
    return multi * largestAllButFirst;
    }
    assert( multiMax(3, 1, 2, 3) == 9, "3*3=9 (First arg, by largest.)" );