- vừa được xem lúc

javascript ư? bạn chưa biết hết về nó đâu

0 0 19

Người đăng: ttdat

Theo Viblo Asia

Giới thiệu

chào các bạn, hôm nay tôi lại đem đến cho các bạn những kiến thức mới về javascript mà có thể kể cả những bạn đã học lâu về javascript cũng chưa chắc đã biết đến, chúng ta cùng bắt đầu nào

Var, let & const

chắc các bạn đã quá quen với việc khai báo biến với var, let, const rồi đúng không?, tuy nhiên, nếu bạn chưa tìm hiểu kĩ về js, hẳn các bạn sẽ không biết tại sao mọi người thường khuyến nghị dùng let và const thay vì var, chúng ta sẽ tìm hiểu về nó ngay dưới đây

a. về mặt scope

Var

theo docs của mozilla, từ khóa var có 2 loại scope là function scope hoặc global scope

The var statement declares a function-scoped or globally-scoped variable, optionally initializing it to a value.

let

theo docs của mozilla, từ khóa let chỉ có block scope

The let declaration declares a block-scoped local variable

Vậy tại sao chúng ta phải quan tâm về vấn đề này, thì tôi sẽ đưa ra 2 ví dụ sau đây:

vd1: từ khóa var

var x = 1; if (x === 1) { var x = 2; console.log(x); // Expected output: 2
}
console.log(x);
// Expected output: 2

các bạn có thể để ý rằng giá trị từ biến x sẽ không mất đi kể cả đi ra khỏi block code if

vd2: từ khóa let

let x = 1; if (x === 1) { let x = 2; console.log(x); // Expected output: 2
}
console.log(x);
// Expected output: 1

đối với từ khóa let, giá trị của nó sẽ mất đi ngay khi ra khỏi block code if

Tại sao đây lại là vấn đề ?

các bạn thử giả sử rằng có 2 người đang code trong cùng nơi như trong ví dụ trên và cùng sử dụng biến var, tuy nhiên đồng nghiệp bạn lại gán lại giá trị như trong vd1, điều đó có thể khiến logic của bạn từ đúng trở thành sai ngay khi code được merge

b. về mặt hoisting

var

var khi hoisting sẽ tự động gán giá trị undefined, phần khởi tạo giá trị sẽ không được hoisted theo

It's important to point out that only a variable's declaration is hoisted, not its initialization. The initialization happens only when the assignment statement is reached. Until then the variable remains undefined

vd:

console.log(x); //undefined
var x = 2;
console.log(x); //2

let

let sau khi hoisted nó sẽ ở trong temporal dead zone(TDZ) cho đến khi nào biến được khởi tạo

lưu ý: các biến nằm trong TDZ sẽ bị lỗi ReferenceError

let allows you to declare variables that are limited to the scope of a block statement, or expression on which it is used, unlike the var keyword, which declares a variable globally, or locally to an entire function regardless of block scope. The other difference between var and let is that the latter can only be accessed after its declaration is reached (see temporal dead zone). For this reason, let declarations are commonly regarded as non-hoisted.

 console.log(x); //báo lỗi ReferenceError: Cannot access 'x' before initialization -> thoát khỏi chương trình let x = 2; console.log(x);

lưu ý: việc nó ở trong TDZ sẽ khác với việc các bạn không gán giá trị, nếu bạn không gán giá trị nó sẽ là undefined

let x;
console.log(typeof x); //undefined

c. vậy tại sao hiện tại mọi người vẫn thích sử dụng biến var

lưu ý: mình chưa code đủ lâu để có thể hiểu được tất cả mọi người nên những ý kiến dưới đây là những gì mình nghĩ, search và cảm nhận được

  • có thể bạn là một lập trình viên web lâu năm, bạn đã làm web từ những năm 2010 chẳng hạn và việc sử dụng var đã quá quen
  • bạn đang phải maintain hoặc phải handle cho những trình duyệt, phiên bản trình duyệt cũ kĩ
  • bạn có thể đang không hiểu rõ về các từ khóa này 😃)

Template strings

