# Trick độc, code lạ =))

# Nhân / chia 2

8 >> 1; // lùi 1 bit == chia 2 
1 << 2; // tiến 2 bit  == nhân 4

# Math.floor

Loại bỏ phần thập phân

Math.floor(321.92)  /// cách bình thường 
~~321.92; // chạy nhanh hơn =)) do thao tác trực tiếp trên bit


~~(Math.random() * 100) /// case thực tế, random số từ 0 -> 100

# Ép kiểu

Ép kiểu từ string sang số, + trước string

+'323'  /// 323
+'123sdfdsf' /// NaN

Ép sang boolean -> !! tất cả các giá trị Falsy đều về false

!!undefined; // false
!!''; // false
!!NaN; // false 

# Điều kiện

/// thông thường =)) 
if ( dep_trai ) {
   gai_theo(); 
}

/// thông thái =))) 
dep_trai && gai_theo();

# Kiểm tra Object rỗng

!Object.keys({}).length; // true

# Array tricks

# Gộp mảng

arr1.concat(arr2); /// cách bình thường
arr1.push.apply(arr1, arr2); /// nhanh hơn vì thèng này sẽ thay đổi arr1 

# Tìm kiếm phần tử

Nếu chỉ cần 1 phần tử, hãy sử dụng Array.find thay vì filter vì filter sẽ quét hết mảng.

# Reduce sinh ra để làm gì?

const avengers = [
  { name: 'ironman', age: 27 },
  { name: 'hulk', age: 12 },
  { name: 'captain_america', age: 18 },
  { name: 'thor', age: 22 },
];

/// lấy tên các bạn trên 18 theo cách thông thường 
const result = avengers.filter(({ age }) => age >= 18) .map(({ name }) => name); 

/// cách thông thái
const result = avengers.reduce((avenger, { age, name }) => {
  return (age >= 18) ? [...avenger, name] : avenger;
}, []);

# Thêm custom function

Array.prototype.sum = function() {
    return this.reduce((total, amount) => total + amount); 
};

[ 11, 22 , 44 ].sum(); // 77