??xml version="1.0" encoding="utf-8" standalone="yes"?>
大家都知道javascript是可以隐式声名变量的。但要注意,隐式声名变量L被创Zؓ(f)全局变量。看以下代码Q情愿javascript语言强制声明变量。徏议大家一定要var声明变量?
代码
<SCRIPT LANGUAGE="JavaScript">
function test(){
var a=222;
document.writeln(a);
}
test();
document.writeln(a);
</SCRIPT>
代码
<SCRIPT LANGUAGE="JavaScript">
function test(){
a=222;
document.writeln(a);
}
test();
document.writeln(a);
</SCRIPT>
2、关于变量的作用?
猜猜以下代码输出什么?
代码
<SCRIPT LANGUAGE="JavaScript">
var x='000';
document.writeln(x);
a();
function a(){
var x='aaa';
function b(){
document.writeln(x);
var x='bbb';
document.writeln(x);
}
b();
document.writeln(x);
}
</SCRIPT>
如果你的{案?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">
var x='000';
document.writeln(x);
a();
function a(){
function b(){
document.writeln(x);
document.writeln(x);
}
document.writeln(x);
var x='111';
b();
}
</SCRIPT>
3、新的问?
变量个作用域清楚?jin),注意上面的代码。ؓ(f)什么我的function a()定义以前可以调用a函数?jin),而我的var x='111';前“不可以用”x啊?Q?
让我把我的理解一一道来
首先Q以下代码让我相信javascript有个预编译过E,不是完全按照序解释执行的?
代码
<SCRIPT LANGUAGE="JavaScript">
a();
function a(){
alert();
}
</SCRIPT>
个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">
document.writeln(a);
var a=0;
</SCRIPT>
Z么我要输出undefined呢?Z么我a׃可以预编译一把呢Q?
大家看看以下两段代码?x)输Z么呢啊?Q?
代码
<SCRIPT LANGUAGE="JavaScript">
document.writeln(a);
a=0;
</SCRIPT>
代码
<SCRIPT LANGUAGE="JavaScript">
document.writeln(a);
</SCRIPT>
可能你运行试?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">
var a;
document.writeln(a);
</SCRIPT>
代码
<SCRIPT LANGUAGE="JavaScript">
document.writeln(a);
</SCRIPT>
未定义变量和未附值变?权威指南中文?定义的。通过W三条分析,我觉得变量就应该?定义和未定义变量区别。未附值变量和undefined有点冲突Qjavascript不是强类型语aQ没发附默认|才来?jin)个undefined?
5、基本类型和引用cd
熟?zhn)java的朋友可能这部分很清楚。没?
说头?
6、javascript的垃圑֛?
关于q部分内容一直没见着个权威说法。在javascript权威指南中有两小节提到这个问题?
对于字符丌Ӏ对象、数据这些没有固定大,必须为它们动态的分配内存Q但什么时候回收这些内存呢Qjavascript使用和java一L(fng)garbage collection的方法?
代码
var s="hello";
var u=s.toUpperCase();
s=u;
q行q段代码后,"hello"没有变量?x)再用到他,q是"hello"的存储空间的被垃圑֛收了(jin)。对于javascript的垃圑֛Ӟ你唯一要关?j)的是,它一定会(x)q行Q不要对内存担心(j)?
注意Qjavascript不提供Q何的强制垃圾回收或释攑ֆ存的q算附或语句?
javascript的deleteq算附和C++中的不同?
代码
<SCRIPT LANGUAGE="JavaScript">
var o=new Object();
o.name="zkj";
o.age=25;
o.bir=new Date();
for(var key in o){
document.writeln(key+':'+o[key]+'</br>');
}
document.writeln('delete o.bir</br>');
delete o.bir;
for(var key in o){
document.writeln(key+':'+o[key]+'</br>');
}
</SCRIPT>
7、作为属性的变量
猜猜以下代码?x)输Z么?
代码
<SCRIPT LANGUAGE="JavaScript">
var x=100;
document.writeln(x);
add(x);
document.writeln('</br>------------------------</br>');
var x=200;
document.writeln(x);
add(x);
function add(x){
document.writeln(x);
var x=300;
document.writeln(x);
var x=400;
document.writeln(x);
}
</SCRIPT>
估计很多得出正确{案
100 100 300 400
------------------------
200 200 300 400
但这里我惛_?全局对象和调用对象的 概念Qjavascript权威指南是这么翻译滴Q?
代码
<SCRIPT LANGUAGE="JavaScript">
var x=100; //我们在全局对象中加?jin)个属性x. Ҏ(gu)
//var o=new Object();o.x=100;
document.writeln(this.x);//用this讉K全局对象
add(this.x);//把全局对象的属性g递对函数中 ?
document.writeln('</br>------------------------</br>');
this.x=200;//把全局变量中的x属性修Ҏ(gu)
document.writeln(window.x);
add(window.x);
function add(x){
//假设有个局部对象,调用对象Q函数调用过E中的对象 ?
// temp temp.x=${传入的值}
document.writeln(x); //哦这打印的可是参C的|也就是temp.x=this.x
//的?
var x=300;//把调用对象变量的{l覆盖了(jin).
document.writeln(x); //打印修改q的倹{?temp.x
var x=400;//temp.x=400
document.writeln(x);
}
</SCRIPT>
在函数的调用q程中,假设有个调用对象存在Q把函数的参敎ͼ和函数内的(f)时变量当成这个调用对象的属性。当然这个调用对象的生命周期很短?
注意Q当我们讉K全局变量的属性入x的时候,不必要用this.x 或window.x讉KQ当在有<frame><iframe>的页面时?x)出现淆?
关于函数的详l讨论我后箋?x)详l讨论?/p>
文章来自Q?a >http://www.javaeye.com/article/19506
javadq程文g代码Q?/p>
1QDOM(JAXP Crimson解析?
DOM是用与^台和语言无关的方式表CXML文档的官方W3C标准。DOM是以层次l构l织的节Ҏ(gu)信息片断的集合。这个层ơ结构允许开发h员在?wi)中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因而DOM被认为是Z?wi)或Z对象的。DOM以及(qing)q义的基于树(wi)的处理具有几个优炏V首先,׃?wi)在内存中是持久的,因此可以修改它以便应用程序能?gu)据和l构作出更改。它q可以在M时候在?wi)中上下DQ而不是像SAX那样是一ơ性的处理。DOM使用h也要单得多?br />
2QSAX
SAX处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_(d)SAXq比它的替代者DOM快许多?
选择DOMq是选择SAXQ?对于需要自q写代码来处理XML文档的开发h员来_(d) 选择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 http://www.jdom.org
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许可证变体下发布的开放源码?/p>
4QDOM4J http://dom4j.sourceforge.net
虽然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)有部分文档暂时隐藏在内存??/p>
3. 四种xml操作方式的基本用方?/p>
xml文gQ?/p>
Q?xml version="1.0" encoding="GB2312"?Q?br />QRESULTQ?br /> QVALUEQ?
QNOQA1234Q?NOQ?
QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ?br /> Q?VALUEQ?br /> QVALUEQ?
QNOQB1234Q?NOQ?
QADDRQ四川省XX?jng)XX乡XX村XXl</ADDRQ?br /> 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{
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();
}
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")) {
System.out.print("车牌L(fng)Q? + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));
}
}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}
}
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();
Document doc = builder.build(new File("data_10k.xml"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;iQallChildren.size();i++) {
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();
}
}