作者存档

js中三个等于号

2012年4月16日 没有评论

有时候会看到在判断两个对象是否相等的时候使用了三个等号(===),它和两个等号(==)有什么区别呢?简单来说就是使用“==”时,如果两边类型不同,js引擎会把它们转换成相同类型然后在进行比较,而“===”则不会进行类型转换,因此当两边不是属于同一个类型,肯定不相等。例如:

var a = 0, b = '0';

alert((a == b) + '--' + (a === b))

此时看到的结果为“true–false”。

=== 判断规则

  1. 如果类型不同,就[不相等]
  2. 如果两个都是数值,并且是同一个值,那么[相等];(!例外)的是,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
  3. 如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
  4. 如果两个值都是true,或者都是false,那么[相等]。
  5. 如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
  6. 如果两个值都是null,或者都是undefined,那么[相等]。

== 判断规则:

  1. 如果两个值类型相同,进行 === 比较。
  2. 如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
  • 如果一个是null、一个是undefined,那么[相等]。
  • 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
  • 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
  • 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。非js核心的对象,令说(比较麻烦,我也不大懂)
  • 任何其他组合,都[不相等]。

特别需要注意的是true、false的转换,例如:

alert(true == 1);  //ture
alert(true == 2); //false, true会转换成number,也就是1,当然 1 不等于 2
//可以使用 !! 来把一个数据类型转换为boolean型 
alert(true == !!2) //true,!2 === false !(!=2) = !false = true

另外在js中,如果把一个变量用在逻辑运算中,那么变量在无初始值或者其值为 0、-0、null、”"、false、undefined 或者 NaN时,它的值为 false。否则,其值为 true。

js arguments.callee一些用途

2012年4月16日 没有评论

arguments.callee表示引用当前正在执行的函数,或者说是调用arguments.callee的函数对象的引用,它给匿名函数提供了一种自我引用的方式。通过如下例子,可以更好的理解概念。

var func = function() {
    alert(func === arguments.callee);
}

func();

执行上述代码,可以看到alter出来的结果是true,注意,此处用的是“===”,就是说func与arguments.callee对象类型和值都相等。

上面讲了arguments.callee的定义,那么它用在什么场合呢?一般来说,它会和匿名函数一起结合来用。
例如js脚本当前等待页面某种条件是否满足,如果满足进行相应初始化处理,但不是一直等下去,超过一定时间就放弃等待

var flag = false, start = (new Date()).getTime();

//普通实现 1
function fun1() {
    //flag状态会在其他地方修改,当满足条件后执行相应逻辑
    if (flag) {
        // do something
        return;
    }
    
    //超过等待时间,放弃
    if ((new Date()).getTime() - start > 3000) {
        return;
    }
    
    //等待一秒后重试
    setTimeout(fun1, 1000);
}

fun1();

//普通实现 2
function fun2() {
    if (flag) {
        // do something
        clearInterval(handler);
        return;
    }
    
    if ((new Date()).getTime() - start > 3000) {
        clearInterval(handler);
        return;
    }
}

var handler = setInterval(func2, 1000);

//匿名函数实现
(function(){
    if (flag) {
        // do something
        return;
    }
    
    if ((new Date()).getTime() - start > 3000) {
        return;
    }
    
    setTimeout(arguments.callee, 1000);
})();

比如执行初始化操作,使用匿名函数的好处是确保只被执行一次,而前面两种实现,由于定义了函数,就有可能在别处被误调用,从而执行多次初始化。

再看一递归调用例子:求一个数的阶乘

//普通实现
function fun2(n) {
    if (n > 1) {
        return n * fun2(n -1);
    }
    
    return 1;
}

var r1 = fun2(3);

//使用匿名函数
var  r2 = (function(n) {
    if (n > 1) {
        return n * arguments.callee(n -1);
    }
    
    return 1;    
})(3);
分类: web前端 标签:

freemarker的eclipse插件

2012年4月16日 1 条评论

freemarker模板文件我一直使用jboss tools下提供的FreeMarker IDE,没有用过其他插件,也无法对比,个人觉得jboss提供的这个很好用。以前一直都是使用在线安装的,今天在最新版的eclipse(3.7)使用以前的安装地址,结果告诉我不可用,原来地址变化了,而且现在分版本了。

插件地址:http://download.jboss.org/jbosstools/updates/development/,在上面根据自己的版本选择一个正确地址,例如eclipse 3.7就用:http://download.jboss.org/jbosstools/updates/development/indigo/。在线安装的方法是:Help –> Install New Software 点击and,再出来的对话框中的Location中输入:http://download.jboss.org/jbosstools/updates/development/indigo/,name随便取一个即可。然后会列出来所有可用的插件,如果只需要安装FreeMarker IDE,可用在  JBoss Application Development 下找到并选中它,然后根据向导即可安装成功。

分类: Java 标签:

