PHP的数据类型

PHP数据类型

php的数据类型包括:

String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)。

  • PHP 字符串
  • 一个字符串是一串字符的序列,就像 “Hello world!”。

你可以将任何文本放在单引号和双引号中:

1
2
3
4
5
6
7
<?php 
$x = "Hello world!";
echo $x;
echo "<br>";
$x = 'Hello world!';
echo $x;
?>
  • PHP 整型

整数是一个没有小数的数字。

  • 整数规则:

整数必须至少有一个数字 (0-9)
整数不能包含逗号或空格
整数是没有小数点的
整数可以是正数或负数
整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。

在以下实例中我们将测试不同的数字。 PHP var_dump() 函数返回变量的数据类型和值:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
$x = 5985;
var_dump($x);
echo "<br>";
$x = -345; // negative number
var_dump($x);
echo "<br>";
$x = 0x8C; // hexadecimal number
var_dump($x);
echo "<br>";
$x = 047; // octal number
var_dump($x);
?>

  • PHP 浮点型

浮点数是带小数部分的数字,或是指数形式。

在以下实例中我们将测试不同的数字。 PHP var_dump() 函数返回变量的数据类型和值:

1
2
3
4
5
6
7
8
9
10
<?php 
$x = 10.365;
var_dump($x);
echo "<br>";
$x = 2.4e3;
var_dump($x);
echo "<br>";
$x = 8E-5;
var_dump($x);
?>

  • PHP 布尔型

布尔型可以是 TRUE 或 FALSE。

$x=true;
$y=false;

布尔型通常用于条件判断。在接下来的章节中你会学到更多关于条件控制的教程。

  • PHP 数组

数组可以在一个变量中存储多个值。
在以下实例中创建了一个数组, 然后使用 PHP var_dump() 函数返回数组的数据类型和值:

1
2
3
4
<?php 
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>
  • PHP 对象

对象数据类型也可以用于存储数据。

在 PHP 中,对象必须声明。

