Javascript 中的 undefined 与 未定义(not defined)

在 Javascript 中,有一种致命错误非常常见,即 ReferenceError:xxx is not defined. 但是,有时候当一个值从未被赋值的时候,并不会出错,而是返回 undefined,有必要对这两者进行梳理。

undefined

undefined 表达的含义有三种情况:

  1. 这个变量存在,但是并没有给予任何值。
  2. 一种普通的数据类型和一种值。你可以手工将任何变量赋值为 undefined,此时其没有特别含义。
  3. 一个存在的对象中的一个不存在(没有声明)的值,会被认为是 undefined。

对这三种情况进行归纳,undefined 可以如下总结:

  • 它是一种数据类型,也是一种值。
  • 有这种值的时候,要么它本身被赋值,要么本身存在,要么其所在对象存在。完全不存在的变量不会是 undefined(注意,此处还有坑,往后看)。
    下面举几个例子。

一个声明但没有赋值的变量为 undefined

    var p;
    alert(p); // undefined

一个不存在的对象成员为 undefined

    var p = { };
    alert(p.a); // undefined

如果 p 还有一个成员 b,其值被手工赋值为 undefined,如何区分不存在的成员 a 和存在的成员 b?可以使用 Object.prototype.HasOwnProperty() 方法。

一个手工赋值的 undefined

    var p = 5;
    p = undefined;
    alert(p); // undefined

从上面的三个例子可以清楚看出 undefined 的一些情况。undefined 的优点在于正常使用有此值的变量不会抛出异常。

未定义(not defined)

一个 未定义 (not defined) 的变量是完全没有任何声明的变量。这样的变量在使用时会直接抛出致命错误。但是,如果使用 typeof 来判断这样的变量,不但不会出错,而且竟然会返回 undefined,这使得无法使用 typeof 来区分这两种情况。

甲午年,至关重要的使命

接下来的一年于我而言的重要,直接可以用人生选择来形容。我已经将创业作为了自己的发展方向和主业。接下来的半年,算是正式创业的开端。从此,作为一个职业创业者,今年的使命可以说「亚历山大」。
更核心的时期,应该是前半年,也就是我毕业之前的时间节点。在这段时间,我的业绩能做到如何,企业能否起步,将是相当重要的一个转折点。
加油。

蔡元培不肯再任北大校长的宣言

(1919年6月15日)

(一)我绝对不能再作那政府任命的校长:为了北京大学校长是简任职,是半官僚性质,便生出那许多官僚的关系,那里用呈,那里用咨,天天有一大堆无聊的照例的公牍。要是稍微破点例,就要呈请教育部,候他批准。什么大学文、理科叫做本科的问题,文、理合办的问题,选科制的问题,甚至小到法科暂省学长的问题,附设中学的问题,都要经那拘文牵义的部员来斟酌。甚而部里还常常派了什么一知半解的部员来视察,他报告了,还要发几个训令来训饬几句。我是个痛恶官僚的人,能甘心仰这些官僚的鼻息么?我将进北京大学的时候,没有想到这一层,所以两年有半,天天受这个苦痛。现在苦痛受足了,好容易脱离了,难道还肯投入去么?

(二)我绝对不能再做不自由的大学校长:思想自由,是世界大学的通例。得意志帝政时代,是世界著名开明专制的国,他的大学何等自由。那美、法等国,更不必说了。北京大学,向来受旧思想的拘束,是很不自由的。我进去了,想稍稍开点风气,请了几个比较的有点新思想的人,提倡点新的学理,发布点新的印刷品,用世界的新思想来比较,用我的理想来批评,还算是半新的。在新的一方面偶有点儿沾沾自喜的,我还觉得好笑。哪知道旧的一方面,看了这点半新的,就算"洪水猛兽"一样了。又不能用正当的辩论法来干涉了,国务院来干涉了,甚而什么参议院也来干涉了,世界哪有这种不自由的大学么?还要我去充这种大学的校长么?

(三)我绝对不能再到北京的学校任校长:北京是个臭虫窠。无论何等高尚的人物,无论何等高尚的事业,一到北京,便都染了点臭虫的气味。我已经染了两年有半了,好容易逃到故乡的西湖、鉴湖,把那个臭气味淘洗干净了。难道还要我再作逐臭之夫,再去尝尝这气味么?

我想有人见了我这一段的话,一定要把'我不入地狱,谁入地狱'的话来劝勉我。但是我现在实在没有到佛说这句话的时候的程度,所以只好谨谢不敏了。

