宇宙无属性 (v3)

这是我写的第三篇用于阐述这个观点的文章, 因为这个想法很抽象, 尽管之前已经很努力地去说明, 但似乎依然不容易理解. 昨天先后同两个人解释了这个观点, 其中理解的一位给出了这样的评价 “无懈可击”, 让我激动了好一阵子, 结合这些经验, 我决定再写一篇, 尝试以最容易被接受的方式去解释这个想法. 但我想能理解的仍然会是很少的一部分人. 坦白点说, 要理解这个观点需要较高的IQ.

依然从<Mr. Nobody>这部电影说起. 这部电影是唯心的, 并且强调自由意志, 这方面并不对我胃口, 但也正是其中的一些话, 引发了我的思考. 电影最后, 年轻人问: “You can’t be dead and still be here. You can’t not exist. Is there life after death?” Nemo回答道: “After death, how can you be so sure you even exist? You don’t exist, neither do I.”

正是这个对话让我思考, 如果尝试否定自己的存在, 否定世界的存在, 或许能有新的收获? 但对于一个正常人, 这并不容易. 我们觉得, 既然我们能感觉到自己, 感觉到这个世界, 那么这一切就都是真的, 它们存在, 我存在. 然而, 我们如何能判断自己的意识就是真的呢? 更容易让人接受的, 我们现在所想的一切, 都是基于已有的记忆. 于是, 我们又如何能肯定此前的一刻是真实存在过的? 当然, 这篇文章并不是在讨论意识, 上面这些内容也只是小热身, 让大家试着去否定自己的存在, 现在所提及的内容还并不抽象, 也应该很好理解.

那, 正文从这里开始吧. 下文可能会频繁地用到 “宇宙” 和 “世界” 这两个词语, 请注意区分.

我们存在, 但也无所谓存在. 我们的世界存在, 但也无所谓存在.

任何东西都具有一定的属性, 容易理解的属性很多, 比如颜色, 大小, 形状, 质量, 名称等等. 但还有一些被忽视, 或者不容易被理解的属性, 比如 “存在还是不存在”, “真还是假”. 种种属性构成了这个世界, 也构成了我们对世界的认知.

然而, “包容” 了我们这个世界的 宇宙” 本身或许并不具有任何属性. 它是极简的.

我给 “包容” 一词加上了引号, 因为它本是不能用在我所说的 “宇宙” 上的. 事实上, 任何对这个 “宇宙” 的描述都是错误的. 但下文为了解释这个观点, 不得不犯这样一些 “错误”. 这个 “宇宙” 什么都不是, 也什么都没有, 也即所谓的 “不具有任何属性”. 自然, 很多人会问, 既然它什么都不是, 什么都没有, 那我们的世界算什么? 我们算什么?

我们的世界是真实存在的, 我们也是真实存在的, 但是 “包容” 它们的 “宇宙” 是无所谓存在的. 或者用我们这个世界的属性来描述, 上面的说法 “接近”, 这个 “宇宙” 是不存在的. 一个 “不存在” 的 “宇宙” 却 “包容” 了无数真实存在的东西, 这就是终极问题的一个答案.

不仅如此, 在这个 “宇宙” 中, “包容” 了无数个世界, 这些世界没有交集, 我们也不可能从其中一个世界到达另一个世界. 在我们的世界, 一切都以 “存在” 为基础, 但或许在另一个世界, 并非如此.

到这里, 如果能理解的, 应该也有头绪了. 我用一个比喻来帮助理解. 我们的世界就像一个数字, 而 “宇宙” 的 “无属性” 就像一个系数0, 不管数字多大, 乘上0, 结果依旧是0. 这也是为什么我们可以如此真实地存在在这个无所谓存在的 “宇宙” 中.

宇宙” 的 “无属性” 看似否定了一切, 实际却包容了一切. 如果你理解了, 欢迎告诉我你的想法. 另外如果没有理解, 但是想理解, 也可以和我交流.

Let's "call" around!

记JavaScript的种种神奇.

自己博客更新频率越来越低了, 很大程度上, 是因为技术上的收获不再有那么多, 另外即使有, 也不是特别容易归纳或者表达亦或者常用的技巧, 所以也没必要写到博客上来. 不过, 还是想写一篇, 说说怎么玩JavaScript.

标题是 <Let’s “call” around!>, 所以什么是call? 既然玩的是JavaScript, call自然不能少. 当然, 本文包含但不仅限于call, call在这里代表的, 应该是一类东西.

那, 什么时候, 我们会使用call或者apply呢? 做个不完全归纳吧.

  • OOP.
  • 函数劫持.
  • this绑定.

OOP

