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

变量转换

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

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

 



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

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

日期转数值

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

类数组对象转数组

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

以下的实例用的更绝

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

进制之间的转换

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

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

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

删除数组元素

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

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

推断是否为IE



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

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





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

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

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







尽量利用原生方法




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

var numbers = [3,342,23,22,124];
var max = 0;
for(var i=0;i<numbers.length;i++){
if(numbers[i] > max){
max = numbers[i];
}
}
alert(max);

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

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

当然最简洁的方法便是:

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

当前也能够这样

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

生成随机数

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

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

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

事件委派



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

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

js代码例如以下:

// Classic event handling example
(function(){
var resources = document.getElementById('resources');
var links = resources.getElementsByTagName('a');
var all = links.length;
for(var i=0;i<all;i++){
// Attach a listener to each link
links[i].addEventListener('click',handler,false);
};
function handler(e){
var x = e.target; // Get the link that was clicked
alert(x);
e.preventDefault();
};
})();

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

(function(){
var resources = document.getElementById('resources');
resources.addEventListener('click',handler,false);
function handler(e){
var x = e.target; // get the link tha
if(x.nodeName.toLowerCase() === 'a'){
alert('Event delegation:' + x);
e.preventDefault();
}
};
})();

检測ie版本号

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

javaScript版本号检測



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

var JS_ver = [];
(Number.prototype.toFixed)?JS_ver.push("1.5"):false;
([].indexOf && [].forEach)?JS_ver.push("1.6"):false;
((function(){try {[a,b] = [0,1];return true;}catch(ex) {return false;}})())?JS_ver.push("1.7"):false;
([].reduce && [].reduceRight && JSON)?JS_ver.push("1.8"):false;
("".trimLeft)? JS_ver.push("1.8.1"):false;
JS_ver.supports = function()
{
  if (arguments[0])
    return (!!~this.join().indexOf(arguments[0] +",") +",");
  else
    return (this[this.length-1]);
}
alert("Latest Javascript version supported: "+ JS_ver.supports());
alert("Support for version 1.7 : "+ JS_ver.supports("1.7"));

推断属性是否存在

// BAD: This will cause an error in code when foo is undefined
if (foo) {
  doSomething();
}
// GOOD: This doesn't cause any errors. However, even when
// foo is set to NULL or false, the condition validates as true
if (typeof foo != "undefined") {
  doSomething();
}
// BETTER: This doesn't cause any errors and in addition
// values NULL or false won't validate as true
if (window.foo) {
  doSomething();
}

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

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

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

if("opera" in window){
console.log("OPERA");
}else{
console.log("NOT OPERA");
}

检測对象是否为数组

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

给函数传递对象

function doSomething() {
  // Leaves the function if nothing is passed
  if (!arguments[0]) {
  return false;
  }
  var oArgs = arguments[0]
  arg0 = oArgs.arg0 || "",
  arg1 = oArgs.arg1 || "",
  arg2 = oArgs.arg2 || 0,
  arg3 = oArgs.arg3 || [],
  arg4 = oArgs.arg4 || false;
}
doSomething({
  arg1 : "foo",
  arg2 : 5,
  arg4 : false
});

为replace方法传递一个函数

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

循环中使用标签



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

outerloop:
for (var iI=0;iI<5;iI++) {
  if (somethingIsTrue()) {
  // Breaks the outer loop iteration
  break outerloop;
  }
  innerloop:
  for (var iA=0;iA<5;iA++) {
    if (somethingElseIsTrue()) {
    // Breaks the inner loop iteration
    break innerloop;
  }
  }
}

对数组进行去重

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

或者例如以下:

Array.prototype.distinct = function () {
var newArr = [],obj = {};
for(var i=0, len = this.length; i < len; i++){
if(!obj[typeof(this[i]) + this[i]]){
newArr.push(this[i]);
obj[typeof(this[i]) + this[i]] = 'new';
}
}
return newArr;
}

事实上最优的方法是这种

Array.prototype.distinct = function () {
var sameObj = function(a, b){
var tag = true;
if(!a || !b) return false;
for(var x in a){
if(!b[x]) return false;
if(typeof(a[x]) === 'object'){
tag = sameObj(a[x],b[x]);
} else {
if(a[x]!==b[x])
return false;
}
}
return tag;
}
var newArr = [], obj = {};
for(var i = 0, len = this.length; i < len; i++){
if(!sameObj(obj[typeof(this[i]) + this[i]], this[i])){
newArr.push(this[i]);
obj[typeof(this[i]) + this[i]] = this[i];
}
}
return newArr;
}

使用范例(借用评论):

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

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

var i, len, maxobj='', maxnum=0, obj={};
var arr = "sdjksfssscfssdd";
for(i = 0, len = arr.length; i < len; i++){
obj[arr[i]] ? obj[arr[i]]++ : obj[arr[i]] = 1;
if(maxnum < obj[arr[i]]){
maxnum = obj[arr[i]];
maxobj = arr[i];
}
}
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. Java [Leetcode 39]Combination Sum

    题目描述: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in  ...

  2. 我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)

    我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp) 分类: [自动化]2007-07-19 10:04 34038人阅读 评论(38) 收藏 举报 vb嵌入式dostcp ...

  3. ArcGIS.Server.9.3和ArcGIS API for JavaScript地图实现Toorbar功能(四)

    转自:http://www.cnblogs.com/hll2008/archive/2008/11/22/1338630.html 目的:1.ArcGIS API for JavaScript实现To ...

  4. Memcache缓存与Mongodb数据库的优势和应用

    先说说自己对 Memcache和Mongodb的一些看法,主要是抛砖引玉了,希望看到大家的意见和补充. Memcache Memcache的优势我觉得总结下来主要体现在: 1) 分布式.可以由10台拥 ...

  5. 数据库设置表的check约束出现乱码

    采用默认的方式见了一个数据库,但是有个表里需要建一个check约束.将约束保存之后再打开看到中文成了??.后来查了一下是数据库排序规则除了问题. 详见两图即可明白: 这里的约束中文显示乱码: 按下图设 ...

  6. 第一章 :绪论-Twitter数据的收集和处理

    为什么要用twitter,我心里是一万头CNM在飞奔.这个国外的东西很不好访问到的,国内的政策,你懂的,不说这个了,还是想办法翻出去再说吧. 不知道别人都用的什么工具,看到太多的注册就头大,就选了一个 ...

  7. 基于Ubuntu 15.04 LTS编译Android5.1.0源代码 (转)

    原文链接:http://blog.csdn.net/yuxiangyunei/article/details/45365235   环境: ubuntu:ubuntu-15.04-desktop-am ...

  8. 1351 topcoder 吃点心

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1351 先按low从大到小贪心再high从小到大贪心 #pragma c ...

  9. Linode各机房在中国访问速度性能测试

    最近因为google的各种被X的原因,想自己弄个VPS玩玩,比来比去都推荐linode. 因为各种性能测试工具都不靠谱,还是自己机器来的直接,虽然笨拙但是真实可信. 从测试结果上看,明显东京机房的速度 ...

  10. Mac java环境配置

    进入命令行 cd ~ touch .bash_profile vi .bash_profile 输入内容jdk变量配置内容: export JAVA_HOME=/Library/Java/JavaVi ...