附:爱蔡孑民者启

右宣言闻尚是蔡君初出京时所草,到上海后,本拟即行宣布,后因北京挽留之电,有友人劝其婉复,免致以个人去留问题与学生所争政治问题,永结不解之缘,故有以条件的允任维持之电,后来又有卧病不行之电,均未将真意说出。闻其意,无论如何,决不回校也。鄙人抄得此宣言书,觉与北京各报所载启事,及津浦车站告友之言,均相符合,必是祭君本意。个人意志自由,本不可以多数压制之,且为社会上留此一个干净人,使不与政治问题发生关系,亦是好事。故特为宣布,以备挽留蔡君者之参考焉。爱蔡孑民者启

据蔡元培手稿

选自《蔡元培全集》第3卷,中华书局1984年版

另附《蔡元培先生任北京大学校长之就职演说》

五年前,严几道先生为本校校长时,余方服务教育部,开学日曾有所贡献于学校。诸君多自预科毕业而来,想必闻知。士别三日,刮目相见,况时阅数载,诸君较昔当为长足之进步矣。予今长斯校,请以三事为诸君告:

一曰抱定宗旨。诸君来此求学,必有一定宗旨,欲求宗旨之正大与否,必先知大学之性质。今人肄业专门学校,学成任事,此固势所必然。而在大学则不然,大学者,研究高深学问者也。外人每指摘本校之腐败,以求学于此者,皆有做官发财思想,故毕业预科者,多入法科,入文科者甚少,入理科者尤少,盖以法科为干禄之终南捷径也。因做官心热,对于教员,则不问其学问之浅深,惟问其官阶之大小。官阶大者,特别欢迎,盖为将来毕业有人提携也。现在我国精于政法者,多入政界,专任教授者甚少,故聘请教员,不得不聘请兼职之人,亦属不得已之举。究之外人指摘之当否,姑不具论,然弭谤莫如自修,人讥我腐败,问心无愧,于我何惧?果欲达其做官发财之目的,则北京不少专门学校,入法科者尽可肄业于法律学堂,入商科者亦可投考商业学校,又何必来此大学?所以诸君须抱定宗旨,为求学而来,入法科者,非为做官;入商科者,非为致富。宗旨既定,自趋正轨,诸君肄业于此,或三年,或四年,时间不为不多,苟能爱惜分阴,孜孜求学,则求造诣,容有底止。若徒志在做官发财,宗旨既乖,趋向自异。平时则放荡冶游,考试则熟读讲义,不问学问之有无,惟争分数之多寡;试验既终,书籍束之高阁,毫不过问,敷衍三、四年,潦草塞责,文凭到手,即可借此活动于社会,岂非与求学初衷大相背驰乎?光阴虚度,学问毫无,是自误也。且辛亥之役,吾人之所以革命,因清廷官吏之腐败。即在今日,吾人对于当轴多不满意,亦以其道德沦丧。今诸君苟不于此时植其基,勤其学,则将来万一因生计所迫,出而仕事,但任讲席,则必贻误学生;置身政界,则必贻误国家。是误人也。误已误人,又岂本心所愿乎?故宗旨不可以不正大。此余所希望于诸君者一也。

二曰砥砺德行。方今风俗日偷,道德沦丧,北京社会,尤为恶劣,败德毁行之事,触目皆是,非根基深固,鲜不为流俗所染。诸君肄业大学,当能束身自爱。然国家之兴替,视风俗之厚薄。流俗如此,前途何堪设想。故必有卓绝之士,以?身作则,力矫颓俗,诸君为大学学生,地位甚高,肩此重任,责无旁贷,故诸君不惟思所以感已,更必有以励人。苟德之不修,学之不讲,同乎流俗,合乎污世,已且为人轻侮,更何足以感人。然诸君终日伏首案前,芸芸攻苦,毫无娱乐之事,必感身体上之苦痛。为诸君计,莫如以正当之娱乐,易不正当之娱乐,庶几道德无亏,而于身体有益。诸君入分科时,曾填写愿书,遵守本校规则,苟中道而违之,岂非与原始之意相反乎?故品行不可以不谨严。此余所希望于诸君者二也。

