从红宝石角度来看有趣的JavaScript功能
#javascript #初学者 #编程 #ruby

嗨。我最近开始重新学习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 += 1num = 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']

好吧。那是最后一个。希望您发现这些相当有趣或有见地。感谢您的阅读。
直到下一次。