đây là cách tạo ra một chuỗi string với biến nội suy bằng dấu ``, với nó ta không cần phải build chuỗi bằng cách nối chuỗi như trước kia mà thay vào đó bạn có làm như sau

let is_locked = false;
let style_of_lock = `lock ${ is_locked ? 'locked' : 'unlock' }`
console.log(style_of_lock) // lock unlock

hoặc tạo ra 1 đoạn văn chỉ bằng việc cách dòng

let para = `this is line 1
this is line 2
`
console.log(para)
/*output:
this is line 1
this is line 2
*/

Tagged templates

nó cho phép bạn parse template strings với một function vd:

function lockStyle(normalStyle, is_locked, ...rest) { return `${normalStyle[0]} ${is_locked ? 'locked' : 'unlock'}`
}
const style_of_lock = lockStyle`lock lock-red lock-fe${true}`;
console.log(style_of_lock) //lock lock-red lock-fe locked

destructuring & toán tử rest

destructuring và toán tử rest:

  • với mảng:
let arr = [1,2,3,4,5];
let [a,,c] = arr;
console.log(a,c) //1 3 // hoặc sử dụng toán tử rest let arr = [1,2,3,4,5];
let [a,,c,...conlai] = arr; // dùng 2 dấu ,, để loại số 2
console.log(a,c,conlai) //1 3 [ 4, 5 ]
  • với object
let obj = { name: 'ttdat', age: NaN, address: 'HCM'
} let { name, age, ...conlai } = obj;
console.log( age, conlai) // NaN {address: 'HCM'}
  • sử dụng toán tử rest với function
function sum(...args) { let sum = 0; for (const key of args) { sum += key; } console.log(sum);
}
sum(1,2,3); //6
sum(1,2); //3
sum(1,3); // 4

Lời kết và hứa hẹn

bài viết đã dài rồi nên mình tính kết thúc ở đây luôn, có lẽ mình sẽ viết tiếp phần 2 với toàn bộ các nội dung về xử lí bất đồng bộ hứa hẹn sẽ có Callback, promise, observable. Các bạn nhớ đón xem và cho mình một upvote nhaaaa

Tham Khảo

Bình luận

Bài viết tương tự

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 110

- vừa được xem lúc

Phân biệt kiểu biến var, let, và const trong JavaScript

1. Giới Thiệu. ES6 (viết tắt của ECMAScript 6) là một tập hợp các kỹ thuật nâng cao của Javascript. ECMAScript do hiệp hội các nhà sản xuất máy tính Châu Âu đề xuất làm tiêu chuẩn của ngôn ngữ Javascript.

0 0 62

- vừa được xem lúc

Hãy sử dụng ESLint cho dự án của bạn!

. Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/May/20/we-should-use-eslint-in-project.html (đã xin phép tác giả ).

0 0 76

- vừa được xem lúc

Object Literals nâng cao với ES6

Trong bài viết này chúng ta xem xét những gì có thể xảy ra với các Object Literals trong JavaScript, đặc biệt là theo các bản cập nhật ECMAScript gần đây. Khả năng tạo các đối tượng JavaScript sử dụng ký hiệu chữ rất mạnh mẽ.

0 0 32

- vừa được xem lúc

Một số mẹo vặt "hay ho" của ES6 có thể bạn chưa biết - Phần 4

Xin chào, ở 3 bài trước của series "Một số mẹo vặt "hay ho" của ES6", mình đã chia sẻ 1 số tips/tricks nhỏ với ES6, hy vọng ít nhiều nó sẽ có ích với các bạn khi áp dụng vào thực tế. Hôm nay, xin mời các bạn theo dõi phần 4 của series này.

0 0 46

- vừa được xem lúc

Tìm hiểu về JavaScript Module

Chắc hẳn ai trong chúng ta cũng đã từng sử dụng nhiều công cụ như là webpack, rollup, grunt, browserify,...; sử dụng những cú pháp module quen thuộc của CommonJS, AMD hay là ES6, nhưng có lẽ là chưa thực sự nhiều người đã nắm rõ về quá trình hình thành và mục đích tại sao chúng ta có những công cụ n

0 0 44