整理JavaScript方面的一些技巧。比較有用的函数,常见功能实现方法,仅作參考

变量转换

  1. //edit http://www.lai18.com
  2. var myVar = "3.14159",
  3. str = ""+ myVar,// to string
  4. int = ~~myVar, // to integer
  5. float = 1*myVar, // to float
  6. bool = !!myVar, /* to boolean - any string with length
  7. and any number except 0 are true */
  8. array = [myVar]; // to array

可是转换日期(new Date(myVar))和正則表達式(new RegExp(myVar))必须使用构造函数,创建正則表達式的时候要使用/pattern/flags这种简化形式。

 



取整同一时候转换成数值型 

  1. //edit http://www.lai18.com
  2. //字符型变量參与运算时,JS会自己主动将其转换为数值型(假设无法转化,变为NaN)
  3. '10.567890' | 0
  4. //结果: 10
  5. //JS里面的全部数值型都是双精度浮点数,因此,JS在进行位运算时。会首先将这些数字运算数转换为整数。然后再运行运算
  6. //| 是二进制或, x|0 永远等于x;^为异或。同0异1,所以 x^0 还是永远等于x;至于~是按位取反,搞了两次以后值当然是一样的
  7. '10.567890' ^ 0
  8. //结果: 10
  9. - 2.23456789 | 0
  10. //结果: -2
  11. ~~-2.23456789
  12. //结果: -2

日期转数值

  1. //JS本身时间的内部表示形式就是Unix时间戳,以毫秒为单位记录着当前距离1970年1月1日0点的时间单位
  2. var d = +new Date(); //1295698416792

类数组对象转数组

  1. var arr =[].slice.call(arguments)

以下的实例用的更绝

  1. function test() {
  2. var res = ['item1', 'item2']
  3. res = res.concat(Array.prototype.slice.call(arguments)) //方法1
  4. Array.prototype.push.apply(res, arguments) //方法2
  5. }

进制之间的转换

  1. (int).toString(16); // converts int to hex, eg 12 => "C"
  2. (int).toString(8); // converts int to octal, eg. 12 => "14"
  3. parseInt(string,16) // converts hex to int, eg. "FF" => 255
  4. parseInt(string,8) // converts octal to int, eg. "20" => 16

将一个数组插入还有一个数组指定的位置

  1. var a = [1,2,3,7,8,9];
  2. var b = [4,5,6];
  3. var insertIndex = 3;
  4. a.splice.apply(a, Array.prototype.concat(insertIndex, 0, b));

删除数组元素

  1. var a = [1,2,3,4,5];
  2. a.splice(3,1); //a = [1,2,3,5]

大家或许会想为什么要用splice而不用delete,由于用delete将会在数组里留下一个空洞,并且后面的下标也并没有递减。

推断是否为IE



  1. var ie = /*@cc_on !@*/false;

这样一句简单的话就能够推断是否为ie,太。。





事实上还有很多其它妙的方法,请看以下

  1. //edit http://www.lai18.com
  2. // 貌似是最短的,利用IE不支持标准的ECMAscript中数组末逗号忽略的机制
  3. var ie = !-[1,];
  4. // 利用了IE的条件凝视
  5. var ie = /*@cc_on!@*/false;
  6. // 还是条件凝视
  7. var ie//@cc_on=1;
  8. // IE不支持垂直制表符
  9. var ie = '\v'=='v';
  10. // 原理同上
  11. var ie = !+"\v1";

学到这个瞬间认为自己弱爆了。







尽量利用原生方法




要找一组数字中的最大数,我们可能会写一个循环。比如:

  1. var numbers = [3,342,23,22,124];
  2. var max = 0;
  3. for(var i=0;i<numbers.length;i++){
  4. if(numbers[i] > max){
  5. max = numbers[i];
  6. }
  7. }
  8. alert(max);

事实上利用原生的方法,能够更简单实现

  1. var numbers = [3,342,23,22,124];
  2. numbers.sort(function(a,b){return b - a});
  3. alert(numbers[0]);

当然最简洁的方法便是:

  1. Math.max(12,123,3,2,433,4); // returns 433

