关于JavaScript你可能不知道的事 1 - 5
来源:互联网 发布:华为云计算业务运营部 编辑:程序博客网 时间:2024/05/29 23:45
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);
- 关于JavaScript你可能不知道的事 1 - 5
- 关于xargs,你可能不知道的
- 关于startActivityForResult你可能不知道的
- 关于iPhone,你可能不知道的
- 关于Google你可能不知道的10件事
- 关于static你可能不知道的事
- 关于PHP你可能不知道的10件事
- 关于PHP你可能不知道的10件事
- 关于PHP你可能不知道的10件事
- 关于PHP你可能不知道的10件事
- 关于邵逸夫:你可能不知道的8件事
- 关于Go,十件你可能不知道的事
- 关于Java你可能不知道的10件事
- 关于Promise:你可能不知道的6件事
- ES6 你可能不知道的事
- ES6 你可能不知道的事
- Java你可能不知道的事系列1
- 你可能不知道的
- 维护项目的管理策略案例
- .NET 下的多线程
- cmake与autoconf+automake的对比
- java一行一行写入或读取数据
- SQL Server 2008 R2 性能计数器详细列表(一)
- 关于JavaScript你可能不知道的事 1 - 5
- Python 网络编程测试-Parser初探
- glGenBuffersARB 运行时访问冲突
- 内存映射
- centos 安装,配置memcached
- MFC改变对话框中静态文本的字体大小
- DOS 命令打开文件及网页
- X264结构体中的变量解释
- EBS中取profile值的用法