一. 基础
1.for in,for of和forEach
遍历的是对象的属性,因为数组也是对象,其内部的元素的索引就是其属性值。用该方式遍历数组就是获取了数组中的每一个元素的索引值(从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标准引入的,你须要測试浏览器是否支持。二. 函数
1.变量声明提升
注意提升的是声明。也就是说通过var 声明的变量在运行到声明语句之前使用了该变量是不会报错的。可是此时无法获取该变量的值。提升的时候并没有把赋值也提升了,该值为undefined,直到运行到该语句为这个变量赋值为止。
2.解决命名冲突的办法
将变量和函数都放到一个命名空间中。实际上就是定义了一个空对象,全部的变量和方法都作为该对象的属性和方法:
// 唯一的全局变量MYAPP:var MYAPP = {};// 其它变量:MYAPP.name = 'myapp';MYAPP.version = 1.0;// 其它函数:MYAPP.foo = function () { return 'foo';};
3.ES6引入了let用来声明块级作用域内的变量,const来声明常量.
4.apply的使用方法
除了改动函数的作用域外(指定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
5.Array.map(function(arg){})
对数组中每一个元素调用function方法,将结果作为新的数组返回。不会改变原来的数组。
參数构成和forEach方法相似。
6.闭包
一个函数中包括了闭包,每次调用外部函数,都会生成一个新的内部函数。也就是说闭包在外部函数调用时都是新生成的。
返回闭包时牢记的一点就是:返回函数不要引用不论什么循环变量,或者兴许会发生变化的变量。
假设一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的參数绑定循环变量当前的值,不管该循环变量兴许怎样更改。已绑定到函数參数的值不变:
例如以下代码中。參数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;}
闭包能够延迟运行,或者提供了一个能够訪问到函数私有变量的入口(闭包携带了状态)。
三. 标准对象
1.JSON
- 把一个JavaScript对象转换成JSON对象:
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);
2.Date对象
data对象中月份是从0開始的,也就是0表示一月。