当前也能够这样

  1. Math.max.apply(Math, [12, 123, 3, 2, 433, 4]) //取最大值
  2. Math.min.apply(Math, [12, 123, 3, 2, 433, 4]) //取最小值

生成随机数

  1. Math.random().toString(16).substring(2);// toString() 函数的參数为基底,范围为2~36。
  2. Math.random().toString(36).substring(2);

不用第三方变量交换两个变量的值

  1. a=[b, b=a][0];

事件委派



举个简单的样例:html代码例如以下

  1. <h2>Great Web resources</h2>
  2. <ul id="resources">
  3. <li><a href="http://opera.com/wsc">Opera Web Standards Curriculum</a></li>
  4. <li><a href="http://sitepoint.com">Sitepoint</a></li>
  5. <li><a href="http://alistapart.com">A List Apart</a></li>
  6. <li><a href="http://yuiblog.com">YUI Blog</a></li>
  7. <li><a href="http://blameitonthevoices.com">Blame it on the voices</a></li>
  8. <li><a href="http://oddlyspecific.com">Oddly specific</a></li>
  9. </ul>

js代码例如以下:

  1. // Classic event handling example
  2. (function(){
  3. var resources = document.getElementById('resources');
  4. var links = resources.getElementsByTagName('a');
  5. var all = links.length;
  6. for(var i=0;i<all;i++){
  7. // Attach a listener to each link
  8. links[i].addEventListener('click',handler,false);
  9. };
  10. function handler(e){
  11. var x = e.target; // Get the link that was clicked
  12. alert(x);
  13. e.preventDefault();
  14. };
  15. })();

利用事件委派能够写出更加优雅的:

  1. (function(){
  2. var resources = document.getElementById('resources');
  3. resources.addEventListener('click',handler,false);
  4. function handler(e){
  5. var x = e.target; // get the link tha
  6. if(x.nodeName.toLowerCase() === 'a'){
  7. alert('Event delegation:' + x);
  8. e.preventDefault();
  9. }
  10. };
  11. })();

检測ie版本号

  1. var _IE = (function(){
  2. var v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i');
  3. while (
  4. div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
  5. all[0]
  6. );
  7. return v > 4 ? v : false ;
  8. }());

javaScript版本号检測



你知道你的浏览器支持哪一个版本号的Javascript吗?

  1. var JS_ver = [];
  2. (Number.prototype.toFixed)?JS_ver.push("1.5"):false;
  3. ([].indexOf && [].forEach)?JS_ver.push("1.6"):false;
  4. ((function(){try {[a,b] = [0,1];return true;}catch(ex) {return false;}})())?JS_ver.push("1.7"):false;
  5. ([].reduce && [].reduceRight && JSON)?JS_ver.push("1.8"):false;
  6. ("".trimLeft)?
  7.  
  8. JS_ver.push("1.8.1"):false;
  9. JS_ver.supports = function()
  10. {
  11.   if (arguments[0])
  12.     return (!!~this.join().indexOf(arguments[0] +",") +",");
  13.   else
  14.     return (this[this.length-1]);
  15. }
  16. alert("Latest Javascript version supported: "+ JS_ver.supports());
  17. alert("Support for version 1.7 : "+ JS_ver.supports("1.7"));

推断属性是否存在

  1. // BAD: This will cause an error in code when foo is undefined
  2. if (foo) {
  3.   doSomething();
  4. }
  5. // GOOD: This doesn't cause any errors. However, even when
  6. // foo is set to NULL or false, the condition validates as true
  7. if (typeof foo != "undefined") {
  8.   doSomething();
  9. }
  10. // BETTER: This doesn't cause any errors and in addition
  11. // values NULL or false won't validate as true
  12. if (window.foo) {
  13.   doSomething();
  14. }

有的情况下,我们有更深的结构和须要更合适的检查的时候

  1. // UGLY: we have to proof existence of every
  2. // object before we can be sure property actually exists
  3. if (window.oFoo && oFoo.oBar && oFoo.oBar.baz) {
  4.   doSomething();
  5. }

事实上最好的检測一个属性是否存在的方法为:

  1. if("opera" in window){
  2. console.log("OPERA");
  3. }else{
  4. console.log("NOT OPERA");
  5. }

