博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

javascript技巧(一)

Posted on 2010-11-07 15:14  三块石头  阅读(285)  评论(0)    收藏  举报

本文主要讲解一些基本的javascript技巧,一是为初学者提供帮助,二是温习以前学过的知识。

1.apply与call的区别

其实apply和call没有什么大的区别,它们完成的功能都一样,就是完成方法的调用,但两者传入的参数有所不同。看例子:

1 var obj={name:'jack'}
2
3  function fn(age,address){
4 alert(this.name+"-->"+age+"-->"+address);
5 }
6
7 fn.call(obj,3,'USA');
8 fn.apply(obj,[3,'USA']);

上述代码运行结果都是"jack-->3-->USA" call方法传入的第一个参数是函数运行的上下文环境,第二、三个……参数就是函数fn本身的参数了。至于apply,它的第一个参数也是上下文环境,第二个参数是一个数组,也是fn本身的参数

 

2.日期解析的问题

比如有这么一个字符串'Sun May 31 09:13:25 UTC+0800 2009',我们可以这样把它解析成日期:

1 var time=Date.parse('Sun May 31 09:13:25 UTC+0800 2009');
2  var date=new Date(time);


3.字符串拼接问题

有时候我们需要字符串的连接,这时我们常用"+"号来拼接,这样做方便、快捷,似乎一切都顺理成章。但是,当我们拼接特别长的字符串时,问题出现了:字符串越长,拼接时间越慢。因为每次用"+"号进行连接时,我们都需要创建一个新的string对象,所以要连接的字符越长,速度也就越慢了。怎么办,我们可以采用数组的join方法。如:

var arr=["one","two","three","four"]
var str=arr.join("");

str的结果就为"onetwothreefour"。

在java中有一个StringBuffer类,我们也可以模拟一个:

代码
1 function StringBuffer(){
2    this.__string__=[];
3   if(typeof StringBuffer._initialzed=="undefined"){
4     StringBuffer.prototype.append=function(str){
5       this.__string__.push(str);
6     }
7     StringBuffer.prototype.toString=function(){
8        this.__string__.join("");
9     }
10     StringBuffer._initialzed=true;
11   }
12 }

使用方式也很简单,只需要这样书写即可:

1 var sb=new StringBuffer();
2 sb.append("one");sb.append("two");sb.append("three");
3  var str=sb.toString();

 

4.快速去除数组中相同的元素

假设有一个数组,它有1万个元素,但其中有相同的元素,怎么去掉这些相同的元素呢? 一想,很简单吧?遍历呗,然后进行比较判断。现在介绍一种更简单快捷的方法,甚至不需要比较判断。。为了方便,我们改写Array的原型。

1 Array.prototype.unique=function(){
2    var obj={},res=[];
4    for(var i=this.length-1;i>=0;i--){
5     obj[this[i]]=1;
6   }
7    for(var value in obj){
8     res.push(value);
9   }
10    return res;
11 }

var arr=[1,2,3,···].unique() 就去掉了数组中重复的元素。

 

5 表单提交的问题

假设有一个form,它的代码如下:

1 <form action="demo.jsp" method="post" id="frm">
2  </form>

现在我们有一个需求:我们在form下增加一个文件上传控件,也就是<input type="file" />,由于form只是一个普通的form,怎么样才能使得form能上传文件哩?

也许你想到了,上传文件需要设置 form的 enctype属性为multipart/form-data 于是你这么做了:

1 var form=document.getElementById('frm");
2 form.setAttribute("enctype","multipart/form-data");

在firefox下测试,一切ok,但是在ie下却出了问题?为什么,愁人!原来ie和firefox的安全机制是不一样的。不同的安全机制,操作方法就不尽相同了。在ie下,应该这么操作:

 

1 var form=document.getElementById('frm"),
2 encType = form.getAttributeNode("enctype");
3 encType.value="multipart/form-data";

这样,一切都ok了,世间开始变得清静起来……