三曰敬爱师友。教员之教授,职员之任务,皆以图诸君求学便利,诸君能无动于衷乎?自应以诚相待,敬礼有加。至于同学共处一室,尤应互相亲爱,庶可收切磋之效。不惟开诚布公,更宜道义相勗,盖同处此校,毁誉共之。同学中苟道德有亏,行有不正,为社会所訾詈,已虽规行矩步,亦莫能辨,此所以必互相劝勉也。余在德国,每至店肆购买物品,店主殷勤款待,付价接物,互相称谢,此虽小节,然亦交际所必需,常人如此,况堂堂大学生乎?对于师友之敬爱,此余所希望于诸君者三也。

余到校视事仅数日,校事多未详悉,兹所计划者二事:一曰改良讲义。诸君既研究高深学问,自与中学、高等不同,不惟恃教员讲授,尤赖一已潜修。以后所印讲义,只列纲要,细微末节,以及精旨奥义,或讲师口授,或自行参考,以期学有心得,能裨实用。二曰添购书籍。本校图书馆书籍虽多,新出者甚少,苟不广为购办,必不足供学生之参考。刻拟筹集款项,多购新书,将来典籍满架,自可旁稽博采,无虞缺乏矣。今日所与诸君陈说者只此,以后会晤日长,随时再为商榷可也。

蔡元培
1917年4月

PHP 获取 EXIF 信息时中文编码问题

在 Windows 中编辑的 EXIF 信息(指的是资源管理器之中编辑的)默认存储为 Unicode,但是

Unicode 编码并不等于 UTF-8 编码。

所以,在 PHP 中进行如下转换:

iconv("unicode", "utf8", xxxxx);

博客迁至青云

为了整合资源,将我的博客,乐乐嘎嘎主页,一些商业项目的主页全部搬迁到一台青云服务器上,利用 Dropbox 做了实时备份,节能,环保,省钱,关键是 BGP 多线访问速度很快。

简单记录一下搬迁过程中的几点。

关于Dropbox命令行版本内存占用

在一两年前,我曾经也使用过 Dropbox 的命令行版本作服务器的备份。所以,至今一直不太敢用 Dropbox 来做备份。但是,最近在网上搜到 Dropbox 的某个版本已经修正了在 Linux 占用内存过大的问题,于是果断重新启用了 Dropbox。顺便买了一个淘宝上的通过邀请来扩容的玩意,2.9元扩到16GB还是很划算的,竟然还有「10天慢速扩容版」和「30天极慢」版防止被发现作弊,国人智慧真是无穷。

关于wordpress从新浪云SAE迁移到普通服务器

将 wordpress 从新浪云SAE搬迁到普通服务器的时候,主要的麻烦之处在于图片的存储迁移。这是因为在SAE上,绝大多数人使用的 wordpress 是新浪云修改版的,(事实上如果不修改似乎也不太能运行……)这样的修改版中图片被托管在了 SAE 的 Storage 服务之中。新浪云的 Storage不能批量下载,所以转移图片需要一点点技巧。

迁移数据库

迁移数据库比较简单,只需要在 SAE  中直接导出数据库(过大数据可以通过 Deferred Jobs方式导出),在新的服务器中上传,并通过 mysql 的 source 即可导入:

mysql -uxxx -p

mysql> source xxx.sql;

至于 wordpress 程序,可以直接从 SAE 的项目 svn 中下载并提交到新服务器,你可以可以直接用 wget 从 wordpress 服务器下载一份最新的 wordpress。

关键问题在于如何迁移图片。

迁移图片

首先,在原先博客的后台管理中,利用导出工具导出一份 xml 文件。你也可以直接用你之前导出的 SQL 文件。

打开这个文件,利用一些正则表达式工具,提取出来其中的图片 URL。正则表达式大概是这样的:

http://你的网站名-wordpress.stor.sinaapp.com/uploads/[\w.]+?\.(jpg|png|bmp|jpeg)

然后去重(你可以利用 Excel 完成)

最后,你需要写点代码把这些文件全部下载到本地。需要保留原来的层次结构。

然后将这些文件上传到新服务器,在恢复到的新服务器的 wordpress 数据库中执行 SQL 替换:

UPDATE wp_posts SET post_content=replace(post_content, 'http://你的网站名-wordpress.stor.sinaapp.com/uploads/', '你的新网站的上传目录(别忘了带/)');

UPDATE wp_posts SET guid=replace(guid, 'http://你的网站名-wordpress.stor.sinaapp.com/uploads/', '你的新网站的上传目录(别忘了带/)');

最好在做之前先备份。

好了,迁移完毕。

1 2 3 4 8