document.domain用途

2012年4月15日 2 条评论

在上一篇文章:iframe父子页面相互调用js方法中通过例子介绍了iframe与其父页面进行js的通信,但是这里有一个非常重要的限制,由于浏览器基于安全考虑,是不允许js在不同域名间进行通信,所以父子页面必须属于同一个域,即使是相同主域下的不同二级域也是不行的。

对于父子页面完全属于两个不同的域名,那么它们之间永远无法直接进行通信;如果父子页面是属于同一个主域下的不同二级域,则可以使用强制设置document.domain的方式来达到让其互相通信。document.domain默认值是window.location.host,可以js中设置为window.location.host的上一级域,但是不能为根域,例如:可以在页面www.netingcn.com设置document.domain为netingcn.com,但是不能设置为other.netingcn.com或com。

document.domain在一定程度上解决了不同二级域名页面的跨域问题。需要注意的是,如果父页面包含多个iframe且设置了document.domain,那么要与其进行通信的iframe也必须设置document.domain。另外在chrome 18中,父子页面属于相同域名,当设置document.domain后,它们之间变的无法通信了,其他浏览器正常。

分类: web前端 标签:

iframe父子页面相互调用js方法

2012年4月15日 没有评论

当父页面和子页面都属于同一个域下,那么它们之间js方法是可以相互调用的。在调用方法前指定function所属对象即可,父页面获取iframe所属对象方法为:iframe的name.window,iframe页面获取父页面的对象为parent的。具体例子如下:

父页面:parent.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>parent</title>
<script>
	function parentFunction() {
		alert('function in parent');
	}

	function callChild() {
		child.window.childFunction();
		/*
			child 为iframe的name属性值,
			不能为id,因为在FireFox下id不能获取iframe对象
		*/
	}
</script>
</head>
<body>
<input type="button" name="call child"  value="call child" onclick="callChild()"/>
<br/><br/>
<iframe name="child" src="./child.html" ></iframe>
</body>
</html>

子页面:child.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>child</title>
<script>
	function childFunction() {
		alert('function in child');
	}

	function callParent() {
		parent.parentFunction();
	}
</script>
</head>
<body>
<input type="button" name="call parent" value="call parent" onclick="callParent()"/>
</body>
</html>

firefox httpfox 插件替代IE httpwatch

2012年4月13日 没有评论

httpwacth一款强大的网页数据分析工具,window下集成在IE的工具栏中,包括网页摘要.Cookies管理.缓存管理.消息头发送/接受.字符查询.POST 数据和目录管理等功能,似乎现在的版本也能集成在window下的firefox里。这些功能在firefox里的firebug插件也同样实现了。httpwatch还有一个强大的过滤功能,firebug似乎没有,有了这个功能,可以在茫茫多的请求中找到自己关心的请求,例如加载某个网页可能会请求10几个域下的资源,而我们可能只关心某个域下,这个只需要通过域名过滤即可。反观firebug的搜索就做的太差了。

有一个小小遗憾,httpwatch只有window版本,mac下没有,官方网站有明确的说明,还推荐使用虚拟机的方式来使用它。算好firefox下有一个插件httpfox可以替代httpwatch,其功能虽说没有httpwatch那么强大,但是也够用了,好处是window,mac下都只有装了firefox就都能用。

httpfox的官方地址是:https://addons.mozilla.org/zh-cn/firefox/addon/httpfox/,安装很容易,装好后它位于 工具 –> Web 开发者 –> HttpFox。

nginx中使用perl模块

2012年4月12日 1 条评论

如果对于一个绝大部分内容是静态的网站,只有极少数的地方需要动态显示,碰巧你又了解一点perl知识,那么nginx + perl的结合就能很好解决问题。要想nginx支持perl脚本,在编译nginx时候需要如下参数:

./configure --with-http_perl_module

如果make时候出现如下类似错误:
Can’t locate ExtUtils/Embed.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/i386-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi /usr/local/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl /usr/local/lib/perl5/site_perl .)

你的机器上可能需要安装perl-devel perl-ExtUtils-Embed,对于centos系统,直接使用yum搞定,例如:

yum -y install perl-devel perl-ExtUtils-Embed

nginx中使用perl有两种方法,一种是直接在配置文件写,还有一种是把perl脚本写在外部文件中,下面主要介绍一下第二种用法。

假设nginx的根目录为/usr/local/nginx,perl脚本存放的目录为nginx的根目录下的perl/lib下,脚本名字为test.pm,nginx配置为:


#位于http配置中
	perl_modules  perl/lib;
	perl_require  test.pm;
	
#位于server配置中	
		location /user/ {
			perl pkg_name::process;
		}

上述配置是把所有来自http://servername/user/下的请求交由test.pm脚本中定义的process方法来处理。

test.pm脚本的内容如下:

package pkg_name;

