七个开法者经常忽略或误用的JavaScript基本知识
七个开法者经常忽略或误用的JavaScript基本知识
翻译自 http://tech.pro/tutorial/1453/7-javascript-basics-many-developers-aren-t-using-properly ,我觉得4、5、6条还是蛮有用的哈。
1. String.prototype.replace: /g and /i 标识
让很多新手疑惑的是,JavaScript里的字符串的replace方法不会替换所有匹配的字符,而是只替换第一次匹配的字符。当然熟悉JavaScript的老手知道我们需要一个正则表达式和一个/g标识。
// 错误的用法
str ="David is an Arsenal fan, which means David is great";
str.replace("David","Darren");// "Darren is an Arsenal fan, which means David is great"
// 想要的效果
str.replace(/David/g,"Darren");// "Darren is an Arsenal fan, which means Darren is great"
另一种常犯的错误是当字符串大小写不敏感时不使用 /i 标志来匹配
str.replace(/david/gi,"Darren")// "Darren will always be an Arsenal fan, which means Darren will always be great"
每一个JavaScript开发者都被每一个标志坑过,所以要保证在适合的时候使用这些标志。
2. Array-Like Objects 和 Array.prototype.slice
Array的slice方法主要用来提取数组中的一部分,很多开发者不知道slice方法可以将类数组的对象转换成真正的数组,比如 arguments,NodeLists。
var nodesArr =Array.prototype.slice.call(document.querySelectorAll("div"));// "true" array of DIVs
var argsArr =Array.prototype.slice.call(arguments);// changes arguments to "true" array
你甚至可以用slice克隆一个数组:
var clone = myArray.slice(0);// naive clone
Array.prototype.slice 绝对是JavaScript世界中的精华,即时JS熟手也不一定知道它全部的威力。
3. Array.prototype.sort
Array sort方法被广泛使用,很多开发者以为sort方法做这样的事情:
[1,3,9,2].sort();// Returns: [1, 2, 3, 9]
这样是对的,但是sort有更强大的用法,像这样:
[
{ name: "Robin Van PurseStrings", age: 30 },
{ name: "Theo Walcott", age: 24 },
{ name: "Bacary Sagna", age: 28 }
].sort(function(obj1, obj2) {
// Ascending: first age less than the previous
return obj1.age - obj2.age;
});
// Returns:
// [
// { name: "Theo Walcott", age: 24 },
// { name: "Bacary Sagna", age: 28 },
// { name: "Robin Van PurseStrings", age: 30 }
// ]
4. Array 长度截断
没有一个开发者没被JavaScript的传递对象引用的特性坑过,常常这样来清空一个数组,但却错误的创建了一个新的数组。
var myArray = yourArray =[1,2,3];// :(
myArray =[];// "yourArray" 还是 [1, 2, 3]
// 正确的方法,保持引用
myArray.length =0;// "yourArray" and "myArray" 都变成了 []
5. push方法来合并数组
我在第二条展示了Array的slice方法的强大能力,所以push方法有这样的能力你也不会见怪了。这次我们用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
}
当然,这能正常工作,但它不是很高效。因为对象的方法检测在浏览器中可能会导致分配资源,上面的代码在某些浏览器曾导致内存泄漏。更好的方法检测对象的key:
if("geolocation"in navigator){
// Do some stuff
}
这样的key检测使用简单并且避免了很多问题,比如一个属性的值是false,那么你的检测会失败,即使key存在。
7. Event preventDefault 和 stopPropagation
当元素被点击时(比如链接),我们经常触发自己的函数。显然,我们不希望浏览器继续访问这个链接,所以我们使用JavaScript库的Event.stop方法:
$("a.trigger").on("click",function(e){
e.stop();
// Do more stuff
});
这个方法的问题在于它不仅阻止了浏览器的默认行为,而且阻止了事件冒泡。也就是说,其他的事件监听器不会监听到这个事件。
所以最好是直接使用preventDefault方法。
一些开发者可能会说:“我知道这些!”,但是他们也常常犯这样的错误,所以不要忽略这些小的细节,它们可能造成大的差异。
附:preventDefault与return false 的区别 http://stackoverflow.com/questions/1357118/event-preventdefault-vs-return-false
七个开法者经常忽略或误用的JavaScript基本知识的更多相关文章
- FreeSql (七)插入数据时忽略列
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...
- JavaScript开发者常忽略或误用的七个基础知识点
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- JavaScript 开发者经常忽略或误用的七个基础知识点(转)
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- JavaScript 开发者经常忽略或误用的七个基础知识点
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- (转)JavaScript 开发者经常忽略或误用的七个基础知识点
英文原文:7 JavaScript Basics Many Developers Aren't Using (Properly) JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和 ...
- 七牛开发文档php
http://developer.qiniu.com/docs/v6/sdk/php-sdk.html#overview http://developer.qiniu.com/docs/v6/sdk/ ...
- javaScript 基础知识汇总(七)
1.数组 特点:数组是可以存储有序集合的对象. 声明: let arr = new Array(); let arr=[]; 大多数情况下我们使用第二种. let fruits = [" ...
- Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况
由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...
- 阿里云CentOS自动备份MySql 8.0并上传至七牛云
本文主要介绍一下阿里云CentOS7下如何对MySql 8.0数据库进行自动备份,并使用.NET Core 将备份文件上传至七牛云存储上,并对整个过程所踩的坑加以记录. 环境.工具.准备工作 服务器: ...
随机推荐
- hdu(2062)-Subset sequence 组合数学
意甲冠军:查找集合{1,2,3...n}第一m一个排列子. 收集的线索所行的大小. 例两个元素的排列子集合按字典树排列是:{1},{1,2},{2},{2,1}: 解法:一个一个元素来确定,每次把剩余 ...
- python算法题
python几道简单的算法题 最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧. 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都 ...
- IOS中 类扩展 xib
一.类扩展(class extension,匿名分类) .格式 @interface 类名 () { // 成员变量... } // 方法声明... @end .作用 > 写在.m文件中 > ...
- 【phpMyAdmin】更改配置文件连接到其他server
默认phpMyAdmin安装完毕后对机器的访问mysql,但有时我们需要访问其它server的mysql数据库,所以我们需要配置. 真,phpMyAdmin已经为我们做了配置的选项.可是须要我们进行一 ...
- Installshield停止操作系统进程的代码 --IS6及以上版本适用
原文:Installshield停止操作系统进程的代码 --IS6及以上版本适用 setup.rul的代码 Code;end;///////////////////////////////////// ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- php连接sql server 2008数据库
原文:php连接sql server 2008数据库 关于php连接sql server 2008的问题,2000的版本可以直接通过php中的配置文件修改,2005以上的版本就不行了,需要使用微软公司 ...
- 布尔逻辑运算,goto语句
布尔逻辑 bool类型可以有两个值:true或者false. 布尔比较需要使用布尔比较运算符(关系运算符),下图:var1为布尔类型的变量,var2,var3则可以是不同类型.
- windows 7 telnet 开启关闭
win7运行telnet提示:'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件 原因:win7默认没有打开此功能 解决方案:控制面板->程序和功能->打开或关闭wind ...
- mysql存储过程及常用函数
原文:mysql存储过程及常用函数 一.函数 1.数学函数 CEIL()进一取整 SELECT CEIL(1.2);2 FLOOR()舍一取整 SELECT FLOOR(1.9);9 MOD取余数(取 ...