??xml version="1.0" encoding="utf-8" standalone="yes"?>
大家都知道javascript是可以隐式声名变量的。但要注意,隐式声名变量L被创Zؓ(f)全局变量。看以下代码Q情愿javascript语言强制声明变量。徏议大家一定要var声明变量?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
function test(){ (tng) (tng)
(tng) (tng) (tng) var a=222; (tng) (tng)
(tng)document.writeln(a); (tng) (tng)
} (tng) (tng)
test(); (tng) (tng)
document.writeln(a); (tng) (tng)
</SCRIPT> (tng)
(tng)
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
function test(){ (tng) (tng)
(tng) (tng) (tng) a=222; (tng) (tng)
(tng)document.writeln(a); (tng) (tng)
} (tng) (tng)
test(); (tng) (tng)
document.writeln(a); (tng) (tng)
</SCRIPT> (tng) (tng)
2、关于变量的作用?
猜猜以下代码输出什么?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
var x='000'; (tng) (tng)
document.writeln(x); (tng) (tng)
a(); (tng) (tng)
function a(){ (tng) (tng)
(tng) (tng) (tng) var x='aaa'; (tng) (tng)
(tng)function b(){ (tng) (tng)
(tng) (tng) (tng) (tng) document.writeln(x); (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) var x='bbb'; (tng) (tng)
(tng) document.writeln(x); (tng) (tng)
(tng)} (tng) (tng)
(tng)b(); (tng) (tng)
(tng) (tng) (tng) document.writeln(x); (tng) (tng)
} (tng) (tng)
</SCRIPT> (tng)
如果你的{案?000 undefined bbb aaa。恭喜,ok.当代码用到x变量Ӟ先从函数块(权威指南中用调用对象来解释)(j)中找Q如果找不到Q从上一U函数块找,直到扑ֈQ如果知道顶层代码(指var x='000';的位|)(j)q没扑ֈ定义Q代码会(x)报未定义错误?/p>
改一下代码,得到 000 undefined 111 111
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
var x='000'; (tng) (tng)
document.writeln(x); (tng) (tng)
a(); (tng) (tng)
function a(){ (tng) (tng)
(tng)function b(){ (tng) (tng)
(tng) (tng) (tng) (tng) document.writeln(x); (tng) (tng)
(tng) document.writeln(x); (tng) (tng)
(tng)} (tng) (tng)
(tng)document.writeln(x); (tng) (tng)
(tng)var x='111'; (tng) (tng)
(tng)b(); (tng) (tng) (tng)
} (tng) (tng)
</SCRIPT> (tng)
3、新的问?
变量个作用域清楚?jin),注意上面的代码。ؓ(f)什么我的function a()定义以前可以调用a函数?jin),而我的var x='111';前“不可以用”x啊?Q?
让我把我的理解一一道来
首先Q以下代码让我相信javascript有个预编译过E,不是完全按照序解释执行的?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
a(); (tng) (tng)
function a(){ (tng) (tng)
(tng) (tng) (tng) alert(); (tng) (tng)
} (tng) (tng)
</SCRIPT> (tng)
个h理解q个预编译过E不?x)象java/c#那样把代码编译成虚拟识的语言Q更不会(x)象vbQvc那样~译成更底层的语a。猜惛_是把q个函数预装载到q段函数执行的全局环境中,在这个执行环境中Q该函数被标识定义过Q可以直接用了(jin)。(看到|上很多人写的AOP的javascript实现,其实q个预编译过E才是翻译元数据最x候,可惜javascript语言来讲Q是有些落伍?jin)?j)
q个文章主要讲变量的一些问题。变量说?jin),Z么函数可以,我变量就不可以呢?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
document.writeln(a); (tng) (tng)
var a=0; (tng) (tng)
</SCRIPT> (tng)
Z么我要输出undefined呢?Z么我a׃可以预编译一把呢Q?
大家看看以下两段代码?x)输Z么呢啊?Q?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
document.writeln(a); (tng) (tng)
a=0; (tng) (tng)
</SCRIPT> (tng)
(tng)
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
document.writeln(a); (tng) (tng)
</SCRIPT> (tng) (tng)
可能你运行试?jin),可能你本来就知道Qa未定义。哈哈哈Q好?jin)?
现在我确信var a=0;被javascript解释器“预~译q”,臛_是记录下来了(jin)。甚x它的D|ؓ(f) undefined。“undefined”这个词名字取的很是让h误解Q怎么能叫未定义呢Q分明是javascript中所有变量的初始化倹{关于null与undefined的比较我实在不愿提了(jin)?
注意上面两段代码q反映一个现象。隐式声明的变量是在解释的时候才把自己定义ؓ(f)全局变量的?/p>
关于函数与变量javascript预编译的不同处理Q大家可以与java class的加载过E比较下。java也是对基本类型设出|对象为null的。(不往q扯?jin)?j)
4、区别未定义变量和未附值变?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
var a; (tng) (tng)
document.writeln(a); (tng) (tng)
</SCRIPT> (tng)
(tng)
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
document.writeln(a); (tng) (tng)
</SCRIPT> (tng)
未定义变量和未附值变?权威指南中文?定义的。通过W三条分析,我觉得变量就应该?定义和未定义变量区别。未附值变量和undefined有点冲突Qjavascript不是强类型语aQ没发附默认|才来?jin)个undefined?
5、基本类型和引用cd
熟?zhn)java的朋友可能这部分很清楚。没?
说头?
6、javascript的垃圑֛?
关于q部分内容一直没见着个权威说法。在javascript权威指南中有两小节提到这个问题?
对于字符丌Ӏ对象、数据这些没有固定大,必须为它们动态的分配内存Q但什么时候回收这些内存呢Qjavascript使用和java一L(fng)garbage collection的方法?
代码
var s="hello"; (tng) (tng)
var u=s.toUpperCase(); (tng) (tng)
s=u; (tng)
q行q段代码后,"hello"没有变量?x)再用到他,q是"hello"的存储空间的被垃圑֛收了(jin)。对于javascript的垃圑֛Ӟ你唯一要关?j)的是,它一定会(x)q行Q不要对内存担心(j)?
注意Qjavascript不提供Q何的强制垃圾回收或释攑ֆ存的q算附或语句?
javascript的deleteq算附和C++中的不同?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
var o=new Object(); (tng) (tng)
o.name="zkj"; (tng) (tng)
o.age=25; (tng) (tng)
o.bir=new Date(); (tng) (tng)
for(var key in o){ (tng) (tng)
document.writeln(key+':'+o[key]+'</br>'); (tng) (tng)
} (tng) (tng)
document.writeln('delete o.bir</br>'); (tng) (tng)
delete o.bir; (tng) (tng)
for(var key in o){ (tng) (tng)
document.writeln(key+':'+o[key]+'</br>'); (tng) (tng)
} (tng) (tng)
</SCRIPT> (tng)
7、作为属性的变量
猜猜以下代码?x)输Z么?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
var x=100; (tng) (tng)
document.writeln(x); (tng) (tng)
add(x); (tng) (tng)
document.writeln('</br>------------------------</br>'); (tng) (tng)
var x=200; (tng) (tng)
document.writeln(x); (tng) (tng)
add(x); (tng) (tng)
function add(x){ (tng) (tng)
(tng) (tng) (tng) document.writeln(x); (tng) (tng) (tng)
(tng) (tng) (tng) var x=300; (tng) (tng)
(tng) (tng) (tng) document.writeln(x); (tng) (tng) (tng)
(tng) (tng) (tng) var x=400; (tng) (tng)
(tng) (tng) (tng) document.writeln(x); (tng) (tng)
} (tng) (tng)
</SCRIPT> (tng)
估计很多得出正确{案
100 100 300 400
------------------------
200 200 300 400
但这里我惛_?全局对象和调用对象的 概念Qjavascript权威指南是这么翻译滴Q?
代码
<SCRIPT LANGUAGE="JavaScript"> (tng)
var x=100; (tng) (tng) //我们在全局对象中加?jin)个属性x. Ҏ(gu) (tng) (tng)
(tng)//var o=new Object();o.x=100; (tng) (tng)
document.writeln(this.x);//用this讉K全局对象 (tng) (tng)
add(this.x);//把全局对象的属性g递对函数中?tng)?
document.writeln('</br>------------------------</br>'); (tng) (tng)
this.x=200;//把全局变量中的x属性修Ҏ(gu) (tng) (tng)
document.writeln(window.x); (tng) (tng)
add(window.x); (tng) (tng)
function add(x){ (tng) (tng)
(tng) (tng) (tng) //假设有个局部对象,调用对象Q函数调用过E中的对象?tng)?
// (tng) temp (tng) (tng) temp.x=${传入的值} (tng) (tng)
(tng) (tng) (tng) document.writeln(x); //哦这打印的可是参C的|也就是temp.x=this.x (tng) (tng)
//的? (tng) (tng)
(tng) (tng) (tng) var x=300;//把调用对象变量的{l覆盖了(jin). (tng) (tng)
(tng) (tng) (tng) document.writeln(x); //打印修改q的倹{?temp.x (tng) (tng)
(tng)var x=400;//temp.x=400 (tng)
(tng) (tng) (tng) document.writeln(x); (tng) (tng)
} (tng) (tng)
</SCRIPT> (tng)
在函数的调用q程中,假设有个调用对象存在Q把函数的参敎ͼ和函数内的(f)时变量当成这个调用对象的属性。当然这个调用对象的生命周期很短?
注意Q当我们讉K全局变量的属性入x的时候,不必要用this.x 或window.x讉KQ当在有<frame><iframe>的页面时?x)出现淆?
关于函数的详l讨论我后箋?x)详l讨论?/p>
(tng)
文章来自Q?a >http://www.javaeye.com/article/19506
javadq程文g代码Q?/p>
(tng)
1QDOM(JAXP Crimson解析?
(tng) (tng) (tng) (tng) (tng) (tng) (tng) DOM是用与^台和语言无关的方式表CXML文档的官方W3C标准。DOM是以层次l构l织的节Ҏ(gu)信息片断的集合。这个层ơ结构允许开发h员在?wi)中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因而DOM被认为是Z?wi)或Z对象的。DOM以及(qing)q义的基于树(wi)的处理具有几个优炏V首先,׃?wi)在内存(sh)是持久的,因此可以修改它以便应用程序能?gu)据和l构作出更改。它q可以在M时候在?wi)中上下DQ而不是像SAX那样是一ơ性的处理。DOM使用h也要单得多?br /> (tng)
(tng)
2QSAX
(tng) (tng) (tng) (tng) (tng) (tng) (tng) SAX处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存(sh)。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_(d)SAXq比它的替代者DOM快许多?
(tng) 选择DOMq是选择SAXQ?对于需要自q写代码来处理XML文档的开发h员来_(d) (tng) 选择DOMq是SAX解析模型是一个非帔R要的设计决策?DOM采用建立?wi)Şl构的方式访问XML文档Q而SAX采用的事件模型?
DOM解析器把XML文档转化Z个包含其内容的树(wi)Qƈ可以Ҏ(gu)(wi)q行遍历。用DOM解析模型的优Ҏ(gu)~程Ҏ(gu)Q开发h员只需要调用徏?wi)的指o(h)Q然后利用navigation APIs讉K所需的树(wi)节点来完成Q务。可以很Ҏ(gu)的添加和修改?wi)中的元素。然而由于用DOM解析器的时候需要处理整个XML文档Q所以对性能和内存的要求比较高,其是遇到很大的XML文g的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频J的改变的服务中?
SAX解析器采用了(jin)Z事g的模型,它在解析XML文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX对内存的要求通常?x)比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文档中所包含的部分数据时QSAXq种扩展能力得到?jin)更好的体现。但用SAX解析器的时候编码工作会(x)比较困难Q而且很难同时讉K同一个文档中的多处不同数据?
3QJDOM (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) http://www.jdom.org
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) JDOM的目的是成ؓ(f)Java特定文档模型Q它化与XML的交互ƈ且比使用DOM实现更快。由于是W一个Java特定模型QJDOM一直得到大力推q和?j)进。正在考虑通过“Java规范hJSR-102”将它最l用作“Java标准扩展”。从2000q初已l开始了(jin)JDOM开发?
JDOM与DOM主要有两斚w不同。首先,JDOM仅用具体类而不使用接口。这在某些方面简化了(jin)APIQ但是也限制?jin)灵zL。第二,API大量使用?jin)Collectionsc,化了(jin)那些已经熟?zhn)q些cȝJava开发者的使用?
JDOM文档声明其目的是“?0%(或更?的精力解?0%(或更?Java/XML问题?Ҏ(gu)学习(fn)曲线假定?0%)。JDOM对于大多数Java/XML应用E序来说当然是有用的Qƈ且大多数开发者发现API比DOMҎ(gu)理解得多。JDOMq包括对E序行ؓ(f)的相当广泛检查以防止用户做Q何在XML中无意义的事。然而,它仍需要?zhn)充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错?。这也许是比学习(fn)DOM或JDOM接口都更有意义的工作?
JDOM自n不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(管它还可以以前构造的DOM表示作ؓ(f)输入)。它包含一些{换器以将JDOM表示输出成SAX2事g、DOM模型或XML文本文档。JDOM是在Apache许可证变?sh)下发布的开放源码?/p>
4QDOM4J http://dom4j.sourceforge.net
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 虽然DOM4J代表?jin)完全独立的开发结果,但最初,它是JDOM的一U智能分支。它合ƈ?jin)许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及(qing)用于大文档或化文档的基于事件的处理。它q提供了(jin)构徏文档表示的选项Q它通过DOM4J API和标准DOM接口hq行讉K功能。从2000下半q开始,它就一直处于开发之中?
为支持所有这些功能,DOM4J使用接口和抽象基本类Ҏ(gu)。DOM4J大量使用?jin)API中的Collectionsc,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽然DOM4J付出?jin)更复杂的API的代P但是它提供了(jin)比JDOM大得多的灉|性?
在添加灵zL、XPath集成和对大文档处理的目标ӞDOM4J的目标与JDOM是一L(fng)Q针对Java开发者的易用性和直观操作。它q致力于成ؓ(f)比JDOM更完整的解决Ҏ(gu)Q实现在本质上处理所有Java/XML问题的目标。在完成该目标时Q它比JDOM更少防止不正的应用E序行ؓ(f)?
DOM4J是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多的Java软g都在使用DOM4J来读写XMLQ特别值得一提的是连Sun的JAXM也在用DOM4J?
2.. 比较
1QDOM4J性能最好,qSun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4JQ例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文g。如果不考虑可移植性,那就采用DOM4J.
2QJDOM和DOM在性能试时表C佻I在测?0M文档时内存溢出。在文档情况下q值得考虑使用DOM和JDOM。虽然JDOM的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现q泛应用于多U编E语a。它q是许多其它与XML相关的标准的基础Q因为它正式获得W3C推荐(与基于非标准的Java模型相对)Q所以在某些cd的项目中可能也需要它(如在JavaScript中用DOM)?/p>
3QSAX表现较好Q这要依赖于它特定的解析方式Q事仉动。一个SAX(g)即到来的XML,但ƈ没有载入到内?当然当XML被dӞ?x)有部分文档暂时隐藏在内存?sh))?/p>
3. 四种xml操作方式的基本用方?/p>
xml文gQ?/p>
Q?xml version="1.0" encoding="GB2312"?Q?br />QRESULTQ?br /> (tng) (tng) (tng) QVALUEQ?
(tng) (tng) (tng) (tng) (tng) QNOQA1234Q?NOQ?
(tng) (tng) (tng) (tng) QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ?br /> (tng) (tng) (tng) Q?VALUEQ?br /> (tng) (tng) (tng) QVALUEQ?
(tng) (tng) (tng) (tng) (tng) QNOQB1234Q?NOQ?
(tng) (tng) (tng) (tng) QADDRQ四川省XX?jng)XX乡XX村XXl</ADDRQ?br /> (tng) (tng) (tng) Q?VALUEQ?br />Q?RESULTQ?
1QDOM
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{ (tng)
File f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;iQnl.getLength();i++){
System.out.print("车牌L(fng):" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2QSAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
(tng) (tng) }
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) { (tng)
System.out.print("车牌L(fng)Q? + new String(ch, start, length));
(tng) (tng) (tng) }
(tng) (tng) (tng) if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));
(tng) (tng) (tng) }
(tng) (tng) }
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}
} (tng)
3Q?JDOM
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder(); (tng)
Document doc = builder.build(new File("data_10k.xml")); (tng)
Element foo = doc.getRootElement(); (tng)
List allChildren = foo.getChildren(); (tng)
for(int i=0;iQallChildren.size();i++) { (tng)
System.out.print("车牌L(fng):" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4QDOM4J
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("data_10k.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
foo = (Element) i.next();
System.out.print("车牌L(fng):" + foo.elementText("NO"));
System.out.println("车主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
(tng) (tng) (tng) }
}