检測对象是否为数组

  1. var obj=[];
  2. Object.prototype.toString.call(obj)=="[object Array]";

给函数传递对象

  1. function doSomething() {
  2.   // Leaves the function if nothing is passed
  3.   if (!arguments[0]) {
  4.   return false;
  5.   }
  6.   var oArgs = arguments[0]
  7.   arg0 = oArgs.arg0 || "",
  8.   arg1 = oArgs.arg1 || "",
  9.   arg2 = oArgs.arg2 || 0,
  10.   arg3 = oArgs.arg3 || [],
  11.   arg4 = oArgs.arg4 || false;
  12. }
  13. doSomething({
  14.   arg1 : "foo",
  15.   arg2 : 5,
  16.   arg4 : false
  17. });

为replace方法传递一个函数

  1. var sFlop = "Flop: [Ah] [Ks] [7c]";
  2. var aValues = {"A":"Ace","K":"King",7:"Seven"};
  3. var aSuits = {"h":"Hearts","s":"Spades",
  4. "d":"Diamonds","c":"Clubs"};
  5. sFlop = sFlop.replace(/\[\w+\]/gi, function(match) {
  6.   match = match.replace(match[2], aSuits[match[2]]);
  7.   match = match.replace(match[1], aValues[match[1]] +" of ");
  8.   return match;
  9. });
  10. // string sFlop now contains:
  11. // "Flop: [Ace of Hearts] [King of Spades] [Seven of Clubs]"

循环中使用标签



有时候循环其中嵌套循环。你可能想要退出某一层循环。之前总是用一个标志变量来推断。如今才知道有更好的方法

  1. outerloop:
  2. for (var iI=0;iI<5;iI++) {
  3.   if (somethingIsTrue()) {
  4.   // Breaks the outer loop iteration
  5.   break outerloop;
  6.   }
  7.   innerloop:
  8.   for (var iA=0;iA<5;iA++) {
  9.     if (somethingElseIsTrue()) {
  10.     // Breaks the inner loop iteration
  11.     break innerloop;
  12.   }
  13.   }
  14. }

对数组进行去重

  1. /*
  2. *@desc:对数组进行去重操作。返回一个没有反复元素的新数组
  3. */
  4. function unique(target) {
  5. var result = [];
  6. loop: for (var i = 0, n = target.length; i < n; i++) {
  7. for (var x = i + 1; x < n; x++) {
  8. if (target[x] === target[i]) {
  9. continue loop;
  10. }
  11. }
  12. result.push(target[i]);
  13. }
  14. return result;
  15. }

或者例如以下:

  1. Array.prototype.distinct = function () {
  2. var newArr = [],obj = {};
  3. for(var i=0, len = this.length; i < len; i++){
  4. if(!obj[typeof(this[i]) + this[i]]){
  5. newArr.push(this[i]);
  6. obj[typeof(this[i]) + this[i]] = 'new';
  7. }
  8. }
  9. return newArr;
  10. }

事实上最优的方法是这种

  1. Array.prototype.distinct = function () {
  2. var sameObj = function(a, b){
  3. var tag = true;
  4. if(!a || !b) return false;
  5. for(var x in a){
  6. if(!b[x]) return false;
  7. if(typeof(a[x]) === 'object'){
  8. tag = sameObj(a[x],b[x]);
  9. } else {
  10. if(a[x]!==b[x])
  11. return false;
  12. }
  13. }
  14. return tag;
  15. }
  16. var newArr = [], obj = {};
  17. for(var i = 0, len = this.length; i < len; i++){
  18. if(!sameObj(obj[typeof(this[i]) + this[i]], this[i])){
  19. newArr.push(this[i]);
  20. obj[typeof(this[i]) + this[i]] = this[i];
  21. }
  22. }
  23. return newArr;
  24. }

使用范例(借用评论):

  1. var arr=[{name:"tom",age:12},{name:"lily",age:22},{name:"lilei",age:12}];
  2. var newArr=arr.distinct(function(ele){
  3. return ele.age;
  4. });

