Rumah > hujung hadapan web > tutorial js > Kongsi kemahiran pembangunan JavaScript klasik_kemahiran javascript

Kongsi kemahiran pembangunan JavaScript klasik_kemahiran javascript

WBOY
Lepaskan: 2016-05-16 15:30:39
asal
1016 orang telah melayarinya

Berkongsi kemahiran pembangunan JavaScript klasik dengan semua orang:

1 Pastikan anda menggunakan kata kunci var apabila memberikan nilai kepada pembolehubah untuk kali pertama

Jika pembolehubah ditetapkan secara langsung tanpa diisytiharkan, ia akan digunakan sebagai pembolehubah global baharu secara lalai Cuba elakkan daripada menggunakan pembolehubah global.
2. Gunakan === bukannya ==

Pengendali

== dan != secara automatik menukar jenis data jika perlu. Tetapi === dan !== jangan, mereka membandingkan nilai dan jenis data pada masa yang sama, yang juga menjadikannya lebih pantas daripada == dan !=.
[10] === 10 // adalah palsu
[10] == 10 // adalah benar
'10' == 10 // adalah benar
'10' === 10 // adalah palsu
[] == 0 // adalah benar
[] === 0 // adalah palsu
'' == palsu // adalah benar tetapi benar == "a" adalah palsu
'' === palsu // adalah palsu
3 Keputusan logik bagi rentetan terkurang, nol, 0, palsu, NaN dan kosong adalah palsu

4. Gunakan koma bertitik di hujung baris

Secara praktikal, lebih baik menggunakan koma bertitik Tidak kira jika anda terlupa untuk menulisnya Dalam kebanyakan kes, penterjemah JavaScript akan menambahkannya secara automatik.

5. Gunakan pembina objek

function Person(firstName, lastName){
 this.firstName = firstName;
 this.lastName = lastName;
}
var Saad = new Person("Saad", "Mousliki");
Salin selepas log masuk

6 Gunakan typeof, instanceof dan constructor dengan berhati-hati

  • typeof: Operator unary JavaScript, digunakan untuk mengembalikan jenis asal pembolehubah dalam bentuk rentetan Perhatikan bahawa typeof null juga akan mengembalikan objek, dan kebanyakan jenis objek (tatasusunan, tarikh, dll.) juga akan mengembalikan objek
  • pembina: Sifat prototaip dalaman, boleh ditindih melalui kod
  • instanceof: Operator JavaScript, yang akan mencari dalam pembina dalam rantaian prototaip Jika ditemui, ia akan kembali benar, jika tidak ia akan mengembalikan palsu
var arr = ["a", "b", "c"];
typeof arr; // 返回 "object" 
arr instanceof Array // true
arr.constructor(); //[]
Salin selepas log masuk

7. Gunakan fungsi panggilan kendiri

Fungsi ini dilaksanakan secara automatik terus selepas penciptaan, biasanya dipanggil fungsi tanpa nama yang dipanggil sendiri (Fungsi Tanpa Nama Yang Diminta Sendiri) atau dipanggil secara langsung ungkapan fungsi (Ungkapan Fungsi Yang Dikenakan Serta-merta). Formatnya adalah seperti berikut:

(function(){
 // 置于此处的代码将自动执行
})(); 
(function(a,b){
 var result = a+b;
 return result;
})(10,20)
Salin selepas log masuk

8 Dapatkan ahli secara rawak daripada tatasusunan

var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor(Math.random() * items.length)];
Salin selepas log masuk

9. Dapatkan nombor rawak dalam julat yang ditentukan

Fungsi ini amat berguna apabila menjana data palsu untuk ujian, seperti gaji dalam julat tertentu.

Salin kod Kod adalah seperti berikut:
var x = Math.floor(Math.random() * (maks - min 1 )) min;

10 Hasilkan tatasusunan digital daripada 0 kepada nilai yang ditentukan

var numbersArray = [] , max = 100;
for( var i=1; numbersArray.push(i++) < max;); // numbers = [1,2,3 ... 100]
Salin selepas log masuk

11. Hasilkan rentetan abjad angka rawak

