月份: 2015-06

一张图,看懂七亿中国网民生存现状!

2015年,中国互联网用户已达6.89亿,其中手机网民5.57亿,人均周上网时长升至26.1小时!就像王思聪为娱乐圈操碎了心,中国网民为全世界操碎了心,这庞大的族群都在做啥?一张图看懂!
   
   

你可能不知道的10个JavaScript小技巧

尽管我使用Javascript来做开发有很多年了,但它常有一些让我很惊讶的小特性。对于我来说,Javascript是需要持续不断的学习的。在这篇文章中,我将列出10个Javascript使用小技巧,主要面向Javascript新手和中级开发者。希望每个读者都能至少从中学到一个有用的技巧。
1.变量转换
看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法。始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做法反而效率更高。

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的形式。
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

3.玩转数字
除了上一节介绍的之外,这里有更多的处理数字的技巧

0xFF; // Hex declaration, returns 255

020; // Octal declaration, returns 16

1e3; // Exponential, same as 1 * Math.pow(10,3), returns 1000

(1000).toExponential(); // Opposite with previous, returns 1e3

(3.1415).toFixed(3); // Rounding the number, returns “3.142”

4.Javascript版本检测
你知道你的浏览器支持哪一个版本的Javascript吗?如果不知道的话,去维基百科查一下Javascript版本表吧。出于某种原因,Javascript 1.7版本的某些特性是没有得到广泛的支持。不过大部分浏览器都支持了1.8版和1.8.1版的特性。(注:所有的IE浏览器(IE8或者更老的版本)只支持1.5版的Javascript)这里有一个脚本,既能通过检测特征来检测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”));

5.使用window.name进行简单会话处理
这个是我真的喜欢的东西。您可以为指定一个字符串作为window.name属性的值,直到您关闭该标签或窗口。虽然我没有提供任何脚本,但我强烈建议您如充分利用这个方法。举例来说,在建设一个网站或应用程序的时候,在调试和测试模式之间切换是非常有用的。
6.判断属性是否存在
这个问题包含两个方面,既有检查属性时候存在,还要获取属性的类型。但我们总是忽略了这些小事情:

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

}

7.给函数传递参数
当函数既有必选又有可选参数的时候,我们可能是这样做的:
function doSomething(arg0, arg1, arg2, arg3, arg4) {

}

doSomething(”, ‘foo’, 5, [], false);

而传递一个对象总是比传递一堆的参数更方便:

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

});

这只是一个把对象作为参数传递的一个很简单的例子,例如,我们还可以声明一个对象,变量名作为Key,默认值作为Value。
8.使用document.createDocumentFragment()
您可能需要动态地追加多个元素到文档中。然而,直接将它们插入到文档中会导致这个文档每次都需要重新布局一个,相反的,你应该使用文档碎片,建成后只追加一次:

function createList() {

var aLI = [“first item”, “second item”, “third item”,

“fourth item”, “fith item”];

// Creates the fragment

var oFrag = document.createDocumentFragment();

while (aLI.length) {

var oLI = document.createElement(“li”);

// Removes the first item from array and appends it

// as a text node to LI element

oLI.appendChild(document.createTextNode(aLI.shift()));

oFrag.appendChild(oLI);

}

document.getElementById(‘myUL’).appendChild(oFrag);

}

9.为replace()方法传递一个函数
有的时候你想替换字符串的某个部分为其它的值,最好的方法就是给String.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]”

10.循环中标签的使用
有的时候,循环中又嵌套了循环,你可能想在循环中退出,则可以用标签:

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;

}

}

}

联想t430u怎么设置u盘启动

