写代码,些功能,最重要的是思路,不同的问题,解决办法有很多种,要多看别人的代码,多总结,同时也要了解更多的js代码概念,这样代码才能越写越少,越来越健壮,可复用。
演变史:为了减少全局变量,创建了很多局部变量,为了调用局部变量就出现了闭包,闭包多了,就出现了插件,为了 管理插件就出现了前端框架。 可调用其他函数内部的变量、方法 可调用其他函数内部的局部变量
元素绑定事件,元素销毁,事件还占内存 用事件委托,将事件绑定到父级元素上。
str.replace(RegExp, function(match, key) { 辅助
//match: 匹配项,key: 匹配位置
return 'result'; //返回要替换的内容
});
typeof 判断变量所属类型,所以不能区分 Arry, Object, Null;
// 可以分别出对象的所属的原型,能够区分 Arry, Object, Null
Object.prototype.toString.call(obj);
重点是可以改变当前this所指的上下文, apply 可传入一组变量 bind是绑定,不立即执行
最初创建的是对象Object; obj = {},定义系列的基础方法和属性, 然后实例化的时候是 A = Object.create(obj), 定义新的属性的同时又可以调用原型obj的属性, 也就是当调用 A中没有的属性时,会通过原型链,去A的原型对象 obj中寻找对应的方法,
相对的是面向对象的编程模式, 最初创建的是方法,function, fun = function(){}, 通过this定义方法和属性, 将基础方法定义到 fun的原型上是避免重复创建,也利用了prototype链式调用,
new 和 create 的区别
new 是 b.proto == a.prototype create 是 b.proto == a
window.location.href = location.href + ‘&time=’+((new Date()).getTime());
function copyToClipboard(id) {
// 获取复制内容
var content = document.getElementById(id).innerHTML;
// 创建元素用于复制
var aux = document.createElement("input");
// 设置元素内容
aux.setAttribute("value", content);
// 将元素插入页面进行调用
document.body.appendChild(aux);
// 复制内容
aux.select();
// 将内容复制到剪贴板
document.execCommand("copy");
// 删除创建元素
document.body.removeChild(aux);
//成功提示
alert("复制成功!");
}
reduce 参数:回调函数,回函数首次调用的首个参数。 回调函数三个参数,前一项,当前项,当前项索引,
返回值:从左到右开始缩减,最终只有一个返回值
map, filter, forEach 回调函数有三个参数:当前项,当前项索引,遍历的数组
区别:
map 是将回调函数 return 的值作为返回数组的值 filter 则是将执行 return ture 的 当前项 作为返回数组的值 forEach 只遍历处理,没有返回值
some 遍历判断数组中是否存在满足条件的项 存在 停止遍历返回true
return true 可终止遍历
every 遍历判断数组中是否每一项都满足条件 有不满足 停止遍历返回false
return false 终止遍历
lastIndexOf 反向遍历,找最后出现某项的位置 没找到 返回-1(不支持函数) indexOf 正向遍历,找最先出现某项的位置 没找到 返回-1(不支持函数)
页面留存,返回上一页类似页签切换,也就是说返回不会有任何变化,不会重新加载,不是读的缓存
页面缓存,返回上一页的时候相当于读取初始状态的缓存,js会执行,但是dom不会变,