首先,你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。
然后我们在类中定义数据类型,然后在实例化的类中使用数据类型:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Car
{
var $color;
function Car($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
?>

以上实例中PHP关键字this就是指向当前对象实例的指针,不指向任何其他对象或类。

  • PHP NULL 值

NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。

NULL 值指明一个变量是否为空值。 同样可用于数据空值和NULL值的区别。
可以通过设置变量值为 NULL 来清空变量数据:

1
2
3
4
5
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>

正则表达式的作用:
1、用户信息的验证,比如用户名是不是对,邮箱是不是合法,密码是不是包含特殊字符
2、关键字的过滤,比如恶意信息,脚本,网站的html标签
3、敏感词的替换,敏感词汇库,替换成XXX或*
凡是涉及查找、替换,满足某个条件、需要某个信息等等,都用到正则表达式

CSS3打造带阴影的旋转3D图像

CSS3打造带阴影的旋转3D图像

CSS3可以实现很多创新好玩的交互效果,正如今天将和大家介绍的3D旋转图像,效果很漂亮,这个旋转图像的特别之处就是支持阴影旋转和兼容响应式网页设计,使得整体场景非常有感觉。

代码的实现也很简洁,下面来看看这个介绍和CSS代码教程,完全不需要JavaScript!纯CSS3打造。

为了查看最佳效果,请使用Firefox浏览器浏览。

代码教程

HTML代码准备

1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="photo-container">
<div class="rotate-box">
<img src="winwall.jpg"/>
<div class="text">
<h2>这是一个标题</h2>
<p>这是一段图片相关的简介内容。。</p>
</div>
</div>
</div>
```
CSS代码

用Perspective属性给图像设置透视视图,使用浮动是为了制作成一个相册列表。设置宽度使用了百分比,为了兼容响应式设计而制作,大家在浏览DEMO的时候可以缩小浏览器看看效果。

.photo-container {
perspective: 1200px; / 透视视图 /
width:45%;
float:left;
}
.rotate-box {
position:relative;
transform-style: preserve-3d; / 3D 转换 /
transition:1s ease; / 转换效果持续 1秒 /
margin:10%;
}
.rotate-box img {width:100%;height:auto;}

1
背面文本样式,透明背景,并设置默认为反转180度,其次要将图像置于图像的背面,所以这里我们利用z轴来控制,CSS代码如下:

.text {
position:absolute;top:0;
width:100%;height:100%;
transform: rotateY(180deg) translateZ(1px); / 反转180度 并设置z轴让其置于图片背面 /
color:#666;
text-align:center;
opacity:.06;
background:rgba(255,255,255,.9);
transition: 1s opacity;
}

1
使用Hover来触发动画

.photo-container:hover .rotate-box{
transform: rotateY(180deg);
}
.photo-container:hover .text{opacity:1}

1
通过伪元素(:after)给图像添加一个透视阴影,使整体更有3D立体感觉。

.rotate-box:after {
content:’ ‘;
display:block;
width:100%;
height:7vw; / vw是移动设计备窗体单位/
transform:rotateX(90deg);
background-image: radial-gradient(ellipse closest-side, rgba(0, 0, 0, 0.05) 0%, rgba(0, 0, 0, 0) 100%); / radial-gradient 是径向渐变 /
}
```
代码就这么多,如果有不理解或是有更好的建议欢迎在下方评论处留言。也希望借助这个例子能触发你们的创意灵感,CSS3日后必会成为主流,我们应该多点学习和使用这些新技术。

CSS动画和javascript动画

根据Google Developer,Chromium项目里,渲染线程分为main thread和compositor thread。

如果CSS动画只是改变transforms和opacity,这时整个CSS动画得以在compositor thread完成(而JS动画则会在main thread执行,然后触发compositor进行下一步操作)
在JS执行一些昂贵的任务时,main thread繁忙,CSS动画由于使用了compositor thread可以保持流畅,可参考]adobe的博客](http://blogs.adobe.com/webplatform/2014/03/18/css-animations-and-transitions-performance/)。

在主线程中,维护了一棵Layer树(LayerTreeHost),管理了TiledLayer,在compositor thread,维护了同样一颗LayerTreeHostImpl,管理了LayerImpl,这两棵树的内容是拷贝关系。因此可以彼此不干扰,当Javascript在main thread操作LayerTreeHost的同时,compositor thread可以用LayerTreeHostImpl做渲染。当Javascript繁忙导致主线程卡住时,合成到屏幕的过程也是流畅的。

为了实现防假死,鼠标键盘消息会被首先分发到compositor thread,然后再到main thread。这样,当main thread繁忙时,compositor thread还是能够响应一部分消息,例如,鼠标滚动时,加入main thread繁忙,compositor thread也会处理滚动消息,滚动已经被提交的页面部分(未被提交的部分将被刷白)。

CSS动画比JS流畅的前提:

在Chromium基础上的浏览器中
JS在执行一些昂贵的任务
同时CSS动画不触发layout或paint
在CSS动画或JS动画触发了paint或layout时,需要main thread进行Layer树的重计算,这时CSS动画或JS动画都会阻塞后续操作。
参考CSS Triggers,只有如下属性的修改才符合“仅触发Composite,不触发layout或paint”:

backface-visibility
opacity
perspective
perspective-origin
transfrom
所以只有用上了3D加速或修改opacity时,才有机会用得上CSS动画的这一优势。

因此,在大部分应用场景下,效率角度更值得关注的还是下列问题。

  • 是否导致layout
    repaint的面积
    是否是有高消耗的属性(css shadow等)
    是否启用硬件加速
    那么Chromium以外的其他浏览器呢?CSSTrick里比较了一次效率。

CSS3的动画的优点:

  • 在性能上会稍微好一些,浏览器会对CSS3的动画做一些优化(比如专门新建一个图层用来跑动画)
    代码相对简单
    但其缺点也很明显:

  • 在动画控制上不够灵活
    兼容性不好
    部分动画功能无法实现(如滚动动画,视差滚动等)
    JavaScript的动画正好弥补了这两个缺点,控制能力很强,可以单帧的控制、变换,同时写得好完全可以兼容IE6,并且功能强大。但想想CSS动画的transform矩阵是C++级的计算,必然要比javascript级的计算要快。另外对库的依赖也是一个很让人头疼的问题。

所以,对于一些复杂控制的动画,使用javascript会比较靠谱。而在实现一些小的交互动效的时候,就多考虑考虑CSS吧

UNICODE与ASCII的区别

UNICODE与ASCII的区别:http://blog.csdn.net/lx697/article/details/5914417

1.ASCII的特点

ASCII 是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00H—FFH)。这对于英文而言,是没有问题的,一般只什么用到前128个(00H–7FH,最高位为0)。而最高位为1 的另128 个字符(80H—FFH)被称为“扩展ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其它符号。

  • 但是对于中文等比较复杂的语言,255个字符显然不够用。于是,各个国家纷纷制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB2312—80”, 它是和ASCII 兼容的一种编码规范, 其实就是利用扩展ASCII没有真正标准化这一点,把一个中文字符用两个扩展ASCII 字符来表示,以区分ASCII 码部分。

  • 但是这个方法有问题,最大的问题就是中文的文字编码和扩展ASCII 码有重叠。而很多软件利用扩展ASCII 码的英文制表符来画表格,这样的软件用到中文系统中,这些表格就会被误认作中文字符,出现乱码。另外,由于各国和各地区都有自己的文字编码规则,它们互相冲突,这给各国和各地区交换信息带来了很大的麻烦。