尊敬的联想用户您好!
根据您的情况,您直接将第一移动项改为U盘或者光驱启动即可。
之后您需更改您的硬盘模式您可以如下操作:
1、 若您的预装系统为win8系统您需如下操作:按F1或Fn+F1进入BIOS—> security—>security boot把“security boot”项后面的enabled改为disabled,进入Startup—UEFI/Legacy Boot选项,将UEFI/Legacy Boot选项选择成Both,UEFI/Legacy Boot Priority选择成UEFI First,按F9选择Yes,,然后按F10(FN+F10保存退出 )
2、然后更改硬盘模式 :进入“Config” --> “Serial ATA(SAT A)” --> “Controller mode option” ,将原先的 “AHCI” 改成 “Compatibility”或IDE ,然后按[F10]。 需要注意的是:xp系统只能识别一个显卡,集显或者独显就无使用, 声卡的安装也可能有问题, 不建议安装xp系统。
3、若您的预装系统为win7则无需执行1操作,直接进入BIOS更改硬盘模式即可。
4、按下电源开机,出现联想LOGO时,连续点击键盘“F12”键
5、出现“BOOT MENU”菜单,用键盘,选择USB启动即可。
为您提供如何制作U盘系统盘以及U盘安装操作系统的方法: http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_13118943866256237.html 更多问题您可以咨询idea论坛:http://lenovobbs.lenovo.com.cn/forum.php?intcmp=FM_LBBS_baidureply Think论坛:http://thinkbbs.lenovo.com.cn/forum.php?intcmp=FM_LBBS_baidureply 联想乐社区:http://bbs.lenovomobile.com/forum.php?intcmp=FM_LBBS_baidureply

什么才算是真正的编程能力?