use Time::Local;
use nginx;

sub process {
    my $r = shift;
	
    $r->send_http_header('text/html; charset=utf-8');
    my @arr = split('/', $r->uri);
    my $username = @arr[2];
   
    if (!$username || ($username eq "")) {
		$username = "Anonymous";
    }
    
    $r->print('Hello, You name is : ' . $username . ''); 
	$r->rflush();
	return;
}

1;
__END__

当你访问http://servername/user/netingcn,你应该可以在网页上看到:

Hello, You name is : netingcn

另外:当使用 use nginx 时,会有如下的对象可以调用,可以看到上面 shift 一个对象到 $r 上,然后就可以用 $r 调用那些对象了:

$r->args – 请求的参数 .
$r->discard_request_body – 这个参数是让 Nginx 放弃 request 的 body 的内容.
$r->filename – 返回合适的请求文件的名字
$r->has_request_body(function) – 如果没有请求主体,返回0,但是如果请求主体存在,那么建立传递的函数并返回1,在程序的最后,nginx将调用指定的处理器.
$r->header_in(header) – 查找请求头的信息
$r->header_only – 如果我们只要返回一个响应的头
$r->header_out(header, value) – 设置响应的头
$r->internal_redirect(uri) – 使内部重定向到指定的URI,重定向仅在完成perl脚本后发生.可以使用 header_out(Location….的方法来让浏览器自己重定向
$r->print(args, …) – 发送数据给客户端
$r->request_body – 得到客户端提交过来的内容 (body 的参数,可能需要修改 nginx 的 client_body_buffer_size. )
$r->request_body_file —给客户的 body 存成文件,并返回文件名
$r->request_method — 得到请求 HTTP method.
$r->remote_addr – 得到客户端的 IP 地址.
$r->rflush – 立即传送数据给客户端
$r->sendfile(file [, displacement [, length ] ) – 传送给客户端指定文件的内容,可选的参数表明只传送数据的偏移量与长度,精确的传递仅在perl脚本执行完毕后生效.这可是所谓的高级功能啊
$r->send_http_header(type) – 添加一个回应的 http 头的信息
$r->sleep(milliseconds, handler) – 设置为请求在指定的时间使用指定的处理方法和停止处理,在此期间nginx将继续处理其他的请求,超过指定的时间后,nginx将运行安装的处理方法,注意你需要为处理方法通过一个reference,在处理器间转发数据你可以使用$r->variable().
$r->status(code) – 设置 http 的响应码
$r->unescape(text) – 使用 http 方法加密内容如 %XX
$r->uri – 得到请求的 URL.
$r->variable(name[, value]) – 设置变量的值

mac os 下的open命令

2012年4月11日 没有评论

windows下运行explorer就能打开资源管理器,在mac os下能不能在命令行中通过命令来打开finder呢?答案是肯定,该命令就是open,通过man open,可以看到它不仅能打开finder,还可以打开文件、url等。

在命令行下,如果有使用tab习惯,打开一个很深的文件夹肯定比在先打开finder在一级一级点下去要快,另外对于有隐藏文件夹,finder中默认是不显示的,但是在命令行可以轻松解决。例如路径/Users/yangyz/.m2/repository/,直接使用finder似乎进不去的,使用如下命令:

open /Users/yangyz/.m2/repository/

就即可进入该目录。同样对于隐藏的文件,也可以使用open来打开。

mac 下使用eclipse的easyexplore 插件

2012年4月11日 1 条评论

使用easyexplore 插件能快速把你指定的文件或文件夹在资源管理中打开,该插件默认是在针对window用户的,不过通过简单的设置,也能很好的用在ubuntu和mac下。

关于如果安装插件这里就不做介绍,安装好插件,在偏好设置中找到“easy explore”项,右边的配置默认是“explorer.exe {0}”,mac下把explorer.exe替换成open,ubuntu下替换成nautilus即可。

修改好配置后,在eclipse项目中任何一个文件或文件夹下点击右键,可以看到“easy explore”,点击后mac就会在finder中打开当前文件夹。

分类: Linux 标签:

php 暂停执行多少毫秒

2012年4月11日 没有评论

在php中暂停代码执行一定时间,有两个函数可以实现,一个是sleep,另一个是usleep,它们参数都是一个整数值。sleep是暂停多少秒,usleep是暂停多少微秒。注意:usleep单位是微秒,1秒 = 1000毫秒 ,1毫秒 = 1000微秒,即1微秒等于百万分之一秒。

如果程序中要使用要暂停多少毫秒,只能使用usleep,务必注意参数的单位,假设暂停 50毫秒,应该使用usleep(50000),而不是usleep(50)。

另外,我的理解,这个暂停的时候不可能是百分百的准确,跟系统的调度,cpu时钟周期等等有一定关系。

分类: PHP 标签: ,

无觅相关文章插件,快速提升流量