2.UNICODE的产生

  • 要真正解决这个问题,不能从扩展ASCII 的角度入手,UNICODE作为一个全新的编码系统应运而生,它可以将中文、法文、德文……等等所有的文字统一起来考虑,为每一个文字都分配一个单独的编码。

3.什么是UNICODE

Unicode与ASCII一样也是一种字符编码方法,它占用两个字节(0000H—FFFFH),容纳65536 个字符,这完全可以容纳全世界所有语言文字的编码。在Unicode 里,所有的字符都按一个字符来处理, 它们都有一个唯一的Unicode 码。

4.使用UNICODE的好处

使用Unicode 编码可以使您的工程同时支持多种语言, 使您的工程国际化。即在不同语言的系统下不至于产生乱码。

JSON.stringify 语法实例

JSON.stringify 语法实例讲解

可能有些人对系列化这个词过敏,我的理解很简单。就是说把原来是对象的类型转换成字符串类型(或者更确切的说是json类型的)。就这么简单。打个比方说,你有一个类,那么你可以通过这个方法转换成相应的json类型的

*作用:这个函数的作用主要是为了系列化对象的。

系列化就是说把原来是对象的类型转换成字符串类型(或者更确切的说是json类型的)。打个比方说,你有一个类,那么你可以通过这个方法转换成相应的json类型的。

  • 语法:
    JSON.stringify(value [, replacer] [, space])

value:是必须要的字段。就是你输入的对象,比如数组啊,类啊等等。
replacer:这个是可选的。它又分为2种方式,一种是方法,第二种是数组。

  • 情况一:我们先说数据,通过我们后面的实验可以知道,它是和第一个有关系的。一般来说,我们系列化后的结果是通过键值对来进行表示的。

比如说:
name:”lan”,age:25
这种形式。

所以,如果这种形式的话,如果第二个的值在第一个存在,那么的话就以第二个的值做key,第一个值为value进行表示,如果不存在,sorry,忽略。【是不是有点抽象,我也这么觉得,不过你等一下看实验 就OK了。。呼呼。】

  • 情况二:如果是方法,那很简单,就是说把系列化后的每一个对象(记住 是每一个)传进方法里面进行处理。

space:很好理解,用什么来做分隔符的。

1.如果省略的话,那么显示出来的值 就没有分隔符。直接输出来
2.如果是一个数字的话,那么它就定义缩进几个字符,当然 如果大于10 ,则最大值为10.
3.如果是一些转义字符,比如“\t”,表示回车,那么它每行一个回车。
4.如果仅仅是字符串,OK,就在每行输出值的时候把这些字符串附加上去就OK。当然,最大长度也是10个字符。

开始用实例说明;

1.只有一个参数的情况下:

1
2
3
4
5
6
var student = new Object(); 
student.name = "Lanny";
student.age = "25";
student.location = "China";
var json = JSON.stringify(student);
alert(student);

结果:

有些人可能会怀疑JSON.stringify的作用,OK。那假如,我们不要这个函数。代码下面的样子:

代码如下:

1
2
3
4
5
6
7
var student = new Object(); 
student.name = "Lanny";
student.age = "25";
student.location = "China";

// var json = JSON.stringify(student);
alert(student);

 恭喜你 得到的结果是:

###.第二个参数存在,并且第二个参数还是function的时候

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var students = new Array() ; 
students[0] = "Lanny";
students[1] = "dong";
students[2] = "I love you";
var json = JSON.stringify(students,switchUpper);
function switchUpper(key, value) {
return value.toString().toUpperCase();
}
alert(json);

        //var json = JSON.stringify(students, function (key,value) {

        //return value.toString().toUpperCase();

       //});
  • 上面的方法也可以换成下面的,2个都是一样,只是写法有那么一点点的不一样而已。
     得到结果如下:

.第二个参数存在,并且第二个参数不是function,而是数组的时候。

####.1 【误区】如果第一个参数是数组,第二个参数也是数组的话,只显示第一个参数的值。
比如:

代码如下:

1
2
3
4
5
6
7
8
9
var students = new Array() ; 
students[0] = "Lanny";
students[1] = "dong";
students[2] = "I love you";
var stu = new Array();
stu[0] = "1";
stu[1] = "2";
var json = JSON.stringify(students,stu);
alert(json);

 sorry 得到的结果就是:

第二个被忽略了,只是第一个被系列化了。

2 如果第一个是对象(这里说的对象就像在C#里面可以进行new的),第二个是数组的。

那么如果第二个的value在第一个存在,那么的话就以第二个的值做key,第一个值为value进行表示

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
var student = new Object(); 
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;

var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";//这个student对象里不存在。

var json = JSON.stringify(student,stu);
alert(json);

 得到的结果如下:

因为stu[2] = “Hi”;这个Hi 在第一个找不到,所以就不进行显示了。

.第三个参数

.1.如果省略的话,那么显示出来的值 就没有分隔符。直接输出来

比如:

1
2
3
4
5
6
7
8
9
10
11
12
var student = new Object(); 
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;

var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";

var json = JSON.stringify(student,stu);
alert(json);

输出的就是:

2.如果是一个数字的话,那么它就定义缩进几个字符,当然 如果大于10 ,则最大值为10.

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
var student = new Object(); 
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;

var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";

var json = JSON.stringify(student,stu,100);//注意这里的100
alert(json);

结果

空开来了10个字符。

3.如果是一些转义字符,比如“\t”,表示回车,那么它每行一个回车。

也是一样。

4.如果仅仅是字符串,OK,就在每行输出值的时候把这些字符串附加上去就OK。当然,最大长度也是10个字符。

如果是var json = JSON.stringify(student,stu,“HaiKou”);//

文章出处

另一处 –> http://www.cnblogs.com/damonlan/

JS区分中英文字符 正则和charCodeAt

转载-JS区分中英文字符的两种方法: 正则和charCodeAt()方法。

正则无疑是最强大的判断各种条件的方法, 最近也在研习它, 虽然枯燥, 但仍有乐趣. 用它来判断一个双字节的中文字符也是轻而易举地. 而判断中文字符, 简单且执行效率高.

1
2
3
4
5
6
7
8

[javascript] view plain copy
regExpForm.onblur=function(){
entryVal=this.value;
entryLen=entryVal.length;
cnChar=entryVal.match(/[^\x00-\x80]/g);//利用match方法检索出中文字符并返回一个存放中文的数组
entryLen =cnChar.length;//算出实际的字符长度
}

第二种方法是通过charCodeAt()方法判断Unicode码值, 若大于255即为中文字符, 它的执行效率没有正则高, 也没有正则简单.

1
2
3
4
5
6
7
8
9
10
[javascript] view plain copy
entryVal=this.value;
entryLen=entryVal.length;
for(var i=0;i<entryVal.length;i ){
if(entryVal.charCodeAt(i)>255){//遍历判断字符串中每个字符的Unicode码,大于255则为中文
cnArr.push(entryVal[i]);//讲符合条件的值插入到中文字符数组中
//注意一个小bug,push是向数组的末尾添加一个或多个元素并返回新的长度,所以未刷新的情况下反复blur会累加字符值
}
}
entryLen =cnArr.length;

将json字符串转化为数组

JS解析json数据(如何将json字符串转化为数组)

装载自http://hi.baidu.com/jiangzhong8715/item/b60dad33937e35109cc65e01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>

<SCRIPT LANGUAGE="JavaScript">


var t="{'firstName': 'cyra', 'lastName': 'richardson', 'address': { 'streetAddress': '1 Microsoft way', 'city': 'Redmond', 'state': 'WA', 'postalCode': 98052 },'phoneNumbers': [ '425-777-7777','206-777-7777' ] }";
var jsonobj=eval('('+t+')');
alert(jsonobj.firstName);
alert(jsonobj.lastName);


var t2="[{name:'zhangsan',age:'24'},{name:'lisi',age:'30'},{name:'wangwu',age:'16'},{name:'tianqi',age:'7'}] ";
var myobj=eval(t2);
for(var i=0;i<myobj.length;i++){
alert(myobj[i].name);
alert(myobj[i].age);
}

var t3="[['<a href=# onclick=openLink(14113295100,社旗县国税局桥头税务所,14113295100,d6d223892dc94f5bb501d4408a68333d,swjg_dm);>14113295100</a>','社旗县国税局桥头税务所','社旗县城郊乡长江路西段']]";
//通过eval() 函数可以将JSON字符串转化为对象
var obj = eval(t3);
for(var i=0;i<obj.length;i++){
for(var j=0;j<obj[i].length;j++){
alert(obj[i][j]);
}

}

/*
//stringifier 函数的作用跟 parse 相反, 用来将一个js对象转换为 JSON 文本。
var jsonText = JSON.stringify(obj);
alert(jsonText);

//如果基于安全的考虑的话,最好是使用一个 JSON 解析器。 一个 JSON 解析器将只接受 JSON 文本。所以是更安全的。
var myObject = JSON.parse(myJSONtext, filter);
//可选的 filter 参数将遍历每一个value key 值对, 并进行相关的处理。如:
//如
myData = JSON.parse(text, function (key, value) {

return key.indexOf('date') >= 0 ? new Date(value) : value; });

//stringifier 函数的作用跟 parse 相反, 用来将一个js对象转换为 JSON 文本。
var myJSONText = JSON.stringifier(myObject);
*/
</SCRIPT>
</HEAD>

<BODY>

</BODY>
</HTML>

setInterval函数

js最小时间粒度,做小时间间隔

setInterval:作用:间隔指定的毫秒数不停地执行指定的代码。

如果指定的代码执行时间超过间隔数,则会将执行的代码加入任务序列里面,必须等代码执行完后立即执行下一次。

延时为0是把代码放到当前环境的最后立刻去执行

例如在一个输入框中:有一个input id=ipt,type=text

js

1
2
3
4
5
6
7
var ipt=document.getElementById('ipt');
ipt.addEventListener('keydonw',function(){
var thi=this
steTimeOut(function(){
thi.value = thi.value.UpperCase();
},0)
})

当文字输入在文本框内后立马执行变成大写字母,而如果不加stetimeout 0,怎字母咋文本框中会等到下一次down按键才会执行转换成大写字母

JavaScript初学者应注意的七个细节

JavaScript初学者应注意的七个细节
转自梦想天空的博客

  每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的。本文利列举了JavaScript初学者应该注意的七个细节,与大家分享。

(1)简化代码

JavaScript定义对象和数组非常简单,我们想要创建一个对象,一般是这样写的:

>
var car = new Object();
car.colour = ‘red’;
car.wheels = 4;
car.hubcaps = ‘spinning’;
car.age = 4;
下面的写法可以达到同样的效果:

>
var car = {
colour:’red’,
wheels:4,
  hubcaps:’spinning’,
  age:4
}

后面的写法要短得多,而且你不需要重复写对象名称。

另外对于数组同样有简洁的写法,过去我们声明数组是这样写的:

>
var moviesThatNeedBetterWriters = new Array(
‘Transformers’,’Transformers2’,’Avatar’,’Indiana Jones 4’
);

更简洁的写法是:

>
var moviesThatNeedBetterWriters = [
‘Transformers’,’Transformers2’,’Avatar’,’Indiana Jones 4’
];

对于数组,还有关联数组这样一个特别的东西。 你会发现很多代码是这样定义对象的:

>
var car = new Array();
car[‘colour’] = ‘red’;
car[‘wheels’] = 4;
car[‘hubcaps’] = ‘spinning’;
car[‘age’] = 4;

这太疯狂了,不要觉得困惑,“关联数组”只是对象的一个别名而已。

另外一个简化代码的方法是使用三元运算符,举个例子:

>
var direction;
if(x < 200){
direction = 1;
} else {
direction = -1;
}

我们可以使用如下的代码替换这种写法:

>
var direction = x < 200 ? 1 : -1;

(2)使用JSON作为数据格式

伟大的Douglas Crockford发明了JSON数据格式来存储数据,你可以使用原生的javascript方法来存储复杂的数据而不需要进行任何额外的转换,例如:

>
var band = {
“name”:”The Red Hot Chili Peppers”,
“members”:[
{
“name”:”Anthony Kiedis”,
“role”:”lead vocals”
},
{
“name”:”Michael ‘Flea’ Balzary”,
“role”:”bass guitar, trumpet, backing vocals”
},
{
“name”:”Chad Smith”,
“role”:”drums,percussion”
},
{
“name”:”John Frusciante”,
“role”:”Lead Guitar”
}
],
“year”:”2009”
}
你可以使用在JavaScript中直接使用JSON,甚至作为API返回的一种格式,在许多的API中被应用,例如:

>

这里调用delicious 的Web服务获取最新书签,以JSON格式返回,然后将它们显示成无序列表的形式。

从本质上讲,JSON是用于描述复杂的数据最轻量级的方式,而且直接它运行在浏览器中。 你甚至可以在PHP中调用 json_decode()函数来使用它。

(3)尽量使用JavaScript原生函数

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

>
var numbers = [3,342,23,22,124];
var max = 0;
for(var i=0;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来检测浏览器支持哪个属性:

>
var scrollTop= Math.max(
doc.documentElement.scrollTop,
doc.body.scrollTop
);

如果你想给一个元素增加class样式,可能原始的写法是这样的:

>
function addclass(elm,newclass){
var c = elm.className;
elm.className = (c === ‘’) ? newclass : c+’ ‘+newclass;

而更优雅的写法是:

>
function addclass(elm,newclass){
var classes = elm.className.split(‘ ‘);
classes.push(newclass);
elm.className = classes.join(‘ ‘);
}

(4)事件委托

事件是JavaScript非常重要的一部分。我们想给一个列表中的链接绑定点击事件,一般的做法是写一个循环,给每个链接对象绑定事件,HTML代码如下:

>

Great Web resources

脚本如下:

>
// 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();
}
};
})();

