JavaScript根据函数名字符串调用函数的方法

最近遇到一个问题,JavaScript如何通过函数名的字符串来调用这个函数,到stackoverflow上逛了圈,收获良多,这里总结下:

如果你是要直接调用全局的函数,可以用如下方式:

//定义一个名为foo的函数
function foo() 
{
    alert(1);
}
//第一种调用方式
window['foo']();
//第二种调用方式
eval('foo()');

如果你想要在一个对象里面调用对象自己的属性函数,可以用如下方式:

var test = {
	foo : function(a) {
		alert(a);
	},
	bar : function() {
		var property = 'foo';
		var parameter = ['this is a test!'];
		var fn = this[property];
		if(typeof fn === 'function') {
			fn.apply(this, parameter);
		}
	}
};
test.bar();

上面这段代码是我写的一个小例子,其中的

fn.apply(this, parameter);

有几个好处,第一点就是可以让你调用的foo这个属性函数能够使用到当前的this,如果不用apply是无法调用到当前的this的。第二点就是传递参数变得很自由,如果属性函数需要传入多个参数可以用数组传入。

上面这段小代码就是我在“基于Requirejs和Backbonejs,将Zend Framework 2官方Demo改为RESTful架构的应用”里面做到自动路由分发的核心代码。

IE7和IE6下+=的低效问题

话不多说,看代码

<script>
var getTimeInMs() = function () {
      var date = new Date();
      return date.getTime();
}
//使用+=来连接字符串
var str = "I'm a short string after all.",
      newStr = "",
      appends = 15000,
      stime = getTimeInMs();
      while (appends--) {
            newStr += str;
      }
      alert(getTimeInMs() - stime);
//使用Array.prototype.join来连接字符串
var appends = 15000,
      stime = getTimeInMs(),
      arr = [];
      while (appends--) {
            arr.push(str);
      }
      newStr = arr.join("");
      alert(getTimeInMs() - stime);
</script>

在IE8和所有现代浏览器上,第一段代码会快一点,速度在10ms左右,但是在IE6上,第一段代码执行了2秒还多,后一段执行了40ms,当我把循环次数加大到50000的时候,第一段代码执行了42秒,第二段是110ms。

结论:如果你的用户中有IE6用户,而且有大量的字符串拼接,建议使用Array.prototype.join来处理。

这是为什么呢?以下引用一段文字:

IE7 and earlier use an inferior implementation of concatenation in which each pair of concateated strings always be copied to a new memory location. …. IE7’s naive concatenation algorithm requires that the browser repeatedly copy and allocate memory for larger and larger strings each time through the loop. The result is quadratic running time and memory consumption.

php计算中英文混合或中文字符串的字数

php的strlen和mb_strlen用于统计字符个数。中英文混合的字符串中的中文字符则没有统计进来。所以得自己另想方法统计中英文混合的字符串的字数。以下是我的方法:
先用正则表达式把所有中文替换为空格,就可以用strlen()统计总字数了,总字数就是中文字数与英文字数的总和。
这里的讨论都是在utf-8编码情况下。
统计中文字数并把所有中文替换为空格的正则表达式:

preg_replace(‘/[\x80-\xff]{3}/’, ‘ ‘, $str, -1);

上面的正则表达式基于这样的假设:所以中文字符的utf-8都占3个字节。网上有人说:并不是所有utf-8中文都是3个字节,在0080 – 07FF码段为2字节,在0800 – FFFF码段为3字节。那么是不是用preg_replace(‘/[\x80-\xff]{1,3}/’, ‘ ‘, $str,-1)更合适?
归结起来,统计字符串中英文字数的示例:

$str = 'I am a 中国人!'; 
$str = preg_replace('/[\x80-\xff]{1,3}/', ' ', $str, -1); 
$num = strlen($str);

变量$num的值即为总字数,本例$num的值为11。这种做法,中文标点符号(所有中文特殊符号)也是算在内的。

使用Javascript获得日期

Javascript获取日期可以使用Date对象。如果构造函数不带参数,其默认是获取当前日期。

var myDate=new Date();

Date 对象方法

FF: Firefox, IE: Internet Explorer

