遍历的是对象的属性,由于数组也是对象,其内部的元素的索引就是其属性值,用该方式遍历数组就是获取了数组中的每一个元素的索引值(从0开始)。
而for of 则是直接遍历集合中的元素值本身。map、set和array都属于iterable类型的数据,都可以用for of来遍历:
var oMap = new Map([['anna',1],['mike',2],['betty',3]]);
for(var x of oMap){
alert(x); //输出每个键值对
}
此外,最好的方式是使用forEach,iterable类型的数据有内置的方法forEach,该方法接收一个参数,每遍历一个元素就调用该方法一次:
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
alert(element);
});
以该种方式遍历在map类型数据中,ele对应值,index对应键。
注意:forEach()方法是ES5.1标准引入的,你需要测试浏览器是否支持。
注意提升的是声明,也就是说通过var 声明的变量在执行到声明语句之前使用了该变量是不会报错的,但是此时无法获取该变量的值,提升的时候并没有把赋值也提升了,该值为undefined,直到执行到该语句为这个变量赋值为止。
将变量和函数都放到一个命名空间中,实际上就是定义了一个空对象,所有的变量和方法都作为该对象的属性和方法:
// 唯一的全局变量MYAPP:
var MYAPP = {};
// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函数:
MYAPP.foo = function () {
return 'foo';
};
3.ES6引入了let用来声明块级作用域内的变量,const来声明常量.
除了修改函数的作用域外(指定this值),还可以改变已有函数的行为,即为已经提供了的函数增加新的定义,例如统计调用了多少次parseInt:
var count = 0;
var oldParseInt = parseInt; // 保存原函数
window.parseInt = function () {
count += 1;
return oldParseInt.apply(null, arguments); // 调用原函数,null表示当做普通调用,不指定this值
};
// 测试:
parseInt('10');
parseInt('20');
parseInt('30');
count; // 3
对数组中每个元素调用function方法,将结果作为新的数组返回,不会改变原来的数组。参数构成和forEach方法类似。
一个函数中包含了闭包,每次调用外部函数,都会生成一个新的内部函数,也就是说闭包在外部函数调用时都是新生成的。
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
如下代码中,参数n绑定了每个i(思考活动对象中存储的内容包括了形参及其值,内部闭包会沿着作用域链找到外部立即执行的匿名函数活动对象中存储的变量值):
function count(){
var f_arr=[];
for(var i=1;i<=3;i++){
var rs=(function(n){
return function(){
return n*n;
}
})(i); //创建匿名函数并立即执行
f_arr.push(rs);
}
return f_arr;
}
闭包可以延迟执行,或者提供了一个可以访问到函数私有变量的入口(闭包携带了状态)。
JSON.stringify(JSobj,replacer,spliter)
replacer(key,value)可以是数组,数组中的元素是转换时要保留的JS对象的属性,也可以是一个函数,该函数对JS对象中的键值做了某些处理后返回,spliter是转换后的缩进等分割。例如:
function convert(key, value) {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
}
var xiaoJson=JSON.stringify(xiaoming, convert, ' ');
JSON对象反序列化为JS对象:
function addClassmate(key, value){
if(key=="name"){
return value+"同学";
}
return value;
}
var xiaoObj=JSON.parse(xiaoJson,addClassmate);
data对象中月份是从0开始的,也就是0表示一月。