查找字符串中出现最多的字符及个数

  1. var i, len, maxobj='', maxnum=0, obj={};
  2. var arr = "sdjksfssscfssdd";
  3. for(i = 0, len = arr.length; i < len; i++){
  4. obj[arr[i]] ? obj[arr[i]]++ : obj[arr[i]] = 1;
  5. if(maxnum < obj[arr[i]]){
  6. maxnum = obj[arr[i]];
  7. maxobj = arr[i];
  8. }
  9. }
  10. alert(maxobj + "在数组中出现了" + maxnum + "次");

事实上还有非常多,这些仅仅是我闲来无事总结的一些罢了。

很多其它JavaScript学习整理參考:

1正则总结:JavaScript中的正則表達式

2JavaScript中变量的类型

3深入知晓JavaScript的作用域问题

4JavaScript探秘:for循环(for Loops)

5JavaScript探秘:for-in循环(for-in Loops)

6JavaScript探秘:Prototypes强大过头了

7JavaScript探秘:var预解析与副作用

8JavaScript探秘:慎重使用全局变量

9JavaScript探秘:编写可维护的代码的重要性

10我们应该怎样去了解JavaScript引擎的工作原理

11JavaScript探秘:命名函数表达式

12JavaScript探秘:调试器中的函数名

13JavaScript探秘:JScript的内存管理

14JavaScript探秘:函数声明与函数表达式

15JavaScript探秘:JScript的Bug

16JavaScript探秘:eval()是“魔鬼”

17JavaScript探秘:基本编码规范

18JavaScript探秘:用parseInt()进行数值转换

19JavaScript探秘:构造函数 Constructor

20运行上下文其一:变量对象与活动对象

21JavaScript探秘:原型链 Prototype chain

22运行上下文其二:作用域链 Scope Chains

23JavaScript探秘:对象Object

24JavaScript探秘:SpiderMonkey的怪癖

25JavaScript探秘:命名函数表达式替代方案

26JavaScript函数其二:函数表达式

27JavaScript函数其四:函数构造器

28JavaScript函数其一:函数声明

29JavaScript函数其三:分组中的函数表达式

30JavaScript探秘:强大的原型和原型链

31运行上下文其四:This指针

32运行上下文其三:闭包 Closures

33JavaScript变量对象其三:运行上下文的两个阶段

34JavaScript变量对象其二:VO在不同的运行上下文中

35JavaScript变量对象其四:关于变量

36JavaScript变量对象其一:VO的声明

37JavaScript变量对象其五:__parent__ 属性

38JavaScript作用域链其三:作用域链特征

39JavaScript作用域链其二:函数的生命周期

40JavaScript作用域链其一:作用域链定义

41JavaScript闭包其二:闭包的实现

42JavaScript闭包其一:闭包概论

43JavaScript闭包其三:闭包的使用方法

44JavaScript对象的訪问与遍历

45JavaScript的变量预解析特性

46新的JavaScript数据结构Streams

47谈谈Javascript的匿名函数

48简述JavaScript的类与对象

49JavaScript定义类与对象的一些方法

50创建JavaScript的哈希表Hashtable

51JavaScript闭包的特性

52谈谈JavaScript的prototype属性

53JavaScriptkeywordreturn的使用方法

54JavaScript是怎样实现继承的

55理清一下JavaScript面向对象思路

56深入JavaScript对象创建的细节

57探讨JavaScript的事件冒泡

58你了解JavaScript非堵塞载入脚本吗

59JavaScript Date的原型方法扩展

60JavaScript prototype背后的工作原理

61一篇博文将JavaScript尽收眼底

62深入浅出JavaScript变量作用域

63闲话JavaScript与Cookies

64一个JavaScript反射使用的样例

65浅析JavaScript的垃圾回收机制

66非堵塞式JavaScript脚本及延伸知识

67JavaScript中继承机制的模仿实现

68JavaScript要理解闭包先了解词法作用域

69深入研究JavaScript的事件机制

70理解JavaScript的function

71JavaScript对象学习笔记

72[JavaScript秘密花园]对象其一:使用和属性

73[JavaScript秘密花园]对象其二:原型

