次のコードに出くわしましたが、その[]
意味が知りたいです:
function checkForImage(mutation) {
if (mutation.addedNodes && (mutation.addedNodes.length > 0)) {
[].slice.call(mutation.addedNodes).forEach(function(node) { ...
次のコードに出くわしましたが、その[]
意味が知りたいです:
function checkForImage(mutation) {
if (mutation.addedNodes && (mutation.addedNodes.length > 0)) {
[].slice.call(mutation.addedNodes).forEach(function(node) { ...
目的は[]
、関数を取得できるようにするために、配列 (は配列) を取得するslice
ことです。
mutation.addedNodes
はおそらく「配列に似ている」ため、これが必要です。配列関数は機能しますが、のインスタンスではありませんArray
。ここで、このコンストラクトslice
は配列を作成します (forEach
関数が使用可能になるように)。この構成は、ライブ ノード リストなどで一般的です。このページのコンソールでテストできます。
document.getElementsByTagName('img').constructor // -> NodeList
document.getElementsByTagName('img').forEach // -> undefined
[].slice.call(document.getElementsByTagName('img')).constructor // -> Array
[].slice.call(document.getElementsByTagName('img')).forEach // -> a function
それもあったかもしれません
Array.prototype.slice.call(mutation.addedNodes).forEach(function(node) {
これにより、役に立たないインスタンス (コストはおそらく途方もなく低い) の作成を回避できますが、より冗長になります。
しかし、よりシンプルでクリーンなソリューションは
[].forEach.call(mutation.addedNodes, function(node) {
ただし、隠しコードによって実数配列の使用が正当化される場合を除きます。