(5)匿名函数

关于JavaScript的最头疼的事情之一是,它的变量没有特定的作用范围。 一般情况下,任何变量,函数,数组或对象都是全局性,这意味着在同一页上的其他脚本可以访问并覆盖它们。解决方法是把变量封装在一个匿名函数中。 例如,下面的定义将产生三个全局变量和和两个全局函数:

>
var name = ‘Chris’;
var age = ‘34’;
var status = ‘single’;
function createMember(){
// […]
}
function getMemberDetails(){
// […]
}

封装后如下:

>
var myApplication = function(){
var name = ‘Chris’;
var age = ‘34’;
var status = ‘single’;
return{
createMember:function(){
// […]
},
getMemberDetails:function(){
// […]
}
}
}();
// myApplication.createMember() and
// myApplication.getMemberDetails() now works.

这被称为单体模式,是JavaScript设计模式的一种,这种模式在YUI中用得非常多,改进的写法是:

>
var myApplication = function(){
var name = ‘Chris’;
var age = ‘34’;
var status = ‘single’;
function createMember(){
// […]
}
function getMemberDetails(){
// […]
}
return{
create:createMember,
get:getMemberDetails
}
}();
//myApplication.get() and myApplication.create() now work.

(6)代码可配置

你写的代码如果想让别人更容易进行使用或者修改,则需要可配置,解决方案是在你写的脚本中增加一个配置对象。要点如下:

1、在你的脚本中新增一个叫configuration的对象。

2、在配置对象中存放所有其它人可能想要去改变的东西,例如CSS的ID、class名称、语言等等。

3、返回这个对象,作为公共属性以便其它人可以进行重写。

(7)代码兼容性

  兼容性是初学者容易忽略的部分,通常学习Javascript的时候都是在某个固定的浏览器中进行测试,而这个浏览器很有可能就是IE,这是非常致命的,因为目前几大主流浏览器中偏偏IE对标准的支持是最差的。最终用户看到的结果也许就是,你写的代码在某个浏览器无法正确运行。你应该把你的代码在主流的浏览器中都测试一下,这也许很费时间,但是应该这样做。

(编译来源:梦想天空 原文来自:Seven JavaScript Things I Wish I Knew Much Earlier In My Career)

,