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

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);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值