我曾经被学生问过为什么写作:
parseInt(something)
something.toLowerCase()
也就是说,为什么将变量作为参数,而将另一个变量应用于变量。
我解释说虽然toLowerCase
是字符串对象的方法,但parseInt
并非如此设计。好的,所以它是window.parseInt
,但这只是使它成为一个不同对象的方法。
但它让我感到不稳定 - 为什么某些字符串或其他函数不是它们相应对象的方法?
问题是为什么?有parseInt
和其他函数不是方法的技术原因,还是只是一个历史怪癖?
答案 0 :(得分:3)
一般来说,Javascript的设计很匆忙,因此质疑每个设计决策并不总能充分利用您的时间。
话虽如此,特别是parseInt
,其原因很容易解释:它几乎可以接受任意类型,例如:
parseInt(undefined) // NaN
由于您无法实现undefined.parseInt()
,唯一的方法是将其实现为静态函数。
从ECMAScript 2015开始,parseInt
已在Number.parseInt
中进行了镜像,可以说它比window
更有意义。为了向后兼容,window.parseInt
仍然存在。
答案 1 :(得分:2)
在这种特定情况下,它对封装有意义。
考虑parseInt() - 它从未知位置获取未知类型的值并从中提取整数值。你打算用哪种方法来制作它?他们都是?
String.toUpperCase()应该只接受一个字符串作为输入(否则可以将其转换为字符串)并返回一个字符串。这很好地封装在一小部分案例中,由于值不是强类型的,因此将其作为全局函数似乎是合乎逻辑的。
至于JavaScript的其余部分我不知道也不了解它以这种方式完成的真正原因,但对于这些具体的例子,我认为这是一个合理的设计决策。
答案 2 :(得分:0)
近年来,JavaScript语言的开发进展非常快。考虑到这一点,由于向后兼容性,许多事情仍在API中 - 正如您所说的历史原因。虽然我不能说这是唯一的原因。
在JavaScript中,您不仅可以使用Object oriented
范例(对象的方法通常共享公共状态)来解决问题。另一种functional
方法可以很容易地应用,而不会在JavaScript语言中遇到太多麻烦。
JavaScript为用户提供了很大的力量,可以解决问题。有句话说:“有了强大的力量,就有了很大的责任感。”