其实这个应该算在this绑定里, 但是在OOP中, 又运用得特别多, 于是单做一类. 假设有一个class, MyClass. 那么创建一个实例 var mc = new MyClass(), 在某些时候, 可以做如下替换. var mc = {}; MyClass.call(mc); 当然, 他们并不是等价的, 而且差距还蛮大. 但有些时候, 从功能上讲, 是可以代替一部分的. 不过在这里, 由于建立对象和调用构造函数分成了两部分, 我们就可以在其中增加一些trick. 至于什么trick, 就不多做讨论了.

函数劫持

这个时候用apply可能偏多吧, 毕竟能传递几乎所有的参数, 也方便些. 如之前存在函数fn. 现在要劫持它, 那么就可以 var fnBackup = fn; fn = function () { fnBackup.apply(this, arguments); }; 好吧, 这个仍然牵涉到了this…

this绑定

于是, 就说说单纯的this绑定咯. 对于Web前端开发来说, 在事件处理上, 一定会很熟悉. 当然对于我, 就更熟悉啦, 嘎嘎嘎. 因为写到的很多东西里, 我都会通过this绑定一些方法什么的, 供函数使用, 比如VEJIS的类有这样的写法:

var C = static_class_(function () {
    this.public_({
        xxx: 123
    });
    this.private_({
        yyy: 456
    });
});

匿名函数配合this, 很好用!

OK, 说完了call和apply, 说说callee和caller. callee大家应该很熟悉, 不过caller就… 其实实话, 我也不是很熟, 但是觉得很有意思. 虽然现在还基本没用到过, 以后就说不定咯. 用法请arguments.callee.caller.caller.caller… 自己试试咯.

然后关于正则. 先说match. 在非global情况下, 我习惯这么用.

var result = string.match(regexp) || [];

一个JS里很常见的技巧不是么, 如果我想得到整个匹配的字符串, 那我会这么做. (string.match(regexp) || [”])[0]. 当然, 这个也很简单, 就看有没这个习惯了. 使用这种方式能省不少代码哦.

那说说exec. 这是我最近两年来比较喜欢的方法, 在global模式下非常管用. 我习惯的用法类似:

var groups;
while (groups = regexp.exec(string)) { }

关于instanceof. 这个是JS的一个好东西啊, 这个运算符给了JS这种弱类型语言处理强类型工作的能力. 既然说到它, 就不得不说说继承.

JS中如何实现继承? 其他的方法就不在赘述了, 推荐我比较喜欢的一种:

//更新, 之前的方法有问题, 今天看到TypeScript的做法之后借鉴下.
var Class = function () {};
function __() { this.constructor = Class; }
__.prototype = Base.prototype;
Class.prototype = new __();

var c = new Class();
var o = {};
Base.call(o);
copy(o, c); //这儿就伪代码了, 把o上面的东西拷贝到c上, 根据需要覆盖或不覆盖.

当然… 这样写有点长, 于是, 请自行封装… 使用VEJIS当然也是可以的, 简单多了:

var Class = class(function () { }).inherit_(Base);

这种写法的优势是什么呢? 相对单纯的prototype继承, 它能够更好地保证成员的独立性, 相对单纯的工厂模式, 它能保证instanceof为true. 代价稍大, 但可以忽略.

关于参数的合法性, 有时候我们的代码是给第三方用的, 同一个方法, 或许我们在内部调用的时候, 需要使用某个参数, 但却不希望第三方使用这个参数, 这个时候怎么办? 有人会说, 约定好就好了. 但显然约定只是自我安慰. 我是一个不喜欢暴露变量的人, 不该暴露的东西绝不暴露, 不该给别人用的东西绝对不能给别人用. 于是推荐的方式是, 在自己可控的闭包内, 创建一个类, 如下:

function Value(value) {
    this.value = value;
}

然后再验证参数的时候, 使用instanceof就可以了. 因为Value这个类在闭包内, 只要不传出去 (当然, 也不能把它的实例传出去), 就是安全的.

逻辑运算符的妙用. 这个场景不多见, 也只能是抛砖引玉. 场景是这样的, 通过XHR请求到一些脚本, 脚本内容是调用了一个函数, 现在我需要通过eval来得到这个函数的返回值. 特殊之处在于, 如果前面有注释怎么办? 用正则清除掉? 可行, 但是不大好吧… 于是前后加括号? 万一结尾有分号呢? 于是, 最后我采取的方法如下: var value = global.eval(‘(function () { return false || ‘ + script + ‘ })()’);

困了… 睡觉去.

实习回来那么久啦, 也是时候写感想啦

中秋哦, 今天是.

7.10, 自己只身离开学校来到杭州, 在淘宝开始为期两个月的实习.  其实严格地说, 我在的地方叫 “一淘”. 不久前淘宝分家, 成了三家公司: “淘宝(C2C)”, “淘宝商城(B2C)”, “一淘(搜索, 入口)”. 不过因为刚刚分家不久, 三家公司都还混在一起, 不怎么能感觉到很明显的独立意味.

