繁体   English   中英

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

[英]JavaScript: why are some functions not methods?

曾经有学生问我为什么要写:

  • parseInt(something)
  • something.toLowerCase()

也就是说,为什么一个将变量作为参数,而另一个应用于变量。

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

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

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

一般来说,Javascript 是匆忙设计的,所以质疑每个单独的设计决定并不总是有效地利用你的时间。

话虽如此,特别是对于parseInt ,原因很容易解释:它几乎接受任何任意类型,例如:

parseInt(undefined)  // NaN

由于您无法实现undefined.parseInt() ,唯一的方法是将其实现为静态函数。

从 ECMAScript 2015 开始, parseInt已经被镜像到Number.parseInt ,可以说它比在window上更有意义。 为了向后兼容window.parseInt继续存在。

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

考虑 parseInt() - 它从未知位置获取未知类型的值并从中提取整数值。 你打算让它成为哪个对象的方法? 他们都?

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

至于 JavaScript 的其余部分,我不知道也没有深入了解它以这种方式完成的真正原因,但对于这些特定示例,在我看来这是一个合理的设计决策。

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

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

JavaScript 为用户提供了强大的能力,有许多解决问题的可能性。 有句话说:“能力越大,责任越大”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM