Diferencia e intersección de dos matrices que contienen objetos

Tengo dos matriceslist1 ylist2 que tienen objetos con algunas propiedades;userId es el Id o propiedad única:

list1 = [
    { userId: 1234, userName: 'XYZ'  }, 
    { userId: 1235, userName: 'ABC'  }, 
    { userId: 1236, userName: 'IJKL' },
    { userId: 1237, userName: 'WXYZ' }, 
    { userId: 1238, userName: 'LMNO' }
]

list2 = [
    { userId: 1235, userName: 'ABC'  },  
    { userId: 1236, userName: 'IJKL' },
    { userId: 1252, us,erName: 'AAAA' }
]

Estoy buscando una manera fácil de ejecutar las siguientes tres operaciones:

list1 operation list2 debe devolver la intersección de elementos:

[
    { userId: 1235, userName: 'ABC'  },
    { userId: 1236, userName: 'IJKL' }
]

list1 operation list2 debería devolver la lista de todos los elementos delist1 que no ocurren enlist2:

[
    { userId: 1234, userName: 'XYZ'  },
    { userId: 1237, userName: 'WXYZ' }, 
    { userId: 1238, userName: 'LMNO' }
]

list2 operation list1 debería devolver la lista de elementos delist2 que no ocurren enlist1:

[
    { userId: 1252, userName: 'AAAA' }
]

Respuestas a la pregunta(6)

Su respuesta a la pregunta