無標題文檔

Re:新手虚心求教

经常有朋友邮件过来咨询技术问题,本人不才经常不是忘记回复就是回复的比较迟。原因是一来本人比较懒(或者可以托词为忙),二来是怕「误人子弟」。

当回复这位仁兄的邮件时,不觉得就发现回复的字数越来越长,于是就将其整理为篇 Blog。我的意图是不仅仅帮忙解决问题,而且能提供个解决类似问题的思路。

邮件原文

来自: Captain
时间: 2010-02-28 20:41
话题: 新手虚心求教

  你好,我是刚刚入门学习Javascript的新手。我想向你请教一下我在学习过程中所
遇到的一个问题。恕我愚昧,但是我一直无法理解,恳请赐教。 
  我在学习中碰到过一条这样的声明: var !myVariable != variableValue, 因为在
以前的学习中知道双重否定等于可定,那这则声明是否可以理解成 var myVariable = 
variableValue ?
       若非如此解释,恳求正解。冒昧打扰请多多包涵。

我的回复

不好意思,收到你的来信到现在才回复。第一眼看见您提供的代码,个人觉得它不合乎语法规则

var !myVariable != variableValue

根据 ECMA 相关的文档,var 关键字的定义在 12.2 章节(我看的是第五版),它的语法定义是:

var VariableDeclarationList ;

而 VariableDeclarationList 包括

VariableDeclarationList , VariableDeclaration

上述两个定义又包含多种情况,说起来有些复杂,所以我画了张草图(可能不准确,以文档为准):

https://friable.rocks/_/2010_03_10/1268192678.png

所以,上面的表达式不符合 var 语句的定义要求,因此 Javascript 解析器会报语法错误。

如果是非赋值定义语句,也就是

!myVariable != variableValue

那么就是个条件判断语句,其中有两个条件判断操作符「非(!)」以及「不等于(!=)」,那么我们就要了解它们的结合优先级。

根据相关的参考文档 ,我们可以得知「非」操作符的优先级比「不等于」要高,因此语句先计算 !myVariable 这块,然后再计算「不等于」后的值。

至于能否改成其他等同的逻辑情况,这里还有个问题就是 值取「非」的时候会有多种情况 ,这里有个讨论:

明城: 
问: !a != b 是否等于 b == !!a

崇厚: 
这个还要看数据类型吧?
比较运算符的优先级是最低的

渔隐: 
照这样推理就是a == b 了

崇厚: 
a = ''
b = 0
console.log(!a != b)
console.log(b == !!a)
true true

明城: 
关键还有个「非」操作符,所以 B 始终是和布尔值对比的

崇厚: 
我试出来三个结果
t t 
t f
f f

痴灵: 
var a = 0;
console.log(!a);console.log(typeof(!a),typeof(a));
true boolean number
类型发生了变化了

渔隐: 
用!== 和===吧

明城: 
不纠结了,以后记得逻辑表达式里千万不要加一元操作符
或者加括号

沉鱼: 
有个比较有效的做法,不太记得操作符的优先级时,我都
加(),这样虽然比较挫,不过保险

崇厚: 
不管记得不记得优先级,表达式比较复杂时最好都加括号
这样看起来清晰一些

举一反三,以后如果再碰到类似的问题,我们可以:

  1. 查文档。 ECMAScript 规范MDC 中的文档 、甚至 Google 都是我们的好帮手
  2. 如果还是无法理解,可以「偷懒」先看运行结果,然后逆向推断
  3. 团队的力量胜过一个人闭门造车

-- EOF --

gdb 命令摘录

http://pic.yupoo.com/feelinglucky/560328f80804/medium.png

最近在了解 Mac 下的 ObjC 开发,所以不可避免的会用到 gdb 。gdb 的命令很多,因此自己便学习边做笔记,然后就有了这份摘录。

总体来讲,Mac OS X 是个很好的开发平台,以前用到的 Linux 下的技术几乎都可以「无痛」得在 Mac 下延续( 了解 Mac 系统到兄弟自然知道其中的原因 )。

所以, 建议开发人员都来尝试熟悉下 Mac OS X 系统

这份摘录可以到这里 下载大图 或者 下载包括原文件的压缩包

http://pic.yupoo.com/feelinglucky/816798f7ef51/medium.jpg

顺便推荐下 NovaMind 这个思维导图软件,虽然是商业版本的但界面以及功能方面的确比同类版本要丰富很多。

-- EOF --

那些被忽视的 PHP 函数(整理)

真的是不用不知道,其实我们熟悉的 PHP 还有很多好东西没有发掘。 看到这篇文章 ,当时就泪奔了好几回,重点推荐下,顺便我自己也做个整理。

sys_getloadavg()

这个函数 返回当前 系统的负载均值信息 (当然 Windows 下不适用),详细文档可以翻阅 PHP 的相关文档。文档中有段示例代码,基本上也就能看出它的用途了。

