var isIntegerTest = /^\d+$/;
var isDigitArray = [!0, !0, !0, !0, !0, !0, !0, !0, !0, !0];
function hasLeading0s[s] {
return ![typeof s !== 'string' ||
s.length < 2 ||
s[0] !== '0' ||
!isDigitArray[s[1]] ||
isIntegerTest.test[s]];
}
var isWhiteSpaceTest = /\s/;
function fIsNaN[n] {
return ![n 0];
}
function isNumber[s] {
var t = typeof s;
if [t === 'number'] {
return [s 0];
} else if [t === 'string'] {
var n = +s;
return ![fIsNaN[n] || hasLeading0s[s] || ![n !== 0 || ![s === '' || isWhiteSpaceTest.test[s]]]];
} else if [t === 'object'] {
return ![![s instanceof Number] || fIsNaN[+s]];
}
return false;
}
function testRunner[IsNumeric] {
var total = 0;
var passed = 0;
var failedTests = [];
function test[value, result] {
total++;
if [IsNumeric[value] === result] {
passed++;
} else {
failedTests.push[{
value: value,
expected: result
}];
}
}
// true
test[0, true];
test[1, true];
test[-1, true];
test[Infinity, true];
test['Infinity', true];
test[-Infinity, true];
test['-Infinity', true];
test[1.1, true];
test[-0.12e-34, true];
test[8e5, true];
test['1', true];
test['0', true];
test['-1', true];
test['1.1', true];
test['11.112', true];
test['.1', true];
test['.12e34', true];
test['-.12e34', true];
test['.12e-34', true];
test['-.12e-34', true];
test['8e5', true];
test['0x89f', true];
test['00', true];
test['01', true];
test['10', true];
test['0e1', true];
test['0e01', true];
test['.0', true];
test['0.', true];
test['.0e1', true];
test['0.e1', true];
test['0.e00', true];
test['0xf', true];
test['0Xf', true];
test[Date.now[], true];
test[new Number[0], true];
test[new Number[1e3], true];
test[new Number[0.1234], true];
test[new Number[Infinity], true];
test[new Number[-Infinity], true];
// false
test['', false];
test[' ', false];
test[false, false];
test['false', false];
test[true, false];
test['true', false];
test['99,999', false];
test['#abcdef', false];
test['1.2.3', false];
test['blah', false];
test['\t\t', false];
test['\n\r', false];
test['\r', false];
test[NaN, false];
test['NaN', false];
test[null, false];
test['null', false];
test[new Date[], false];
test[{}, false];
test[[], false];
test[new Int8Array[], false];
test[new Uint8Array[], false];
test[new Uint8ClampedArray[], false];
test[new Int16Array[], false];
test[new Uint16Array[], false];
test[new Int32Array[], false];
test[new Uint32Array[], false];
test[new BigInt64Array[], false];
test[new BigUint64Array[], false];
test[new Float32Array[], false];
test[new Float64Array[], false];
test['.e0', false];
test['.', false];
test['00e1', false];
test['01e1', false];
test['00.0', false];
test['01.05', false];
test['00x0', false];
test[new Number[NaN], false];
test[new Number['abc'], false];
console.log['Passed ' + passed + ' of ' + total + ' tests.'];
if [failedTests.length > 0] console.log[{
failedTests: failedTests
}];
}
testRunner[isNumber]
Bình thường khi kết nối Websocket đã được xác nhận, server sẽ đặt một thời gian hết hạn kết nối cho kết nối đó trong khoảng 30s nếu nó không hoạt động. Firewall của server cũng sẽ đặt thời gian timeout sau một quãng thời gian không hoạt động.
Để thay đổi thời gian timeout của server, trong trường hợp bạn không có tương tác gì, sau một thời gian hãy gửi thêm message trống lên server.
Để làm được điều này, thêm 2 hàm sau vào trong code của bạn: một để giữ kết nối, một để hủy kết nối vừa gửi. Nếu sử dụng trick này, bạn có thể kiểm soát thời gian timeout.
Thêm
function generateRandomAlphaNum[len] {
var rdmString = "";
for[ ; rdmString.length "3rjzsgpmq"
8...Hàm
function generateRandomAlphaNum[len] {
var rdmString = "";
for[ ; rdmString.length "3rjzsgpmq"
9 cần được thêm vào cuối của hàm var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
numbers = numbers.sort[function[]{ return Math.random[] - 0.5}];
/* mảng đã được trộn, kết quả: [120, 5, 228, -215, 400, 458, -85411, 122205] */
0 của kết nối websocket, và chèn hàm var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
numbers = numbers.sort[function[]{ return Math.random[] - 0.5}];
/* mảng đã được trộn, kết quả: [120, 5, 228, -215, 400, 458, -85411, 122205] */
1 vào cuối cùng của hàm var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
numbers = numbers.sort[function[]{ return Math.random[] - 0.5}];
/* mảng đã được trộn, kết quả: [120, 5, 228, -215, 400, 458, -85411, 122205] */
2.42. Hãy luôn nhớ rằng toán tử nguyên thủy của Javascript có thể nhanh hơn việc gọi hàm.
Hãy sử dụng VanillaJS
Ví dụ: Thay vì dùng:
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
0 [10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
43. Hãy code chuẩn convention hơn. Minify nó khi deploy
Hãy sử dụng JSLint và minifier nó[ví dụ JSMin...] trước khi chạy code trên môi trường production. Hãy tập code chuẩn convention, tuân theo một convention code nào đó, có thể bây giờ bạn cảm thấy khó chịu khi phải tuân thủ convention nhưng một ngày nào đó việc xem lại mình đã code gì hay debug trên nó cũng trở nên dễ chịu hơn. Code được minify sẽ giảm bớt dung lượng và trở nên nhẹ hơn.
Bài viết được tổng hợp lại từ //modernweb.com/45-useful-javascript-tips-tricks-and-best-practices/ - Tác giả: Saad Mousliki tại trang web [//modernweb.com]
Sử dụng dấu
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
4 cuối mỗi dòng lệnh là một điều cần làm, bạn sẽ không bị cảnh báo gì khi bạn không dùng nó, tuy vậy thì nó sẽ được thêm bởi các trình soạn thảo nếu bạn cài thêm tiện ích cho Javascript. Nếu muốn tìm hiểu thêm vì sao, bạn có thể tham khảo tại link sau: //davidwalsh.name/javascript-semicolons5. Khởi tạo constructor cho đối tượng.
function Person[firstName, lastName]{
this.firstName = firstName;
this.lastName = lastName;
}
var Saad = new Person["Saad", "Mousliki"];
6. Cẩn thận mỗi khi sử dụng var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
6, var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
7 và var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
8
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
6: là một toán tử Javascript được sử dụng để trả về một chuỗi là tên kiểu nguyên thủy của một biến, đừng quên là typeof[null] sẽ trả về đối tượng, và đối với phần lớn các kiểu đối tượng khác [Array, Date, ...] cũng sẽ trả về là "object".var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119]; var randomItem = items[Math.floor[Math.random[] * items.length]];
8: là thuộc tính của prototype bên trong, nó cũng có thể bị ghi đè.var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119]; var randomItem = items[Math.floor[Math.random[] * items.length]];
7: là một toán tử Javascript khác, nó kiểm tra tất cả prototypes, trả về true nếu hàm tạo nó được tìm thấy và trả về false nếu không tìm được.var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119]; var randomItem = items[Math.floor[Math.random[] * items.length]];
Cùng xem ví dụ sau:
var arr = ["a", "b", "c"];
typeof arr; // "object"
arr instanceof Array; // true
arr.constructor[]; //[]
7. Tạo một Self-calling Function [Một hàm gọi chính nó].
Hàm này cũng được gọi là Self-Invoked Anonymous Function hay Immediately Invoked Function Expression [IIFE]. Nó là một hàm thực hiện tự động khi bạn tạo nó:
[function[]{
// code mà bạn muốn chạy tự động
}][];
// Ví dụ:
[function[a,b]{
var result = a+b;
return result;
}][10,20]
8. Lấy giá trị ngẫu nhiên từ một mảng
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
9. Lấy một số ngẫu nhiên từ một dải số cho trước
var x = Math.floor[Math.random[] * [max - min + 1]] + min;
10. Tạo một mảng bởi các số từ 0 đến max
var numbersArray = [] , max = 100;
for[ var i=1; numbersArray.push[i++] true nhưng true == "a" => false
'' === false // false
0- DESC:
[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
1Còn trường hợp bạn muốn random thì lựa chọn đơn giản đó là dùng hàm
var x = Math.floor[Math.random[] * [max - min + 1]] + min;
2[hàm trả về random một số trong khoảng 0->1] và trừ đi 0.5 để có thể trả về số âm hay dương, vì thế mảng được sort cũng sẽ random. Có một lựa chọn thay thế tốt hơn là triển khai sắp xếp ngẫu nhiên theo mã[ví dụ: mã Fish-Yates], hơn là dùng hàm sắp xếp gốc bởi Javascript. Bạn có thể xem thêm thảo luận ở đây hoặc bài viết này.13. Chèn một mảng vào mảng khác
[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
214. Chuyển đổi một tham số thành một mảng
[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
3vi dụ:
[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
415. Xác định một tham số truyền vào là một số?
[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
516. Xác định một đối số truyền vào là một mảng
[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
6Lưu ý rằng nếu hàm toString[] đã bị override, chúng ta không thể trả về đúng kết quả nếu dùng hàm này.
Hoặc dùng:
[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
7Bạn cũng có thể dùng
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor[Math.random[] * items.length]];
7 nếu bạn không làm việc với nhiều ngữ cảnh. Truy nhiên nếu bạn làm việc với nhiều ngữ cảnh khác nhau, bạn sẽ nhận được kết quả sai. Cùng xem ví dụ sau:[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
817. Lấy các giá trị nhỏ nhất hay lớn nhất trong một mảng các số
[10] === 10 // false
[10] == 10 // true
'10' == 10 // true
'10' === 10 // false
[] == 0 // true
[] === 0 // false
'' == false // => true nhưng true == "a" => false
'' === false // false
918. Làm rỗng một mảng
function Person[firstName, lastName]{
this.firstName = firstName;
this.lastName = lastName;
}
var Saad = new Person["Saad", "Mousliki"];
019. Đừng sử dụng delete để xóa một thành phần khỏi mảng
Hãy sử dụng
var x = Math.floor[Math.random[] * [max - min + 1]] + min;
4 thay vì var x = Math.floor[Math.random[] * [max - min + 1]] + min;
5 để xóa một item khỏi mảng. Sử dụng var x = Math.floor[Math.random[] * [max - min + 1]] + min;
5 sẽ thay thế item bằng var x = Math.floor[Math.random[] * [max - min + 1]] + min;
7/var x = Math.floor[Math.random[] * [max - min + 1]] + min;
8 thay vì xóa nó khỏi mảng. Thay vì dùng:function Person[firstName, lastName]{
this.firstName = firstName;
this.lastName = lastName;
}
var Saad = new Person["Saad", "Mousliki"];
1Hãy dùng:
function Person[firstName, lastName]{
this.firstName = firstName;
this.lastName = lastName;
}
var Saad = new Person["Saad", "Mousliki"];
2Hàm
var x = Math.floor[Math.random[] * [max - min + 1]] + min;
5 nên được dùng để xóa một thuộc tính của một đối tượng.20. Cắt bớt mảng sử dụng length
Cũng như ví dụ trước, làm rỗng mảng, chúng ta cũng có thể dùng
var numbersArray = [] , max = 100;
for[ var i=1; numbersArray.push[i++]