方法 描述
Date() 返回当日的日期和时间。
getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getFullYear() 从 Date 对象以四位数字返回年份。
getYear() 请使用 getFullYear() 方法代替。
getHours() 返回 Date 对象的小时 (0 ~ 23)。
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
getTime() 返回 1970 年 1 月 1 日至今的毫秒数。
getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。
getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。
getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。
getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。
getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份。
getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)。
getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)。
getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)。
getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)。
parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数。
setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setFullYear() 设置 Date 对象中的年份(四位数字)。
setYear() 请使用 setFullYear() 方法代替。
setHours() 设置 Date 对象中的小时 (0 ~ 23)。
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。
setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。
setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。
setTime() 以毫秒设置 Date 对象。
setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。
setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。
setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)。
setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。
setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)。
setUTCSeconds() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)。
setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。
toSource() 返回该对象的源代码。
toString() 把 Date 对象转换为字符串。
toTimeString() 把 Date 对象的时间部分转换为字符串。
toDateString() 把 Date 对象的日期部分转换为字符串。
toGMTString() 请使用 toUTCString() 方法代替。
toUTCString() 根据世界时,把 Date 对象转换为字符串。
toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。
toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。
toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。
UTC() 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。
valueOf() 返回 Date 对象的原始值。

参考文献:http://1.sunchunman.sinaapp.com/?p=192

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/?p=128

PHP使用mb_substr()解决中文字符串截取乱码问题

根据百度百科查阅的资料:

string mb_substr( string$str, int$start[, int$length[, string$encoding]] );

mb_substr 执行一个多字节安全的substr()操作基础上的字符数。从str的开始位置计算。第一个字符的位置为0。第二个字符的位置是1,依此类推。

str 被截取的母字符串。

start开始位置。

length 返回的字符串的最大长度,如果省略,则截取到str末尾。

encoding 参数为字符编码。如果省略,则使用内部字符编码。

那么我们可以使用一下的代码,来完成这个问题。

$mess=mb_substr($message,0,19,'gb2312');

gb2312就是中文的编码格式。


当然啦,我也看到了http://blog.onens.com/php-substr.html提供的代码,也是一个不错的解决方法。

PHP 自带几种字符串截取函数,其中常用到的就是 substr 和 mb_substr。前者在处理中文时,GBK 为 2 个长度单位,UTF 为 3 个长度单位,后者指定编码后,一个中文即为 1 个长度单位。

substr 有时会截 1/3 个中文或半个中文,会显示乱码,相对来说 mb_substr 更适合我们使用。不过有时候 mb_substr 就显得不那么好用了。例如我要显示一个小图片的简要信息,5 个中文正好,超过 5 个就截取前4再加上 “…”,这样处理中文是没问题了,可是处理英文或数字,这样截取就太短了。

以下代码是http://blog.onens.com/php-substr.html提供的,我试过是可以使用的:

<?php
/**
 * 字符串截取
 *
 * @author gesion<gesion@163.com>
 * @param string $str 原始字符串
 * @param int    $len 截取长度(中文/全角符号默认为 2 个单位,英文/数字为 1。
 *                    例如:长度 12 表示 6 个中文或全角字符或 12 个英文或数字)
 * @param bool   $dot 是否加点(若字符串超过 $len 长度,则后面加 "...")
 * @return string
 */
class Onens {
    public static function g_substr($str, $len = 12, $dot = true) {
        $i = 0;
        $l = 0;
        $c = 0;
        $a = array();
        while ($l < $len) {
            $t = substr($str, $i, 1);
            if (ord($t) >= 224) {
                $c = 3;
                $t = substr($str, $i, $c);
                $l += 2;
            } elseif (ord($t) >= 192) {
                $c = 2;
                $t = substr($str, $i, $c);
                $l += 2;
            } else {
                $c = 1;
                $l++;
            }
            // $t = substr($str, $i, $c);
            $i += $c;
            if ($l > $len) break;
            $a[] = $t;
        }
        $re = implode('', $a);
        if (substr($str, $i, 1) !== false) {
            array_pop($a);
            ($c == 1) and array_pop($a);
            $re = implode('', $a);
            $dot and $re .= '...';
        }
        return $re;
    }
}

参考文献:http://blog.onens.com/php-substr.html