关于JavaScript你可能不知道的事 1 - 5

来源:互联网 发布:华为云计算业务运营部 编辑:程序博客网 时间:2024/05/29 23:45
1. var关键字声明的变量的作用域是整个函数.

var bar = 'global';function foo () {    console.log(bar); // ==> undefined    var bar = 'local';    console.log(bar); // ==> local}foo();

按照我们的想法, 第一行应该打印global才对. 但是, 事实上, 因为var的作用域是整个函数, 而不是只作用于其后的内容, 所以,我们的函数定义其实和下面的这个定义是等价的

function foo () {    var bar;    console.log(bar);    bar = 'local';    console.log(bar);}

这件事请告诉我们, 最好把var语句都放在函数的顶部, 这样可以避免不必要的误解, 以便增加程序的可读性.

ps:

function foo () {    for (var s=0, i=0; i<10; i++) {        for (var j=0; j<10; j++) {            s = i*j;        }    }    console.log(s); // ==> 81}foo();

以上代码中, s是在for循环内生成的,但并不妨碍它的作用域, 它的作用域还是整个函数.

2. 作用域链



3. || 运算符

|| 的求解顺序是从左至右的. 并且, 如果左边的值为真, 那么整个式子的值就一定是真了. 因此它不会再向右求解.

比如

var i = 1;i || ++i;console.log(i); // ==> 1++i || i;console.log(i); // ==> 2

在对 i || ++i 这个表达式求值时, 系统会从左到右求解, 因此会先看到i, i为1, 转换成布尔值为真. 因此整个表达式的值为真, 也因此, 不会再执行++i.

|| 表达式还有一个特征, 它返回的值不一定是真或者假, 而是构成表达式的因子的值. 看代码你就明白了.

console.log(42 || [1,2]); // ==> 42

实际上, || 运算符完全等价于以下函数

function _or_ (a, b) {    if (a) {        return a;    } else {        return b;    }}
我知道你不相信,但是你可以实验一下.

于是我们的一些代码就可以写的比较顺畅了. 比如缺省参数, 要达到我们的目的可以这样写:

function sayTo(who) {    if (!who) {        who = 'Xiaochi';    }    ...}

但有更简洁也更易读的方式:

function sayTo(who) {    who = who || 'Xiaochi';    ...}

ps:

&& 运算符就相当于

function _and_ (a, b) {    if (a)        return b;    else        return a;}

4. 数组的length可写

给数组的length赋值, 如果值小于当前值, 将会切断数组, 如果大于当前值, 将会扩充数组.
我不知道这个知识点有什么用...

var a = [1];a.push(23);console.log(a); // ==> [1, 23]a.length = 5;console.log(a); // ==> [1, 23, undefined, undefined, undefined]

5. 将参数转化为数组

有的时候希望将函数转化为数组对象, 这样就可以利用数组对象的各种方便的方法了.方式如下:


var argsArray = [].slice.apply(arguments);



原创粉丝点击