a = [1, 2, 3];
b = [2, 4, 5];

ES7

// 并集
let union = a.concat(b.filter((v) => !a.includes(v))); // [1,2,3,4,5]

// 交集
let intersection = a.filter((v) => b.includes(v)); // [2]

// 差集
let difference = a.concat(b).filter((v) => a.includes(v) && !b.includes(v)); // [1,3]

ES6

let aSet = new Set(a);
let bSet = new Set(b);

// 并集
let union = Array.from(new Set(a.concat(b))); // [1,2,3,4,5]
console.log(union);

// 交集
let intersection = Array.from(
   new Set(a.filter((v) => bSet.has(v))) // [2]
);

// 差集
let differenceNew = Array.from(new Set(a.concat(b).filter((v) => aSet.has(v) && !bSet.has(v)))[(1, 3)]);
console.log(differenceNew);

ES5

// 并集
var union = a.concat(
  b.filter(function (v) {
     return a.indexOf(v) === -1;
   })
); // [1,2,3,4,5]

// 交集
var intersection = a.filter(function (v) {
    return b.indexOf(v) > -1;
}); // [2]

// 差集
var difference = a.filter(function (v) {
    return b.indexOf(v) === -1;
}); // [1,3]

console.log(union);
console.log(intersection);
console.log(difference);

考虑NaN情况

  var a = [1, 2, 3, NaN];
  var b = [2, 4, 5];

  var aHasNaN = a.some(function (v) {
    return isNaN(v);
  });
  var bHasNaN = b.some(function (v) {
    return isNaN(v);
  });

  // 并集
  var union = a.concat(
      b.filter(function (v) {
        return a.indexOf(v) === -1 && !isNaN(v);
      })).concat(!aHasNaN & bHasNaN ? [NaN] : []); // [1,2,3,4,5,NaN]

  // 交集
  var intersection = a.filter(function (v) {
      return b.indexOf(v) > -1;
    }).concat(aHasNaN & bHasNaN ? [NaN] : []); // [2]

  // 差集
  var difference = a.filter(function (v) {
      return b.indexOf(v) === -1 && !isNaN(v);
    }).concat(aHasNaN && !bHasNaN ? [NaN] : []); //1,3,NaN

  console.log(union);
  console.log(intersection);
  console.log(difference);