1.null 与 undefined
* 从一个对象中获取某个属性,如果该对象及其 prototype 链 中的对象都没有该属性的时候,该属性的值为 undefined 。
* 一个 function 如果没有显式的通过 return 来返回值给其调用者的话,其返回值就是 undefined 。有一个特例就是在使用new的时候。
* JavaScript 中的 function 可以声明任意个形式参数,当该 function 实际被调用的时候,传入的参数的个数如果小于声明的形式参数,那么多余的形式参数的值为 undefined 。
* null为空对象,注意与空的对象({})的区别。
2.if 表达式
* Null总是为假(false)
* Undefined总是为假(false)
* Number+0,-0 或是 NaN 的时候为假,其它值为真
* String空字符串的时候为假,其它值为真
* Object总是为真(true)
3.Array
JavaScript 中的数组(Array)和通常的编程语言,如 Java 或是 C/C++ 中的有很大不同。在 JavaScript 中的对象就是一个无序的关联数组,而 Array 正是利用 JavaScript 中对象的这种特性来实现的。在 JavaScript 中,Array 其实就是一个对象,只不过它的属性名是整数,另外有许多额外的属性(如 length)和方法(如 splice)等方便地操作数组。 Read the rest of this entry »
有时候为了保护.config文件中的敏感信息,我们需要对其中的部分内容进行加密。在MSDN的一篇文档里,提供了一个使用命令行工具通过DPAPI进行配置文件加密的办法。这篇文章里提供另一个通过.NET API的方法加密配置文件的途径。
所需要编写的代码其实非常简单,如下是一个简单的示例:
- Configuration myConfig = WebConfigurationManager.OpenWebConfiguration("/");
- ConfigurationSection mySection = myConfig.GetSection("appSettings");
- mySection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
- myConfig.Save();
主要使用了ProtectSection这个方法来对指定的配置项进行加密。解密的过程也非常简单,只要调用UnprotectSection方法即可,示例代码如下:
- Configuration myConfig = WebConfigurationManager.OpenWebConfiguration("/");
- ConfigurationSection mySection = myConfig.GetSection("appSettings");
- mySection.SectionInformation.UnprotectSection();
- myConfig.Save();
或许你有更多更好的保护配置文件中敏感信息的策略和方法,欢迎与我们交流 ^_^
前一段时间使用 System.Net.Mail.MailMessage 类写了一个邮件批量发送的程序,在调试和测试中遇到的一些问题和大家共享一下,希望能够对大家有所帮助。
用MailMessage 类发送邮件的方法有很多,但我推荐使用异步方式发送邮件,尤其是发送批量邮件,这是因为程序在向邮件服务器提交多个邮件时,同步方式是等到上一封邮件提交完成并且有发送状态返回,才开始发送下一封,如果这时连接邮件服务器的网络比较慢,没有及时响应,那么程序一直处于等待状态,会影响后面的发送,有时还会产生重复提交,使收件人收到多封重复邮件。
下面是一个异步发送的实例。
Read the rest of this entry »
大家都知道在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用示例。
DECLARE @TempTable table(UserID int , UserName nvarchar(50));
insert into @TempTable (UserID,UserName) values (1,'a')
insert into @TempTable (UserID,UserName) values (2,'b')
select UserID,UserName from @TempTable FOR XML PATH
运行这段脚本,将生成如下结果:
Read the rest of this entry »
1.Flash在form中与JavaScript通信
在HTML页面中嵌入Flash对象,并使用JavaScript与其进行通信(例如调用Flash中的某个方法)时,页面加载Flash之后,在IE浏览器中可能会出现这样的错误:‘flashObjectId’ 未定义。(其中flashObjectId是嵌入flash对象的id)。
这是因为Flash是通过ExternalInterface来与JavaScript进行通信的,当在form标签中使用Flash对象的 ExternalInterface时,是通过window.flashObjectId来获取Flash 对象在JavaScript中的引用的。
但是上面的代码只能获得不在form标签中的Flash对象,而form元素里面的Flash对象只能通过这样的代码来获得:document.forms[0].flashObjectId
Adobe官方提供了一个解决方案:
嵌入Flash对象之后,在页面中加入以下脚本:
window.flashObjectId = document.forms[0].flashObjectId;
2.flash遮挡页面中元素
Read the rest of this entry »
互联网开发的特点是什么,用一句很有名的话来说,就是always beta,什么是always beta,直白的翻译,永远的测试版,为什么会这样,因为用户的需求总是在不断的变化,唯一不变的就是变化本身。这种特点的开发特别适合敏捷开发,而强调自组织特点的Scrum又是其中一个值得尝试的开发模式。点评在最近一段时间内做了一些这方面的尝试,在实践的过程中得到了一些粗浅的认识。 Read the rest of this entry »
.NET Framework 3.5中提供了SyndicationFeed来构建RSS和ATOM的输出,其位于System.ServiceModel.Syndication这个namespace下。这使得我们可以使用官方提供的类来组织RSS输出以及获取RSS和ATOM的内容,以下是一段示例代码:
protected override void OnLoad(EventArgs e)
{
SyndicationFeed feed = new SyndicationFeed("商户信息", "提供商户信息列表", new Uri("http://www.pumaboyd.com/feed"));
Collection<SyndicationItem> items = new Collection<SyndicationItem>();
foreach (var shop in RssData.GetShops())
{
SyndicationItem item = new SyndicationItem();
item.Title = new TextSyndicationContent(shop.ShopName + shop.BranchName);
item.Content = new TextSyndicationContent(shop.Address);
item.Summary = new TextSyndicationContent(shop.Address);
item.Links.Add(new SyndicationLink(new Uri("http://www.pumaboyd.com/shop/" + shop.ShopID)));
item.Authors.Add(new SyndicationPerson("pumaboyd@163.com",shop.AddUser,"http://www.pumaboyd.com"));
item.PublishDate = shop.AddTime;
item.Id = "http://www.pumaboyd.com/shop/" + shop.ShopID;
items.Add(item);
}
feed.Items = items;
Response.ContentType = "application/rss+xml";
var output = new StringWriter();
var writer = new XmlTextWriter(output);
feed.SaveAsRss20(writer);
Response.Write(output.ToString());
}
}
我们知道,如果obj是一个div对象,在IE中要使用javascript给它定位,只需要这样写:obj.left=XXX;obj.top=XXX;
这样的写法在IE里可以顺利的通过,但是到了FireFox和Chrome下,就完全行不通了,因为这并不是标准的写法。在FireFox有规定,给像width、height、 left、top这样的属性赋值,后面必须要定义单位,也就是我们常用的"px"。
因此,如果把上面的语句换成:obj.left=XXX + "px";obj.top=XXX + "px";就可以顺利的在FireFox和Chrome下运行了
我们平时在使用Stopwatch统计时间的时候一般会这样使用。
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < runs; i++)
{
.......
}
watch.Stop();
这样就可以统计到运行的时间,但用过Python的人都知道,Python 社区有句俗语:“Python 自己带着电池” 。Python 2.3以后的版本里, 具备一个叫做 timeit 的完美计时工具。那么其实用扩展函数也可以实现这个类似功能(PS:其实功能还是相差蛮大的,但皮已经画的比较像了)。
先演示如何使用(统计A.Run这个方法运行100次的使用时间)
class Program
{
static void Main(string[] args)
{
A a = new A();
Action act = a.Run;
Console.WriteLine(act.Profile(100));
Console.Read();
}
}
public class A
{
public void Run()
{
for (int i =0; i < 100000; i++) ;
}
}
其中Profile()为Action的扩展方法,用扩展方法来封装运行时间的记录,至少避免了重复写Stopwatch。
public static class FunctionHelper
{
public static string Profile(this Action func, int runs)
{
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < runs; i++)
{
func();
}
watch.Stop();
float sec = watch.ElapsedMilliseconds / 1000.0f;
float freq = runs / sec;
return String.Format("execute runs:{0};sec:{1};freq",
runs, //运行次数
sec, // 运行时间
freq // 平均运行时间
);
}
}
有了这个扩展方法,你就可以对某些特定的方法自动调用性能函数了。大家平常在检测某段代码或某个函数运行效率时,还有什么更好的方法吗?欢迎大家讨论一下这个问题。^_^
Framework 4.0 CTP版发布一个多月了,在此期间稍有闲暇就打开来试试,尝试一下这个新东东。总体感觉微软现在技术大爆炸,一下子往F4里塞了好多东西,有的确实不错,不过有的还是感觉有点粗糙,还经不起实战考验。那以下我会简单和大家过一遍这个新的框架,一起来聊聊F4的前景。
简单回顾下历史,F1.1其实是个试验品,.Net Framework真正走向成熟其实从F2开始的,之后的F3,F3.5其实都是基于F2的扩充,我个人感觉应该定义为F2.1,F2.2。没想到微软喜欢搞大跃进,随便加点东西就变个新版本。
F3+F3SP1除了修正了一些F2的bug之外,主要的扩展是加了3W框架,分别是WPF,WCF,WWF。
F3.5和F3类似,在修正之前的Bug之外,主要的扩展是:LINQ,WF,WCF,Add-in(今后会被MEF替代)
F3.5SP1,又添了几个新东东:MVC,Dynamic Data,Entity Framework,Data Services等

当然这里面我们也不能忽略了F3在语言上进行的改进,例如Linq,Lambda,扩展函数,var类型的使用等等。
Read the rest of this entry »