技术开发 频道

JavaScript开发者常忽略的七个知识要点

  4. 用length属性来截断数组

  几乎所有开发者都踩过 JavaScript 的这个坑——“传对象只是传引用”。开发者们经常会试图 把一个数组清空,但实际上却错误地创建了一个新数组。

var  myArray = yourArray = [1, 2, 3];

// :(
//
myArray
= []; // `yourArray` is still [1, 2, 3]
              
// `yourArray` 仍然是[1, 2, 3]

// The right way, keeping reference
// 正确的方法是保持引用
myArray.length
= 0; // `yourArray` and `myArray` both []
                    
// `yourArray` 和`myArray`(以及其它所有对这个数组的引用)都变成[] 了

  坑里的人们终于明白,原来传对象只是在传引用。因此当我把 myArray 重新赋值为 [] 时,确实会创建出一个新的空数组,但其它对老数组的引用仍然没变!大坑啊!

  5. 使用push来合并数组

  在上面的第 2 节里,我展示了数组的 slice 和 apply 方法所能组合出的几个小妙招,所以对于数组方法的其它技巧,你应该已经做好心理准备了吧。这次我们使用 push 方法来合并数组:

var  mergeTo = [4,5,6];
var  mergeFrom
= [7,8,9];

Array.prototype.push.apply(mergeTo, mergeFrom);

mergeTo;
// is: [4, 5, 6, 7, 8, 9]

  这是一项不为人知的小技巧,简单的原生方法就可以实现数组合并这样的常见任务。

  6. 高效探测功能特性和对象属性

  很多时候开发者们会像下面这样来探测浏览器的某个特性:

if (navigator.geolocation) {
    
// Do some stuff
    
// 在这里干点事情
}

  当然这可以正常工作,但它并不一定有很好的效率。因为这个对象探测方法会在浏览器中初始化资源。在过去,上面的代码片断可能会在某些浏览器下导致内存泄露。更好、更快的方法是检查对象是否包含某个键名:

if ( "geolocation"  in  navigator) {
    
// Do some stuff
    
// 在这里干点事情
}

  键名检查十分简单,而且可以避免内存泄露。另外请注意,如果这个属性的值是假值,那么前一种探测方式将会得到“否”的结果,并不能真正探测出这个键名是否存在。

  7. 事件对象的preventDefault和stopPropagation方法

  很多时候,当一个动作元素(比如链接)被点击时,会触发某个功能。显然我们并不希望点击链接时浏览器顺着这个链接跳转,于是我们会习惯性地使用JavaScript类库的Event.stop方法:

$( "a.trigger" ).on( "click" , function (e) {
    e.stop();

    
// Do more stuff
    
// 在这里干点事情
});

  这个懒方法有一个问题,它不仅阻止了浏览器的默认动作,同时也阻止了事件继续冒泡。这意味着元素上绑定的其它事件监听器将不会被触发,因为它们根本就不知道有事件发生。此时不妨使用 preventDefault 吧!

  JavaScript 老鸟们看到这篇文章可能会说“我早知道了”,但说不定什么时候,他们就会在某一点上栽跟头。提醒大家留意 JavaScript 中的各种小细节,失之毫厘谬以千里啊!

  译文链接:https://github.com/cssmagic/blog/issues/21

  原文链接:http://tech.pro/tutorial/1453/7-javascript-basics-many-developers-aren-t-using-properly

0
相关文章