<?php
$load = sys_getloadavg();
if ($load[0] > 80) {
    header('HTTP/1.1 503 Too busy, try again later');
    die('Server too busy. Please try again later.');
}

PS,如果「很不幸」得你的 PHP 环境中没有这个函数,可以考虑使用下面这段代码 via

if (!function_exists('sys_getloadavg')) {
    function sys_getloadavg()
    {
        $loadavg_file = '/proc/loadavg';
        if (file_exists($loadavg_file)) {
            return explode(chr(32),file_get_contents($loadavg_file));
        }
        return array(0,0,0);
    }
}

这一特性如果使用得当,能减轻服务器部分压力。

pack()

pack 对应的还有个函数为 unpack ,用于压缩二进制串,文中的作者的示例非常清楚

$pass_hash = pack("H*", md5("my-password"));

如果你使用 PHP5,那么可以直接这样子

$pass_hash = md5("my-password", true); // PHP 5+

这样做的好处之一是能减少串存储空间(能节省多少呢?可能又会是另篇文章了)。

这里还有个示例代码可以 pack 数组 via

<?php
function pack_array($v,$a) {
 return call_user_func_array(pack,array_merge(array($v),(array)$a));
}

cal_days_in_month()

该函数 可以直接返回指定月份中的天数,例如

$days = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y")); // 31

我敢保证, 你自己实现过类似功能的函数 :^)

_()

呃, 这的确也是个 PHP 函数 (也有可能是最短的 PHP 内置函数)。_() 是它的「小名」,它的大名是 gettext()

写过 Wordpress 皮肤的朋友会了解 __() 以及 _e() 这些函数,其实 PHP 早已经自带了相关的功能。

// Set language to German
setlocale(LC_ALL, 'de_DE');
 
// Specify location of translation tables
bindtextdomain("myPHPApp", "./locale");
 
// Choose domain
textdomain("myPHPApp");
 
echo _("Have a nice day");

利用 gettext 可以编写多语言的应用,现在您感兴趣的可能就是如何编写 locale 文件,这但已经不是此文涉及的重点, 更多信息可以移步到这里

get_browser()

坦白讲,见到 这个函数 我当时就彻底泪奔。有了这个函数,再也不用自己去分析 $_SERVER['HTTP_USER_AGENT'] 这个字符串了。

更多的信息可以参考这里。在使用此函数前, 你可能需要个 browscap.ini 配置文件 ,相信你可以搞定的。

debug_print_backtrace()

以前查看函数调用堆栈,我会使用 xdebug 等的扩展,其实 PHP5 版本以后已经 内置了相关的函数

顺便再分享个「蛋疼」的小技巧 ,如果你记不住这个函数的名字,可以用这段代码同样能达到目的(看起来还是记住那个函数靠谱):

<?php
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));

natsort()

这个函数用于 自然排序 ,这个大家可能都要用到。贴下相关的文档链接以及示例代码

$items = array("100 apples", "5 apples", "110 apples", "55 apples");
 
// normal sorting:
sort($items);
print_r($items);
    # Outputs:
    # Array
    # (
    #     [0] => 100 apples
    #     [1] => 110 apples
    #     [2] => 5 apples
    #     [3] => 55 apples
    # )

natsort($items);
print_r($items);
    # Outputs:
    # Array
    # (
    #     [2] => 5 apples
    #     [3] => 55 apples
    #     [0] => 100 apples
    #     [1] => 110 apples
    # )

有关自然排序的算法规则,可以 参考这里的文档

glob()

这个 函数的功能 同样让人感到泪奔,先不说功能直接上示例代码

foreach (glob("*.php") as $file) {
    echo "$file\n";
}

相比你已经了解该函数的用途了,那么我们就可以有更多的「玩法」,例如就显示目录( via ):

$dirs = array_filter(glob($path.'*'), 'is_dir');

当然,文件递归你也可以 考虑使用下 SPL 扩展

补充 by 神仙

glob 有个参数选项 GLOB_ONLYDIR 就可以只列目录

PHP Filter

如果你还在正则验证字符串,那么就真的「Out」了。自 PHP5.2 版本以后, 内置了 PHP Fliter 模块 用于专门验证 电子邮件、URL 等是否合法,示例代码:

var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL));

由于是新生的模块,因此还有很多的陷阱,例如

filter_var('abc', FILTER_VALIDATE_BOOLEAN); // bool(false)
filter_var('0', FILTER_VALIDATE_BOOLEAN);   // bool(false)

但这不影响我们去尝试。有关 PHP Filter 的更多信息,相信能拎出来另外写篇文章了。

- Split -

最后,感叹 PHP 其实是个历久弥新的工具,不小心我们就会悲剧性得重复造了只轮子。因此,时常看看 PHP 文档每次都会有新的收获。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章