办理入职后, 由阿大把我和另一位实习生, XP, 领到了办公地点, 然后由师兄师姐帮忙领到了电脑. 这里还要特别感谢下妙净大, 帮我们争取了好久, 终于争取到了22英寸的显示器. 因为虽然UED部门可以使用22英寸显示器, 但实习生一般是不行的.

我和XP都分到一位大大, 做师兄或者师姐, 帮我们熟悉环境和解答一些疑问. 我的师兄是俊毅大. 彻底的好男人啊, 压力很大. 顺便, 丘迟大大好可爱啊.

几天后, 是实习生入职培训, 总共六个小组, 我也不知道怎么的成了我们组组长, 然后组名还盗用了高中时候的一个学习小组组名, 叫 “基因重组”, 主要是觉得好霸气, 好高科技! 当然, 组员给力, 组长给力, 结果当然给力! 无悬念地, 我们以第一名的成绩完成了这次 “培训”. 按说我们组应该每人能领到一个小公仔, 不过现场失控, 我的小公仔被抢了… 最关键的是, 是被阿曼抢去给别人了… 下面附照一张, 当然, 最霸气的就是我.

培训之后, 又是过了很久, 才慢慢进入工作状态. 因为一开始没分配到什么工作, 所以我还蛮心虚的, 觉得对不起实习津贴. 后来总算慢慢忙起来了, 感觉也不错, 做前端就是那么欢乐.

因为我们中午吃饭的时候, 有时是一种叫 “小餐桌” 的形式, 也就是叫外卖, 点二十来道菜, 然后二十来个人一起吃. 餐桌是大家的柜子 (可以移动) 拼成的, 故得名 “小餐桌”. 后来分配到一个任务, 写一个点餐系统, 方便大家点菜… 好吧, 最后的确被我水了… 水的原因有二, 一个是后来慢慢比较忙一些, 一个是当时突然涌现了无数小餐桌点餐系统… 而且确有功能比较完善的, 于是自己再做重复的东西意义也就不大了.

工作上, 是朝九晚六, 中间一小时休息时间. 但实际上时间很灵活, 早上9:30之前到就好, 不打卡, 一切看人品. 不过作为技术宅, 晚上经常会有一群人, 当然包括我, 会待到很晚. 一方面回去也就是对着电脑, 一方面, 还有夜宵吃.

周末也是, 一般会有很多人来公司蹭网蹭饭, 早上来可以领午餐, 中午来可以领晚餐. 于是… 宅男有什么理由拒绝呢?

顺便, 科学上网也很方便哦! 说到这个, 欢迎follow @vilicvane(twitter), 圈vilic.vane@gmail.com(G+), 加i@vilic.info(facebook).

那下面说说工作吧. 搞IT的就是搞IT的, 感觉不到阶级的存在, 大家就像同学一样, 然后一起工作, 一起努力, 当然也可能是我们平时也很少接触更高层的上司. 关于这个问题, 我还专门问了天宏大 (应该算一淘UED的主管吧), 他所描述的也是如此. 整个行业相对来说, 都会 “单纯” 一些, 毕竟搞技术的拼的是实力.

我们主要是使用GIT做版本控制, IDE方面, 使用VIM的居多, 另外有看到乔花姐貌似是在用IntelliJ IDEA, 当然, 我肯定是用的VS (确切地说是Visual Web Developer). 不过VS有点不爽, 其实不能说不爽, 只怪它太强. 就是每次都会格式化别人的JS, 弄得我提交之后, GIT会以为我修改了整个文件里的几乎全部代码…

顺便, 我的第一个位置, 座位号是2-2-2, 比较霸气… 不过那是个好位置啊, 左边和前面都是运营, 右前方是视觉和交互, 至于这些意味着什么, 你们懂的… 悲剧就悲剧在虽然本人心灵衰老, 到生理年龄还太小, 只能打望打望而已…

后来搬到了窗户边, 没事可以看看窗外, 也不错的.

工作之余, 大家会经常玩桌上足球. 我的水平也有了质的飞跃啊. 不过可惜没拍下相关照片… 但, 另外一种颓废场景的照片, 我还是拍下来了的…

对了… 中途相机走失, 是在阿大的帮助下找到的, 对此我还欠阿大一顿饭… 有机会补上…

那写在最后, 一淘是个好地方, 人杰地灵, 这次实习, 想要gain到的东西也gain到了. 团队合作经验和工作体验. 顺便, 现在一淘很缺人哦, 大家请疯狂地投简历! 前端请到 ada@taobao.com, 交互和视觉请到 yuecheng@taobao.com.