1. var关键字声明的变量的作用域是整个函数.
按照我们的想法, 第一行应该打印global才对. 但是, 事实上, 因为var的作用域是整个函数, 而不是只作用于其后的内容, 所以,我们的函数定义其实和下面的这个定义是等价的
这件事请告诉我们, 最好把var语句都放在函数的顶部, 这样可以避免不必要的误解, 以便增加程序的可读性.
ps:
以上代码中, s是在for循环内生成的,但并不妨碍它的作用域, 它的作用域还是整个函数.
2. 作用域链
待
3. || 运算符
|| 的求解顺序是从左至右的. 并且, 如果左边的值为真, 那么整个式子的值就一定是真了. 因此它不会再向右求解.
比如
在对 i || ++i 这个表达式求值时, 系统会从左到右求解, 因此会先看到i, i为1, 转换成布尔值为真. 因此整个表达式的值为真, 也因此, 不会再执行++i.
|| 表达式还有一个特征, 它返回的值不一定是真或者假, 而是构成表达式的因子的值. 看代码你就明白了.
实际上, || 运算符完全等价于以下函数
于是我们的一些代码就可以写的比较顺畅了. 比如缺省参数, 要达到我们的目的可以这样写:
但有更简洁也更易读的方式:
ps:
&& 运算符就相当于
4. 数组的length可写
给数组的length赋值, 如果值小于当前值, 将会切断数组, 如果大于当前值, 将会扩充数组.
我不知道这个知识点有什么用...
5. 将参数转化为数组
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);