function generateRandomAlphaNum(len) {
 var rdmString = "";
 for( ; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));
 return rdmString.substr(0, len);
}
Salin selepas log masuk

12. Mengganggu susunan susunan nombor

var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
numbers = numbers.sort(function(){ return Math.random() - 0.5});
/* numbers 数组将类似于 [120, 5, 228, -215, 400, 458, -85411, 122205] */
Salin selepas log masuk

Fungsi pengisihan tatasusunan terbina dalam JavaScript digunakan di sini Cara yang lebih baik ialah menggunakan kod khusus untuk melaksanakannya (seperti algoritma Fisher-Yates Anda boleh melihat perbincangan ini di StackOverFlow.
13. Alih keluar ruang daripada rentetan

Java, C#, PHP dan bahasa lain semuanya melaksanakan fungsi penyingkiran ruang rentetan khas, tetapi ia tidak tersedia dalam JavaScript Anda boleh menggunakan kod berikut untuk mengkonfigurasi objek rentetan<. 🎜> berfungsi melalui kod A berikutfungsi trim: String.prototype.trim = function(){return this.replace(/^s |s $/g, "");};
Enjin JavaScript baharu sudah mempunyai pelaksanaan asli
trim().
14. Tambahkan antara tatasusunan

var array1 = [12 , "foo" , {name "Joe"} , -2458];
var array2 = ["Doe" , 555 , 100];
Array.prototype.push.apply(array1, array2);
/* array1 值为 [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */
Salin selepas log masuk

15. Tukar objek kepada tatasusunan

Salin kod Kod adalah seperti berikut:
var argArray = Array.prototype.slice.call(arguments );

16. Sahkan sama ada ia adalah nombor

function isNumber(n){
 return !isNaN(parseFloat(n)) && isFinite(n);
}
Salin selepas log masuk

17 Sahkan sama ada ia adalah tatasusunan

function isArray(obj){
 return Object.prototype.toString.call(obj) === '[object Array]' ;
}
Salin selepas log masuk
Tetapi jika kaedah

toString() ditindih, ia tidak akan berfungsi. Anda juga boleh menggunakan kaedah berikut:

Salin kod Kodnya adalah seperti berikut:
Array.isArray(obj); // kaedah Tatasusunan yang baharu
Jika bingkai tidak digunakan dalam penyemak imbas, instanceof juga boleh digunakan, tetapi jika konteksnya terlalu rumit, ralat mungkin berlaku.

var myFrame = document.createElement('iframe');
document.body.appendChild(myFrame);
var myArray = window.frames[window.frames.length-1].Array;
var arr = new myArray(a,b,10); // [a,b,10] 
// myArray 的构造器已经丢失,instanceof 的结果将不正常
// 构造器是不能跨 frame 共享的
arr instanceof Array; // false
Salin selepas log masuk

18、获取数组中的最大值和最小值

var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; 
var maxInNumbers = Math.max.apply(Math, numbers); 
var minInNumbers = Math.min.apply(Math, numbers);
Salin selepas log masuk

详细内容可以参考这篇文章: 《JavaScript如何获取数组最大值和最小值》

19、清空数组

var myArray = [12 , 222 , 1000 ]; 
myArray.length = 0; // myArray will be equal to [].
Salin selepas log masuk

20、不要直接从数组中delete或remove元素

如果对数组元素直接使用delete,其实并没有删除,只是将元素置为了undefined。数组元素删除应使用splice
切忌:

var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; 
items.length; // return 11 
delete items[3]; // return true 
items.length; // return 11 
/* items 结果为 [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */
Salin selepas log masuk

而应:

var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; 
items.length; // return 11 
items.splice(3,1) ; 
items.length; // return 10 
/* items 结果为 [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119]
Salin selepas log masuk

删除对象的属性时可以使用delete。
21、使用length属性截断数组

前面的例子中用length属性清空数组,同样还可用它来截断数组:

var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ]; 
myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].
Salin selepas log masuk

与此同时,如果把length属性变大,数组的长度值变会增加,会使用undefined来作为新的元素填充。length是一个可写的属性。

myArray.length = 10; // the new array length is 10 
myArray[myArray.length - 1] ; // undefined
Salin selepas log masuk

22、在条件中使用逻辑与或

var foo = 10; 
foo == 10 && doSomething(); // is the same thing as if (foo == 10) doSomething(); 
foo == 5 || doSomething(); // is the same thing as if (foo != 5) doSomething();
Salin selepas log masuk

逻辑或还可用来设置默认值,比如函数参数的默认值。

function doSomething(arg1){ 
 arg1 = arg1 || 10; // arg1 will have 10 as a default value if it's not already set
}
Salin selepas log masuk

23、使得map()函数方法对数据循环

var squares = [1,2,3,4].map(function (val) { 
 return val * val; 
}); 
// squares will be equal to [1, 4, 9, 16]
Salin selepas log masuk

24、保留指定小数位数

var num =2.443242342;
num = num.toFixed(4); // num will be equal to 2.4432
Salin selepas log masuk

注意,toFixec()返回的是字符串,不是数字。
25、浮点计算的问题

0.1 + 0.2 === 0.3 // is false
9007199254740992 + 1 // is equal to 9007199254740992
9007199254740992 + 2 // is equal to 9007199254740994

为什么呢?因为0.1+0.2等于0.30000000000000004。JavaScript的数字都遵循IEEE 754标准构建,在内部都是64位浮点小数表示,具体可以参见JavaScript中的数字是如何编码的.
可以通过使用toFixed()和toPrecision()来解决这个问题。
26、通过for-in循环检查对象的属性

下面这样的用法,可以防止迭代的时候进入到对象的原型属性中。

for (var name in object) { 
 if (object.hasOwnProperty(name)) { 
  // do something with name
 } 
}
Salin selepas log masuk

27、逗号操作符

var a = 0; 
var b = ( a++, 99 ); 
console.log(a); // a will be equal to 1 
console.log(b); // b is equal to 99
Salin selepas log masuk

28、临时存储用于计算和查询的变量

在jQuery选择器中,可以临时存储整个DOM元素。

var navright = document.querySelector('#right'); 
var navleft = document.querySelector('#left'); 
var navup = document.querySelector('#up'); 
var navdown = document.querySelector('#down');
Salin selepas log masuk

29、提前检查传入isFinite()的参数

isFinite(0/0) ; // false
isFinite("foo"); // false
isFinite("10"); // true
isFinite(10); // true
isFinite(undefined); // false
isFinite(); // false
isFinite(null); // true,这点当特别注意
Salin selepas log masuk

30、避免在数组中使用负数做索引

var numbersArray = [1,2,3,4,5];
 var from = numbersArray.indexOf("foo") ; // from is equal to -1
 numbersArray.splice(from,2); // will return [5]
Salin selepas log masuk

注意传给splice的索引参数不要是负数,当是负数时,会从数组结尾处删除元素。
31、用JSON来序列化与反序列化

var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} };
var stringFromPerson = JSON.stringify(person);
/* stringFromPerson 结果为 "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */
var personFromString = JSON.parse(stringFromPerson);
/* personFromString 的值与 person 对象相同 */
Salin selepas log masuk

32、不要使用eval()或者函数构造器

eval()和函数构造器(Function consturctor)的开销较大,每次调用,JavaScript引擎都要将源代码转换为可执行的代码。

var func1 = new Function(functionCode);
var func2 = eval(functionCode);
Salin selepas log masuk

33、避免使用with()

使用with()可以把变量加入到全局作用域中,因此,如果有其它的同名变量,一来容易混淆,二来值也会被覆盖。
34、不要对数组使用for-in

避免:

var sum = 0; 
for (var i in arrayNumbers) { 
 sum += arrayNumbers[i]; 
}
Salin selepas log masuk

而是:

var sum = 0; 
for (var i = 0, len = arrayNumbers.length; i < len; i++) { 
 sum += arrayNumbers[i]; 
}
Salin selepas log masuk

另外一个好处是,i和len两个变量是在for循环的第一个声明中,二者只会初始化一次,这要比下面这种写法快:
for (var i = 0; i < arrayNumbers.length; i++)
35、传给setInterval()和setTimeout()时使用函数而不是字符串

如果传给setTimeout()和setInterval()一个字符串,他们将会用类似于eval方式进行转换,这肯定会要慢些,因此不要使用:

setInterval('doSomethingPeriodically()', 1000); 
setTimeout('doSomethingAfterFiveSeconds()', 5000);
Salin selepas log masuk

而是用:

setInterval(doSomethingPeriodically, 1000); 
setTimeout(doSomethingAfterFiveSeconds, 5000);
Salin selepas log masuk

36、使用switch/case代替一大叠的if/else

当判断有超过两个分支的时候使用switch/case要更快一些,而且也更优雅,更利于代码的组织,当然,如果有超过10个分支,就不要使用switch/case了。
37、在switch/case中使用数字区间

其实,switch/case中的case条件,还可以这样写:

function getCategory(age) { 
 var category = ""; 
 switch (true) { 
  case isNaN(age): 
   category = "not an age"; 
   break; 
  case (age >= 50): 
   category = "Old"; 
   break; 
  case (age <= 20): 
   category = "Baby"; 
   break; 
  default: 
   category = "Young"; 
   break; 
 }; 
 return category; 
} 
getCategory(5); // 将返回 "Baby"
Salin selepas log masuk

38、使用对象作为对象的原型

下面这样,便可以给定对象作为参数,来创建以此为原型的新对象:

function clone(object) { 
 function OneShotConstructor(){}; 
 OneShotConstructor.prototype = object; 
 return new OneShotConstructor(); 
} 
clone(Array).prototype ; // []
Salin selepas log masuk

39、HTML字段转换函数

function escapeHTML(text) { 
 var replacements= {"<": "<", ">": ">","&": "&", "\"": """};      
 return text.replace(/[<>&"]/g, function(character) { 
  return replacements[character]; 
 }); 
}
Salin selepas log masuk

40、不要在循环内部使用try-catch-finally

try-catch-finally中catch部分在执行时会将异常赋给一个变量,这个变量会被构建成一个运行时作用域内的新的变量。
切忌:

var object = ['foo', 'bar'], i; 
for (i = 0, len = object.length; i <len; i++) { 
 try { 
  // do something that throws an exception 
 } 
 catch (e) { 
  // handle exception 
 } 
}
Salin selepas log masuk

而应该:

var object = ['foo', 'bar'], i; 
try { 
 for (i = 0, len = object.length; i <len; i++) { 
  // do something that throws an exception 
 } 
} 
catch (e) { 
 // handle exception 
}
Salin selepas log masuk

41、使用XMLHttpRequests时注意设置超时

XMLHttpRequests在执行时,当长时间没有响应(如出现网络问题等)时,应该中止掉连接,可以通过setTimeout()来完成这个工作:

var xhr = new XMLHttpRequest (); 
xhr.onreadystatechange = function () { 
 if (this.readyState == 4) { 
  clearTimeout(timeout); 
  // do something with response data 
 } 
} 
var timeout = setTimeout( function () { 
 xhr.abort(); // call error callback 
}, 60*1000 /* timeout after a minute */ ); 
xhr.open('GET', url, true); 
xhr.send();
Salin selepas log masuk

同时需要注意的是,不要同时发起多个XMLHttpRequests请求。
42、处理WebSocket的超时

通常情况下,WebSocket连接创建后,如果30秒内没有任何活动,服务器端会对连接进行超时处理,防火墙也可以对单位周期没有活动的连接进行超时处理。
为了防止这种情况的发生,可以每隔一定时间,往服务器发送一条空的消息。可以通过下面这两个函数来实现这个需求,一个用于使连接保持活动状态,另一个专门用于结束这个状态。

var timerID = 0; 
function keepAlive() { 
 var timeout = 15000; 
 if (webSocket.readyState == webSocket.OPEN) { 
  webSocket.send(''); 
 } 
 timerId = setTimeout(keepAlive, timeout); 
} 
function cancelKeepAlive() { 
 if (timerId) { 
  cancelTimeout(timerId); 
 } 
}
Salin selepas log masuk

keepAlive()函数可以放在WebSocket连接的onOpen()方法的最后面,cancelKeepAlive()放在onClose()方法的最末尾。

以上就是为大家分享的javascript开发技巧,希望对大家的学习有所帮助。

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan