JavaScript:为什么有些函数不是方法?

JavaScript:为什么有些函数不是方法?,javascript,function,methods,Javascript,Function,Methods,有一次,一个学生问我为什么要写: parseInt(某物) something.toLowerCase() 这就是为什么一个将变量作为参数,而另一个将应用于变量 我解释说,虽然toLowerCase是字符串对象的一种方法,但parseInt并不是这样设计的。好的,它是window.parseInt,但这只是使它成为另一个对象的方法 但这让我感到不一致——为什么一些字符串或其他函数不是它们相应对象的方法 问题是为什么?parseInt和其他函数不是方法,这是一个技术原因吗?或者这只是一个历史怪

有一次,一个学生问我为什么要写:

  • parseInt(某物)
  • something.toLowerCase()
这就是为什么一个将变量作为参数,而另一个将应用于变量

我解释说,虽然
toLowerCase
是字符串对象的一种方法,但
parseInt
并不是这样设计的。好的,它是
window.parseInt
,但这只是使它成为另一个对象的方法

但这让我感到不一致——为什么一些字符串或其他函数不是它们相应对象的方法


问题是为什么?
parseInt
和其他函数不是方法,这是一个技术原因吗?或者这只是一个历史怪癖?

一般来说,Javascript是匆忙设计的,因此质疑每个单独的设计决策并不总是有效地利用时间


话虽如此,特别是对于
parseInt
,原因很简单:它几乎可以接受任何任意类型,如:

parseInt(undefined)  // NaN
由于无法实现
undefined.parseInt()
,因此唯一的方法是将其作为静态函数实现


从ECMAScript 2015开始,
parseInt
已在
Number.parseInt
中镜像,可以说它比
窗口上的更合理。对于向后兼容性
window.parseInt
仍然存在。

近年来JavaScript语言的开发进展相当快。考虑到这一点,由于向后兼容性(正如您所说的历史原因),API中仍然有很多东西。虽然我不能说这是唯一的原因

在JavaScript中,您不仅可以使用
面向对象
范式(对象的方法通常共享一个公共状态)来解决问题。另一种,
功能性的
方法可以很容易地应用,而不会给JavaScript语言带来太多麻烦


JavaScript为其用户提供了强大的处理问题的能力。有一句谚语:“强大的力量带来巨大的责任”。

在这种特殊情况下,封装是有意义的

考虑parseInt()-它从未知位置获取未知类型的值,并从中提取整数值。你打算把它作为一种方法?都是吗

toUpperCase()应该只接受一个字符串作为输入(或者可以转换为字符串),并返回一个字符串。这被很好地封装在一小部分案例中,由于值不是强类型的,因此不将其作为全局函数似乎是合乎逻辑的


至于JavaScript的其他部分,我不知道也不知道这样做的真正原因,但对于这些具体的例子,我认为这是一个合理的设计决策。

parseInt
是一个“全局”的,实际上是
窗口。parseInt
-这样做吗help@JaromandaX但是为什么呢?我将对问题进行编辑以使其更清楚。@trincot
toString
也进行类型转换,但它不是
toString(something)
atob
btoa
也会将字符串转换为字符串,但它们不会用作
something.atob()
something.btoa()
。历史怪癖、不一致性,可以随意调用。Javascript充满了奇怪的怪癖。解析通常由一个全局对象完成。另请参见
JSON.parse(str)
,而不是
str.parseAsJSON()
。同样的,
btoa
encodeURI
,…JavaScript可能在10天内就写好了,但它已经存在很多年了,是时候清理一下了。我不知道它被镜像到
Number
对象中,所以这是有道理的。在
Number
对象中允许未知的传入数据也是有意义的。你知道还有其他功能有过这种处理吗?@Manngo:LOL。向后兼容通常会扼杀大部分清理工作。用任何语言。Python3试过了,它是8年前发布的,python2仍然很受欢迎……“原因很简单”,我不确定这是鸡还是蛋。你用一种有着疯狂动态规则的语言来传递论点,所以接受任何东西都是很自然的,即使它毫无意义。你到底为什么要把字符串解析成整数呢?如果你喜欢静态打字的优点,你会深深地感觉到这只是自找麻烦…@Karoly好吧,如果没有就此事亲自采访Brendan,我们将永远找不到答案。如果您使用的是疯狂的动态类型,那么这个
parseInt
实现是有意义的。例如,您还可以使用它来截断浮动…如果您坚持类型安全的合理性,Javascript是一种错误的语言@Manngo在
Number
上的一系列方法都经历了这种转换。您可以查看其他全局对象,看看是否可以发现其他此类方法。我不确定您所说的对象方法通常共享一个公共状态是什么意思,或者您为什么将其称为“函数方法”。我稍微编辑了答案,以便更清楚地表达它。我并不想把它称为“功能性方法”,我指的是“面向对象”范式。在面向对象编程中,对象的状态通常会被对象的方法改变。函数世界在概念上是不同的,我们试图避免副作用。