问题:什么才算是真正的编程能力?
还在读书,也在实验室帮忙做了些东西,自己也搭过几个网站。在周围人看来似乎好像我很厉害,做了那么多东西,但是我发现这些东西虽然是我做的,但是实际上我手把手自己写的代码却并没有多少,很多都是用开源的东西,我写的代码无非是把别人的东西整合下,类似于胶水一样的工作。
我之前所认为的编程是全手动一行一行敲代码,但是现在我发现哪怕是工程上也有很多人是复制黏贴来解决问题的,并且提倡不要重复造轮子。
但是靠谷歌和复制别人的轮子,虽然我做出了很多东西,可是我并不觉得自己能力上有提升,倒是利用搜索引擎的能力的确提升了不少。而学校里另外一波搞ACM的人,他们每天刷题练算法,或许倒是的确提升了点编程能力,但是对工程几乎一窍不通。
所以我现在就很困惑,所谓的编程能力到底是什么,我该如何提升自己的编程能力?
回答者:刘贺,…
非常好的一个问题。这可能是我在知乎见到过的问编程有关的问题中问得最好的一个了。我非常喜欢这个问题。
计算机科学有两类根本问题。一类是理论:算法,数据结构,复杂度,机器学习,模式识别,等等等。一类是系统:操作系统,网络系统,分布式系统,存储系统,游戏引擎,等等等等。
理论走的是深度,是在追问在给定的计算能力约束下如何把一个问题解决得更快更好。而系统走的是广度,是在追问对于一个现实的需求如何在众多的技术中设计出最多快好省的技术组合。
搞ACM的人,只练第一类。像你这样的更偏向于第二类。其实挺难得的,但很可惜的是第二类能力没有简单高效的测量考察方法,不像算法和数据结构有ACM竞赛,所以很多系统的苗子都因为缺少激励和正确引导慢慢就消隐了。
所以比尔盖茨才会说,看到现在学编程的人经常都把编程看作解各种脑筋急转弯的问题,他觉得很遗憾。
做系统,确实不提倡“重复发明轮子”。但注意,是不提倡“重复发明”,不是不提倡“重新制造”。恰恰相反的,我以为,系统的编程能力正体现在“重新制造”的能力。
能把已有的部件接起来,这很好。但当你恰好缺一种关键的胶水的时候,你能写出来吗?当一个已有的部件不完全符合你的需求的时候,你能改进它吗?如果你用的部件中有bug,你能把它修好吗?在网上繁多的类似功能的部件中,谁好谁坏?为什么?差别本质吗?一个开源代码库,你能把它从一个语言翻译到另一个语言吗?从一个平台移植到另一个平台吗?能准确估计自己翻译和移植的过程需要多少时间吗?能准确估计翻译和移植之后性能是会有提升还是会有所下降吗?
系统编程能力体现在把已有的代码拿来并变成更好的代码,体现在把没用的代码拿来并变成有用的代码,体现在把一个做好的轮子拿来能画出来轮子的设计蓝图,并用道理解释出设计蓝图中哪些地方是关键的,哪些地方是次要的,哪些地方是不容触碰的,哪些地方是还可以改进的。
如果你一点不懂理论,还是应该学点的。对于系统性能的设计上,算法和数据结构就像在自己手头的钱一样,它们不是万能的,但不懂是万万不行的。
怎么提高系统编程能力呢?土办法:多造轮子。就像学画画要画鸡蛋一样,不是这世界上没有人会画鸡蛋,但画鸡蛋能驯服手指,感受阴影线条和笔触。所以,自己多写点东西吧。写个编译器?渲染器?操作系统?web服务器?web浏览器?部件都一个个换成自己手写的,然后和已有的现成部件比一比,看看谁的性能好,谁的易用性好?好在哪儿?差在哪儿?为什么?
更聪明一点的办法:多拆轮子。多研究别人的代码是怎么写的。然而这个实践起来经常很难。原因:大部分工业上用的轮子可能设计上的思想和技术是好的,都设计和制造过程都很烂,里面乱成一团,让人乍一看毫无头绪,导致其对新手来说非常难拆。这种状况其实非常糟糕。所以,此办法一般只对比较简单的轮子好使,对于复杂的轮子,请量力而行。
轮子不好拆,其实是一个非常严重的问题。重复发明轮子固然是时间的浪费,但当轮子复杂而又不好拆的时候,尤其是原来造轮子的人已经不在场的时候,重新发明和建造轮子往往会成为无奈之下最好的选择。这是为什么工业界在明知道重复发明/制造轮子非常不好的情况下还在不断重复发明/制造轮子的根本原因。
程序本质是逻辑演绎的形式化表达,记载的是人类对这个世界的数字化理解。不能拆的轮子就像那一篇篇丢了曲谱的宋词一样,能读,却不能唱。
鄙人不才,正在自己研究怎么设计建造一种既好用又好拆的轮子。您没那么幸运,恐怕是等不到鄙人的技术做出来并发扬光大了。在那之前,多造轮子,多拆好拆的小轮子,应该是提高编程能力最好的办法了。
以上。嗯。
(文章属个人观点,与本人工作雇主无关。)
回答者:mu peng,less is more
懂得取舍。
在有限的时间内,几乎没有系统可以做到完美。要快,要安全,高并发,易扩展,效率高,容易读,高内聚,低耦合…
大到一个网站,小到几个class,工程师都要清楚,要取什么,舍什么,这并不是那么容易的事。我们都有自己的性格,有的求新,有的求稳,有的求快,但具体到一个项目时,知道如何取舍对这个项目最好,很重要。
学校里的作业,没人在意你是不是写在一个大的main()里面,能跑就行。但做项目的时候,太多的东西要考虑,有时候,宁可简单易读,也不用快那么一点点;有时候,要做太多看不到的工作,却丝毫马虎不得;有时候,写了不如不写,留白也是一个学问。
曾经接手个项目,里面几乎所有的class,每个都有interface,各种继承,各种实现,理由是灵活性高,易扩展。真的易扩展吗?
我不知道。没多久,客户的需求就改了,各种拎不清的继承实现都化为乌有,一大半要重写。
问题在哪里?
不是编程不好,而是取舍的不好。在那个阶段,为30%的需求,花200%的努力,追求设计的滴水不漏,却舍弃快速实现,取得反馈的时机,这就是失误。需求总会变,客户看到越早,修改越早,影响越小。
很聪明的人,也可能做出很难用的系统,不一定是编程不好,可能是不愿,或不屑于取舍。不同的阶段,不同的项目,要取舍的东西也不同。编程只是手段,目的是解决问题,能力高不高,要看问题解决的好不好。不在于使用了什么高端算法,或是复杂的框架。
懂得如何取舍并不容易,需要对问题的深刻理解,对技术的胸有成竹,和身后无数个踩过的坑。但重要的是有取舍的意识,主动思考取舍什么,这样学的才会快。
回答者:李遥,A Programmer
既然说的是编程能力,那首先就先把学术相关的能力排除才能说的清楚
接下来是我对编程的定义:所谓编程,就是预先设计好方案来指挥行为可预测的系统来自动(与临时手动相对)达到的想要的结果。从广义上说,企业家对一个公司的运作方式进行设计,然后这个公司自动运行产生利润也是一种编程
那么编程能力体现在两点
1.对可预测系统的理解:理解越深,预测能力越强,自己的智慧才越好发挥。这就是为什么学习软件编程最快的方式之一是“造轮子”
2.如何把自己的目标转化成指挥方案,这其实就是“做应用题”的能力,我们从小学就在练习这个能力。现实世界的应用题可不会告诉你用什么知识点去建模,也不会透露全部必要条件,因此增强这个能力需要深刻理解现实世界的运作方式。在软件行业,这被称作“理解垂直行业的业务逻辑”
顺带说一下,所谓“Hacking”,其实就是在深刻理解一个系统的基础上,用最小的代价改变这个系统来达到自己的目的。“Hacking”之所以看起来出人意料,就是因为理解越深刻,需要的做的改动越少。如果理解不深刻,那就要从头造一个系统了,那就不聪明了
回答者:丁盛豪,网络媒体HeckPsi.com创始人
谢 @花满楼 邀请。
对于编程能力这个问题其实我也想过很久,这个东西确实非常难界定。单纯靠算法水平、编程速度、工程经验都很难说是编程能力。
虽然这个东西的影响因素非常庞大,但从我日常的工作来看,其实我觉得衡量编程水平最靠谱的方法是观察这个程序员 Debug 的能力。
程序从本质上来说就是 输入 -> 处理 -> 输出 的过程,而中间的处理就像是一个巨大的黑盒子。而这个黑盒子的本身就是程序,在大多数情况下你并不能看到这个黑盒子的全貌。从常识上写一个不存在 bug 的程序是一件 几乎 不可能完成的任务。即使是敲个最简单的 Hello World 程序,你也很难保证编译器不给你抽几下风。尤其是当这个程序变得非常庞大时,写程序这件事的本身就是 盲人摸象 的过程。程序员必须要有相当好的 全局观 ,才能保证自己的程序良好运行而不出问题,并能在出了问题之后能够做出迅速的定位和修复。
所以观察一个程序员能否 迅速Debug 的过程就是一个很好的判断依据。我举个例子来说,我几周前给手机刷了机,第二天早上准备去晨跑,发现手机 GPS 不工作。于是我立刻分析了出现问题可能的地方:
GPS 模块硬件 -> GPS 驱动 -> 系统配置 -> GPS 权限 -> 软件兼容性
由于想起刚刷了机,基本可以排除硬件问题。而软件之前同样在其它 Android 5.1 机器上跑过,同时跑了下 Google Maps 也不能定位,排除兼容性问题。原生系统的权限系统非常简单,基本排除是权限。出问题的可能是第三方 ROM 的驱动有问题或者配置文件。观察到 A-GPS 基站辅助定位也不工作,基本排除 GPS 驱动问题。确认是配置文件有问题,检查 /etc/gps.conf 竟是空文件。于是就在手机上用文本编辑器顺手码了一段配置,重启后问题修复。
这就是一次非常流畅准确的对一个未知的 Bug 定位和修复的过程。
由于 Bug 的未知性,可以很好避免一些你在判断时可能遇到的 作弊 情况,我们知道现在很多人为了面试无所不用其极。就算是以前非常经典的面试问题,现在也很不靠谱。现在你问 “如何理解面向对象编程?” 和你对答如流的人可能并不真正理解 OOP,不过背的很熟而已。以前觉得算法是个很好验证水平的切入点,自从 LeetCode 背题流的出现,这招现在也不怎么靠谱。而 Debug 是个无法 提前准备的东西,所以对于编程能力的校验通常很准确。
而且,Debug 的过程中会接触到自己很多不熟悉的知识。由于编程本身就是一个 Engineering,正常的过程就是在 码字 -> 出问题 -> 学习 -> 修改 的过程中循环。如果你对算法不熟悉,那么遇到程序性能问题的时候你硬着头皮也要用学习算法知识来解决掉。所以这是一项非常综合的能力,是程序员 知识、智力、经验 的综合体现。
至于如何提升编程能力?
多写、多错、多学。没有捷径,捷径只不过是作弊。作弊能帮你找到工作,但并不能真正解决问题。
回答者:陈浩骏,call me Reid / 会写Java的猴子
MIT算法导论第一堂课:
每天都编程 x年后一定会变成专家 (忘了x多少 不是重点
轮子多造多模仿 能力自然提升

什么发展都是从量到质的 要相信
现在我也是搞系统编程 除了看source code和造轮

也是可以有空刷刷acm的

而且只有帮助没有坏处喔

系统编程一旦考虑到效能问题 离不开经典的一些算法的 
显然大部分的我们都不会成为高手如温赵轮
但是成为编程好手 进个好公司 钱多赚些 生活舒服些 应该是普遍程序员的共同目标
不要想太多 拼命code就是了
共勉
如此。
回答者:vczh,专业造轮子 https://github.com/vczh-libraries
都不知道宣传不要重复造轮子的人是怀着什么险恶的用心,原话明明是不要重新发明轮子。
这是什么意思呢?就是说你要多看论文多看书,少抄代码。
回答者:达达,服务端程序员
程序员就是把人类的需求语言翻译成计算机语言的人,所以可以通用译事三难:“信、达、雅”。
回答者:Kim Leo
其实,搭网站,写MIS/CMS/ERP这些,就算是一行行的写代码,结果也只能是你的领域知识不断提升,对于“编程能力”的提升没有多少的。就像是你根本无法解释在你写的系统中哪个地方应用了动态规划一样。
所以相对来说你所需要的是一些计算机科学内的领域知识。
还有,假如你写了代码要给别人看和给其他程序员用,应该就开始慢慢考虑接口和设计了。
或者你需要的是一本分析模式?
回答者:JX Consp
看看别人的轮子的形貌(主要是接口,其次是效率)之后自己造一个轮子
其实 STL 源码剖析 和 modern c++ design 不错,唯一问题是选择了 c++ 做教学语言
有兴趣可以学点认知和设计来了解好的接口长得是怎样的
回答者:海涛,软件开发需要低成本、快速响应
第1层:能做成东西(能运行)

第2层:做的东西能长时间或高负荷地运行

第3层:做的东西能长时间在高负荷下运行

第4层:能预先知道什么才是客户/行业需要的功能,并以最符合的代价(金钱、硬件、期限、人力)实现
回答者:DreamPiggy
多看书

多思考
改别人代码

学别人的架构

做自己的软件

写自己的架构
或许如此循环就入坑了吧。

JQuery中$.ajax()方法参数详解

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址。
type: 要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和
      delete也可以使用,但仅部分浏览器支持。
timeout: 要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设
         置。
async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。
       如果需要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其他操作必须等
       待请求完成才可以执行。
cache:要求为Boolean类型的参数,默认为true(当dataType为script时,默认为false)。
       设置为false将不会从浏览器缓存中加载请求信息。
data: 要求为Object或String类型的参数,发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格
      式。get请求中将附加在url后。防止这种自动转换,可以查看processData选项。对象必须为key/value格
      式,例如{foo1:”bar1″,foo2:”bar2″}转换为&foo1=bar1&foo2=bar2。如果是数组,JQuery将自动为不同
      值对应同一个名称。例如{foo:[“bar1″,”bar2”]}转换为&foo=bar1&foo=bar2。
dataType: 要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime
          信息返回responseXML或responseText,并作为回调函数参数传递。
          可用的类型如下:
          xml:返回XML文档,可用JQuery处理。
          html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
          script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求
                  时(不在同一个域下),所有post请求都将转为get请求。
          json:返回JSON数据。
          jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个
                “?”为正确的函数名,以执行回调函数。
          text:返回纯文本字符串。
beforeSend:要求为Function类型的参数,发送请求前可以修改XMLHttpRequest对象的函数,例如添加自定义
            HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参
            数。
            function(XMLHttpRequest){
               this;   //调用本次ajax请求时传递的options参数
            }
complete:要求为Function类型的参数,请求完成后调用的回调函数(请求成功或失败时均调用)。
          参数:XMLHttpRequest对象和一个描述成功请求类型的字符串。
          function(XMLHttpRequest, textStatus){
             this;    //调用本次ajax请求时传递的options参数
          }
success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
         (1)由服务器返回,并根据dataType参数进行处理后的数据。
         (2)描述状态的字符串。
         function(data, textStatus){
            //data可能是xmlDoc、jsonObj、html、text等等
            this;  //调用本次ajax请求时传递的options参数
error:要求为Function类型的参数,请求失败时被调用的函数。该函数有3个参数,即XMLHttpRequest对象、错
       误信息、捕获的错误对象(可选)。
       ajax事件函数如下:
       function(XMLHttpRequest, textStatus, errorThrown){
          //通常情况下textStatus和errorThrown只有其中一个包含信息
          this;   //调用本次ajax请求时传递的options参数
       }
contentType:要求为String类型的参数,当发送信息至服务器时,内容编码类型默认
             为”application/x-www-form-urlencoded”。该默认值适合大多数应用场合。
dataFilter:要求为Function类型的参数,给Ajax返回的原始数据进行预处理的函数。
            提供data和type两个参数。data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的
            dataType参数。函数返回的值将由jQuery进一步处理。
            function(data, type){
                //返回处理后的数据
                return data;
            }
global:要求为Boolean类型的参数,默认为true。表示是否触发全局ajax事件。设置为false将不会触发全局
        ajax事件,ajaxStart或ajaxStop可用于控制各种ajax事件。
ifModified:要求为Boolean类型的参数,默认为false。仅在服务器数据改变时获取新数据。
            服务器数据改变判断的依据是Last-Modified头信息。默认值是false,即忽略头信息。
jsonp:要求为String类型的参数,在一个jsonp请求中重写回调函数的名字。
       该值用来替代在”callback=?”这种GET或POST请求中URL参数里的”callback”部分,例如
       {jsonp:’onJsonPLoad’}会导致将”onJsonPLoad=?”传给服务器。
username:要求为String类型的参数,用于响应HTTP访问认证请求的用户名。
password:要求为String类型的参数,用于响应HTTP访问认证请求的密码。
processData:要求为Boolean类型的参数,默认为true。默认情况下,发送的数据将被转换为对象(从技术角度
             来讲并非字符串)以配合默认内容类型”application/x-www-form-urlencoded”。如果要发送DOM
             树信息或者其他不希望转换的信息,请设置为false。
scriptCharset:要求为String类型的参数,只有当请求时dataType为”jsonp”或者”script”,并且type是GET时
               才会用于强制修改字符集(charset)。通常在本地和远程的内容编码不同时使用。
 
案例代码:

$(function(){
    $('#send').click(function(){
         $.ajax({
             type: "POST",// GET , POST
             url: "test.json",
             data: {username:$("#username").val(), content:$("#content").val()},
             dataType: "json", // xml , html , script , json , jsonp , text
             success: function(d){
			 console.log(d);
                         $('#resText').empty();   //清空resText里面的所有内容
                         var html = ''; 
                         $.each(d, function(i, v){
                               html += '<div class="comment"><h6>' + v['username']
                                         + ':</h6><p class="para"' + v['content']
                                         + '</p></div>';
                         });
                         $('#resText').html(html);
                      }
         });
    });
});

 
顺便说一下$.each()函数:
$.each()函数不同于JQuery对象的each()方法,它是一个全局函数,不操作JQuery对象,而是以一个数组或者对象作为第1个参数,以一个回调函数作为第2个参数。回调函数拥有两个参数:第1个为对象的成员或数组的索引,第2个为对应变量或内容。

百度JS模板引擎 baiduTemplate

BaiduTemplate

最简单好用的JS模板引擎,JS语法学习无成本,调用也只是一个函数哦!

项目地址:http://tangram.baidu.com/BaiduTemplate/

//直接复制即可使用,记得要下载baiduTemplate.js
//index.html
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>test</title>

<!-- 引入baiduTemplate -->
<script type="text/javascript" src="./baiduTemplate.js"></script>

</head>
<body>
<div id='result'></div>

<!-- 模板1开始,可以使用script(type设置为text/html)来存放模板片段,并且用id标示 -->
<script id="t:_1234-abcd-1" type="text/html">
<div>
    <!-- 我是注释,语法均为Javascript原生语法,默认分割符为 <% %> ,也可以自定义,参见API部分 -->
    <!-- 输出变量语句,输出title -->
    <h1>title:<%=title%></h1>
    <!-- 判断语句if else-->
    <%if(list.length>1) { %>
        <h2>输出list,共有<%=list.length%>个元素</h2>
        <ul>
            <!-- 循环语句 for-->
            <%for(var i=0;i<5;i++){%>
                <li><%=list[i]%></li>
            <%}%>
        </ul>
    <%}else{%>
        <h2>没有list数据</h2>   
    <%}%>
</div>  
</script>
<!-- 模板1结束 -->

<!-- 使用模板 -->
<script type="text/javascript">
var data={
    "title":'欢迎使用baiduTemplate',
    "list":[
        'test1:默认支持HTML转义,如输出<script>,也可以关掉,语法<:=value> 详见API',
        'test2:',
        'test3:',
        'test4:list[5]未定义,模板系统会输出空'
    ]
};

//使用baidu.template命名空间
var bt=baidu.template;

//可以设置分隔符
//bt.LEFT_DELIMITER='<!';
//bt.RIGHT_DELIMITER='!>';

//可以设置输出变量是否自动HTML转义
//bt.ESCAPE = false;

//最简使用方法
var html=bt('t:_1234-abcd-1',data);

//渲染
document.getElementById('result').innerHTML=html;
</script>

</body>
</html>