無標題文檔

Web 开发人员的 SEO 小抄

有时候不得不承认,在编写具有语义和标准的 HTML 同时,也会考虑到 SEO 方面的因素 -- 即便很多时候它是出于商业目的。

https://friable.rocks/_/2008_07_09/1215567853.png

这篇 SEO 小抄也是无意间获得,里面的内容虽然期前可能或多或少的接触过,但总结下还是非常的收益, 感谢原作者

在这里 ZIP 打包下载

最后,我的个人观点就是不要因为 SEO 而去 SEO,过了某个度反而可能会适得其反。

Javascript 每日测试 - 第四期

这期的测试内容非常的有趣,下面慢慢的道来。题目是

var price = 100;
function doSomething() {
    var doublePrice = price * 2;
    var price = 200;
    var halfPrice = price / 2;

    alert(doublePrice);
    alert(halfPrice);
}
doSomething();

请问两个 alert 弹出值分别是多少?

不要轻易相信自己的判断,建议将这段代码放到浏览器运行下,相信结果会感到非常的意外 -- 答案是 doublePrice 是 NaN、halfPrice 是 100 。

会很奇怪为什么会是这样的结果,小虎 同学的解释为,「第一行 price 被下面的 var price 重新定义,所以它是未定义的」。代码可以认为如下:

var price = 100;
function doSomething() {
    var price;
    var doublePrice = price * 2;
    price = 200;
    var halfPrice = price / 2;

    alert(doublePrice);
    alert(halfPrice);
}
doSomething();

理解这个问题,要理解 Javascript 的作用域。已经存在一个全局变量 price, 按照其他语言的情况,doublePrice = 全局 price 变量 2;而事实上,Javascript 会先检查函数内部变量作用域,上述的代码中 doSomething() 内部也有个同名的 price 变量。于是 doublePrice = 内部 price 变量 2 (小马总结)。

某个变量如果未声明(没有 var)而直接使用,那在它的第一次被调用的作用域里(子作用域里不算)。只要有一个地方对其进行了声明,那它就属于该作用域,否则它的作用域会是上一级(直上到顶层) -- form 圆心 。

因此,需要注意 Javascript 这个特性。首先,得意识到「全局变量是魔鬼,大型的项目随着发展,(如果考虑不周全)变量的命名很有可能和函数中的临时变量同名」,建议适度使用闭包避免此问题。

其次在函数中,尽量把要用到的变量名写在函数的顶部。「这点也需要注意下的就是,虽然 Javascript 没有块作用域,但为了清晰起见,该在块里定义的变量,个人觉得还是在块里定义比较好」 -- form 玉伯 。

最后,再用 玉伯 的一道题结束本文:

 看看下面的代码,运行结果是什么?

function test() {
    alert(」test function 1″);
}

test();

function test() {
    alert(」test function 2″);
}

详细信息请 参见这里

--EOF--

Javascript 每日测试 - 第三期

现在每日的 Javascript 提问时间,已经成为了部门前端开发人员的下午茶。这次的问题是:

请问下面的代码会弹出 true or false ?
<script type="text/javascript">
    var n1 = 0.1;
    var n2 = 0.2;
    var n3 = 0.4;
    var n4 = 0.8;

    alert((n1+n2+n3+n4) === (n1+n2)+(n3+n4));
</script>

https://friable.rocks/_/2008_07_07/1215423870.png

这是个很「诡异」的问题。乍看之下应该都是 true,不过「现实是残酷的」,这段代码在各浏览器中的运行结果如上图。

下面的解释还是能让人接受的:「简单来说就是二进制的浮点数难以正确处理十进制的小数」。

其实浮点数的精度问题,在大部分的开发语言中都能碰到(原谅我绝对了)。比如 PHP 中执行

<?php
    $a = 0.100000000000000000000000000000001;
    var_dump($a + 0.000000000000000001 == $a + 0.000000000000000002);
?>

以及 Java 中运行这样的代码

public static void main(String[] args) {
    System.out.print(0.1 + 0.2);
}

也会出现类似的问题(虽然例子可能有点极端,不过已经能够说明问题)。

那么,该如何解决该问题?「解铃还需经理人」,小马 同学在讲解答案的时候,给出了部分解决代码

Math.formatFloat = function(f, digit) {
    var m = Math.pow(10, digit);
    return parseInt(f * m, 10) / m;
}

alert(Math.formatFloat(0.1 + 0.2, 1));  // 0.3

玉伯的补充:

关于精度问题,一般涉及到小数点时,如果不是0.5, 0.25 这种反复乘以 2 会等于 1 的小
数,其它小数都无法无二进制精确表示,由此造成了误差。比如 10 进制的 0.1, 用二进
制表示是 0.0001100110011001100110...........  无限循环了。

对于进制方面更深一层的了解,请 参阅这里

那么,下面的测试

alert((0.1 + 0.2 + 0.4 + 0.8)    === ((0.1 + 0.2) + (0.4 + 0.8))); // 已经知道是false
alert((0.1 + 0.2 + 0.4 + 0.8)    === ((0.1 + 0.8) + (0.2 + 0.4)));    
alert((0.25 + 0.75 + 0.05 + 1.0) === (0.25 + (0.75 + 0.05) + 1.0));
alert((0.25 + 0.75 + 0.05 + 1.0) === ((0.25 + 0.75) + (0.05 + 1.0)));
alert((0.25 + 0.75 + 0.05 + 1.0) === ((1.0 + 0.75) + (0.05 + 0.25)));

其它的 alert 结果是什么?

我的照片

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

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

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

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

分类

搜索

文章