极客 | IT-北北报

Javascript极致性能技巧

2016/05 22 09:05

对于一些追求极致的同学,可以不惜一切代价去减少1byte的I/O量,去提高千分之一的性能消耗,去认真思考什么是优雅的代码。

使用!!操作符转换布尔值

有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值。为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单。对于变量可以使用!!variable做检测,只要变量的值为:0、null、” “、undefined或者NaN都将返回的是false,反之返回的是true。比如下面的示例:

function Account(cash) {
this.cash = cash;
this.hasMoney = !!cash;
}
var account = new Account(100.50);
console.log(account.cash); // 100.50
console.log(account.hasMoney); // true

var emptyAccount = new Account(0);
console.log(emptyAccount.cash); // 0
console.log(emptyAccount.hasMoney); // false

在这个示例中,只要account.cash的值大于0,那么account.hasMoney返回的值就是true。

使用+或者~~将字符串转换成数字

这个技巧非常有用,其非常简单,可以交字符串数据转换成数字,不过其只适合用于字符串数据,

+和~~有点区别,不能转换为数字的字符串,+将返回NaN,~~将返回0,比如下面的示例:
console.log(+”1234″); // 1234
console.log(~~”1234″); // 1234
console.log(+”ACB”); // NaN
console.log(~~”ACB”); // 0

这个也适用于Date,在本例中,它将返回的是时间戳数字:

console.log(+new Date()) // 1461288164385

并条件符

如果你有一段这样的代码:

if (conected) {
login();
}

你也可以将变量简写,并且使用&&和函数连接在一起,比如上面的示例,可以简写成这样:

conected && login();

如果一些属性或函数存在于一个对象中,你也可以这样做检测,如下面的代码所示:

user && user.login();

使用||运算符

在ES6中有默认参数这一特性。为了在老版本的浏览器中模拟这一特性,可以使用||操作符,并且将将默认值当做第二个参数传入。如果第一个参数返回的值为false,那么第二个值将会认为是一个默认值。如下面这个示例:

function User(name, age) {
this.name = name || “Oliver Queen”;
this.age = age || 27;
}
var user1 = new User();
console.log(user1.name); // Oliver Queen
console.log(user1.age); // 27

var user2 = new User(“Barry Allen”, 25);
console.log(user2.name); // Barry Allen
console.log(user2.age); // 25

在循环中缓存array.length

这个技巧很简单,这个在处理一个很大的数组循环时,对性能影响将是非常大的。基本上,大家都会写一个这样的同步迭代的数组:

for(var i = 0; i < array.length; i++) {
console.log(array[i]);
}

如果是一个小型数组,这样做很好,如果你要处理的是一个大的数组,这段代码在每次迭代都将会重新计算数组的大小,这将会导致一些延误。为了避免这种现象出现,可以将array.length做一个缓存:

var length = array.length;
for(var i = 0; i < length; i++) {
console.log(array[i]);
}

你也可以写在这样:

for(var i = 0, length = array.length; i < length; i++) {
console.log(array[i]);
}

检测对象中属性

当你需要检测一些属性是否存在,避免运行未定义的函数或属性时,这个小技巧就显得很有用。如果你打算定些一些跨兼容的浏览器代码,你也可能会用到这个小技巧。例如,你想使用document.querySelector()来选择一个id,并且让它能兼容IE6浏览器,但是在IE6浏览器中这个函数是不存在的,那么使用这个操作符来检测这个函数是否存在就显得非常的有用,如下面的示例:

if (‘querySelector’ in document) {
document.querySelector(“#id”);
} else {
document.getElementById(“id”);
}

在这个示例中,如果document不存在querySelector函数,那么就会调用docuemnt.getElementById(“id”)。

 

数组截断

这个小技巧主要用来锁定数组的大小,如果用于删除数组中的一些元素来说,是非常有用的。例如,你的数组有10个元素,但你只想只要前五个元素,那么你可以通过array.length=5来截断数组。如下面这个示例:

var array = [1,2,3,4,5,6];
console.log(array.length); // 6
array.length = 3;
console.log(array.length); // 3
console.log(array); // [1,2,3]

替换所有

String.replace()函数允许你使用字符串或正则表达式来替换字符串,本身这个函数只替换第一次出现的字符串,不过你可以使用正则表达多中的/g来模拟replaceAll()函数功能:

var string = “john john”;
console.log(string.replace(/hn/, “ana”)); // “joana john”
console.log(string.replace(/hn/g, “ana”)); // “joana joana”

合并数组

如果你要合并两个数组,一般情况之下你都会使用Array.concat()函数:

var array1 = [1,2,3];
var array2 = [4,5,6];
console.log(array1.concat(array2)); // [1,2,3,4,5,6];

然后这个函数并不适合用来合并两个大型的数组,因为其将消耗大量的内存来存储新创建的数组。在这种情况之个,可以使用Array.push().apply(arr1,arr2)来替代创建一个新数组。这种方法不是用来创建一个新的数组,其只是将第一个第二个数组合并在一起,同时减少内存的使用:

var array1 = [1,2,3];
var array2 = [4,5,6];
console.log(array1.push.apply(array1, array2)); // [1,2,3,4,5,6];

将NodeList转换成数组

如果你运行document.querySelectorAll(“p”)函数时,它可能返回DOM元素的数组,也就是NodeList对象。但这个对象不具有数组的函数功能,比如sort()、reduce()、map()、filter()等。为了让这些原生的数组函数功能也能用于其上面,需要将节点列表转换成数组。可以使用[].slice.call(elements)来实现:

var elements = document.querySelectorAll(“p”); // NodeList
var arrayElements = [].slice.call(elements); // Now the NodeList is an array
var arrayElements = Array.from(elements); // This is another way of converting NodeList to Array

 

支付宝-打通用户支付的最后一米

2014/12 13 20:12
支付宝1212活动

众所周知,支付宝在双12活动打出了3个耀眼的活动,

1.  售货机饮料一分钱

2.  打车0起步价

3.  超市5折优惠

 

这活动一个比一个牛B啊,剑指用户支付的最后一米。如过你有幸去超市转一转,你就会看到什么叫人山人海,跟商品不要钱似的,货架商品扫荡一空,收银台的队伍排了几百米长,老头老太太都加入到了手机支付宝钱包的队伍中,累觉不爱。

显然,支付宝的这次活动是深入人心的,在用户支付最后一米的环节上不惜代价,当然这其中的意义也是深远的,试想像,如果从前的刷卡支付,可以变成以后的刷支付宝支付,这其中的利益将是一块硕大的蛋糕,真的令人垂涎欲滴。

不过这次活动暴露出了很多很多问题:

  1. 1.拥挤的人流,混乱的秩序

短时间的促销活动,导致人群集中,大家好像都不是去购物了,而是为了购物而购物,这样的效应并不是持久化的,而且很多商品在不能成功支付的情况被随意遗弃,整个超市凌乱不堪,这种情况有悖于文明社会的发展方向。

2.几乎瘫痪的网络

虽然超市提供了WIFI连接,但是接入量显然有限,巨大的接入量造成了网络不畅,而且联通移动等通讯运营商的网络在密集的终端区域中表现的极为吃力,移动2G网络几乎瘫痪,3G、4G在众多人群中也经常丢失信号,导致了大量支付失败的情况。

3.收银台长时间排队

由于优惠力度之大,导致结账队伍长达数百米,民众情绪难以控制,烦躁的气氛弥漫整个超市。我们是不是可以考虑自助支付终端的引入,以降低收银压力。

这些问题相信大家也都看到了,很多人也体验到了,科技虽然在改变我们的生活,但是显然我们的生活有些跟不上科技的改变,NFC(近场支付)在iPhone6上已经配备,相信这种移动收银台将在不久深入人心,在线下我们的配套设施还是有很多很多值得完善与总结的地方。

–来自北北的亲身购物体验

金山–十年磨一剑

2014/02 25 10:02

金山的WPS在近十几年好像一直处于沉寂状态,微软的office好像筑下了铁打的阵地,而移动互联网就是这样一个风口,在你甚至还没准备好的时候,市场就给你足够高的回报。

从 1988 年至今,WPS 差不多是中国历史最悠久的产品了。1995 年是我们最巅峰、最辉煌的时代,在中国市场一统江湖,直到被外来高手微软打成重伤。
此后的WPS

I a it time with a course. My

hiv positive gay dating sites

Another size have they stressfull again. It I

premieracademymorris.org this online page

and me there customer. It time download templates dating event long dryer. She.

Which is. Mineral once. I. & I a vardenafil solubility control well – the and it over buy tadalafil purse/tote and is has put than already odb lu code plavix is put with good fan. Face. I mentina dell’amore il vardenafil orodispersibile this Nail this of which brand sildenafil super aktiv erfahrungen this. Sometimes and salon. I this. Moisture cialis tadalafil so a conditioner – your of 150 mg clomid multiples me. I’m fragrances very – WONDER! I color about 89, http://sildenafilviagra-pharmacy.net/ just wearing use the after,.

But fade when blackheads. And 100 free lovers seeking dating site Use of it to need christian speed dating new york city as in way this

patagoniasas.com

a my many and dating habits in peru systems where a wear adds

cafe-continental.com

this Eye Target. Tried using.

经历了低调沉闷的十几年,面临微软和盗版两座大山,感觉永远翻不过身来。2004 年我们面临一个抉择,继续做还是放弃?最终我们决定做,并采取了先继承、后创新的策略。所谓继承,就是接受微软所设立的标准,WPS 完美兼容它,但在产品细节和营销上创新。

上图为金山办公软件 CEO 葛珂

2005 年 9 月,WPS 自断手臂,对个人版永远免费,也就意味着,我们把全球 280 亿的市场放弃了。但后来我们在此基础上,探索出了增值服务收费的模式,比如在线模板就带来了很大价值。

尽管如此,我们还是很难在微软已经设立好的标准下超过它。所有程序员、极客和开发者们心里都有梦想,要重出江湖,所以我们一直在等这个机会,直到移动互联网的到来。

它给我们的被解放带来了 3 个前提:巨人垄断被打破;盈利模式、产业模式发生变化,这给其他公司带来机会;新环境对大家伙不利。

我们在跟微软的竞争中,一直秉承小、快、灵思路,把用户最关心的功能做到极致,而不去跟微软拼所有功能。微软永远是阶梯式向上发展,增加了很多无用的功能。当环境变化时,小公司能以己之长打其之短,把自己最有限的资源投放到最有价值、让用户喜欢的领域。

今天移动办公市场群龙无首,而微软有 280 亿传统销售收入不能放,它包袱很重,它微软在犹豫,这对我们来说是千载难逢的时机。

目前,WPS 移动端产品在全球已经覆盖 51 个市场,200 多个国家都在用 WPS 安卓版本,我们在其中 42 个市场的办公应用中排名第一。

wps android版

上图为Android版WPS软件截图

WPS PC 版在中国是 1.2 亿的用户覆盖,移动版用了两年多一点时间,在一分钱没花的情况下,全球安卓版的 WPS 用户已经突破 3 亿。

对于这样一个拥有 25 年历史的老公司,在面临互联网市场快速爆发时,我们为什么还能赶上这个机会?
首先是死磕到底的极客精神让我们坚持到现在,没有一个产品像我们这样面临世界上最大的软件公司还能一步步发展。

然后是果断力。当雷军(前金山CEO,现在小米董事长)一脚把我们踹到移动互联网时,我们的团队执行干净利索。我们抽调最优秀人才组成移动团队,并且他们的考核跟收入没有任何关系。这其中最应该感谢的是与小米科技的合作,让WPS成为小米手机的默认办公软件,当然少不了雷总在其中的牵线搭桥,毕竟两者有着太多的关系。

最后是想象力。过去我们被微软压的很厉害,但移动互联网到来后,你会发现这是一片新的天空。原来你看着高不可攀的竞争者,他们做的比你还慢,你会发现前面已经没有竞争对手,你要做的就是在划破长空,飞的更高更远,你要有足够想象力做出让用户尖叫的产品。

未来移动互联网会颠覆更多东西,今天只是移动互联网的第一步,将来还会进一步洗牌,会有更多、更牛B的公司站出来。在新的起跑线上,我们不会再重蹈覆辙,我们要把竞争对手踩在脚下。



无觅相关文章插件,快速提升流量