嗨。我最近开始重新学习JavaScript,因为自上次对此做任何有意义的事情已经一年了。因此,我认为作为Ruby Developer,我分享了一些对我来说突出的差异。应该有第2部分,所以如果您发现这个有趣的话,您可能需要提防。
说够了。让我们直接跳到第一个区别。
致电未定义的方法或属性没有错误
在Ruby中,您的程序在对象上调用未定义的方法时会提出一个NoMethodError
。但是,在JavaScript中,情况有所不同,因为它默默地返回undefined
(而不会引起错误)。
这将导致下一个观察。
可选的链接
由于JavaScript处理未定义的方法和属性,因此使用optional chaining(Ruby中的safe navigation)的使用也受到影响。让我们看一个例子。
假设我们有一个用户,他们对我们不知道,没有经常帐户,我们想安全地检查他们的经常账户余额;这就是我们可以在JavaScript中做到这一点的方式:
// ?. is the optional chaining operator
user.currentAccount?.balance
// => undefined
和ruby:
# &. is the safe navigation operator
user&.current_account&.balance
# => nil
请注意,如果current_account
不是user
对象的有效/定义方法,我们必须在Ruby中两次使用操作员以避免错误。
访问最后一个数组元素
如果您来自Ruby,则可以本能地尝试array[-1]
,但它会返回undefined
。因此,要实际获取JS数组中的最后一个元素,您必须要做:
array[array.length - 1]
// or less preferably
array.slice(-1)[0]
使用slice
这种方式看起来很骇人听闻,由于它返回了一个新数组,因此您将无法修改元素。
使用Ruby,您只需:
array[-1]
# or to modify the element:
array[-1] = 'new last element'
增加数字
javaScript具有增量(++
)操作员,您可以使用它,而不是做像num += 1
或num = num + 1
这样的操作。
但是,Ruby没有这样的操作员,因此您必须使用num += 1
。
函数参数默认为可选
在JavaScript中,缺少论证成为undefined
,而不是提出异常。但是,Ruby将提出ArgumentError
。让我们看一个例子。
在JavaScript
中
// passing only one argument instead of two
function greet(timeOfDay, name) {
return `Good ${timeOfDay}, ${name}`
}
greet('morning');
// => Good morning, undefined
在Ruby中:
def greet(time_of_day, name)
"Good #{time_of_day}, #{name}"
end
greet('morning')
# => wrong number of arguments (given 1, expected 2) (ArgumentError)
即使有every()
,也没有none()
JavaScript阵列具有every()
和some()
谓词方法,就像Ruby中的Array#all?
和Array#any?
一样,但是与JavaScript不同,Ruby Arrays具有#none?
方法,它与#any?
相反。
。
您可以通过定义none()
函数来在JavaScript中获得类似的效果:
let none = (array, callback) => !array.some(callback);
// and use it like so
let arr = [1, 3, 4, 9, 15];
let result = none(arr, item => item > 20);
// => true
或简单地否定呼叫:
arr = [1, 3, 4, 9, 15]
result = !array.some(item => item > 20)
// => true
在Ruby中,您以这种方式编写相同的逻辑:
arr = [1, 3, 4, 9, 15]
result = arr.none? { |item| item > 20 }
# => true
array.foreach()返回未定义的
这似乎是直观的,而且可能是,但是在Ruby中,Array#each
返回self
,这是该方法被调用的对象。这是一个例子。
在JavaScript中:
const letters = ['a', 'b', 'c'];
result = letters.forEach((letter) => console.log(letter));
// result => undefined
在Ruby中:
letters = ['a', 'b', 'c']
result = letters.each { |letter| puts letter }
# result => ['a', 'b', 'c']
好吧。那是最后一个。希望您发现这些相当有趣或有见地。感谢您的阅读。
直到下一次。