JavaScript学习总结-技巧、有用函数、简洁方法、编程细节的更多相关文章

  1. JavaScript:学习笔记(5)——箭头函数=>以及实践

    JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...

  2. Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  3. JavaScript学习总结-技巧、实用函数、简洁方法、编程细节

    整理JavaScript方面的一些技巧,比较实用的函数,常见功能实现方法,仅作参考 变量转换 var myVar = "3.14159", str = ""+ ...

  4. python学习交流 - 内置函数使用方法和应用举例

    内置函数 python提供了68个内置函数,在使用过程中用户不再需要定义函数来实现内置函数支持的功能.更重要的是内置函数的算法是经过python作者优化的,并且部分是使用c语言实现,通常来说使用内置函 ...

  5. python学习12-反射 判断函数与方法(转载)

    一.三个内置函数 1.issubclass(a, b)  判断a类是否是b类的子类 class Foo: pass class Zi(Foo): pass class Sun(Zi): passpri ...

  6. JavaScript学习总结【8】、面向对象编程

    1.什么是面向对象编程 要理解面向对象,得先搞清楚什么是对象,首先需要明确一点这里所说的对象,不是生活中的搞男女朋友对象,面向对象就是面向着对象,换在代码中,就是一段代码相中了另一段代码,自此夜以继日 ...

  7. JavaScript学习总结之数组常用的方法和属性

    先点赞后关注,防止会迷路寄语:没有一个冬天不会过去,没有一个春天不会到来. 前言数组常用的属性和方法常用属性返回数组的大小常用方法栈方法队列方法重排序方法操作方法转换方法迭代方法归并方法总结结尾 前言 ...

  8. JavaScript学习笔记-用于模式匹配的String方法

    用于模式匹配的String方法:   String支持4种使用正则表达式的方法:           seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的子串的位置,找不到则返回-1,如 ...

  9. javascript学习4、Function函数、伪数组arguments

    一.Function函数基础 函数:就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 1.函数的作用: 将大量重复的语句写在函数里,以后需要这些语句的时候,可以直接调用函数,避免重复劳动. ...

随机推荐

  1. [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boy ...

  2. 【 D3.js 高级系列 — 2.0 】 捆图

    捆图(Bundle)是 D3 中比较奇特的一个布局,只有两个函数,而且需要与其它布局配合使用.本文讲述捆图的制作方法. 有关捆图的例子极少,很容易找到的是:http://bl.ocks.org/mbo ...

  3. Java中的字符串驻留(String Interning)

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  4. Mysql加密方式

    MySQL数据库的认证密码有两种方式, MySQL 4.1版本之前是MySQL323加密,MySQL 4.1和之后的版本都是MySQLSHA1加密, MySQL数据库中自带Old_Password(s ...

  5. 让memcached和mysql更好的工作

    这次是Fotolog的经验,传说中比Flickr更大的网站,Fotolog在21台服务器上部署了51个memcached实例,总计有254G缓存空间可用,缓存了多达175G的内容,这个数量比很多网站的 ...

  6. stm32 DAC输出音频

    #define DAC_DHR8R1_Address 0x40007410 // Init Structure definition DAC_InitTypeDef DAC_InitStructure ...

  7. 【ruby on rail 项目之 VPS下载机】

    [idea] 感觉互联网上国内难以下载资源的资源,通过VPS下载后再拖回来,想做个集成功能的.这里定个计划.打算开始做,项目会在github上同步更新. [start]

  8. [原][Android]All WebView methods must be called on the same thread.

    问题 webView调用JS出错. class TestJS {         ......         public TestJS(){         }                   ...

  9. VIJOS-P1340 拯救ice-cream(广搜+优先级队列)

    题意:从s到m的最短时间.(“o"不能走,‘#’走一个花两个单位时间,‘.'走一个花一个单位时间) 思路:广搜和优先队列. #include <stdio.h> #include ...

  10. AJAX— 异步传输

    AJAX异步传输 AJAX— 异步传输 AJAX浏览器与服务器异步传输数据,通过异步请求大大减少数据信息访问量,通俗:AJAX对局部刷新而不是对整个页面刷新,AJAX使得程序更快,更友好. AJAX处 ...