这是一个段落
第二个段落
(不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak))
1) 全局变量引起的内存泄漏
一个未声明变量的引用会在全局对象中创建一个新的变量。在浏览器的环境下,全局对象就是 window。
function func(){
a=123; //a为全局变量,不会被回收
}
等价于
function func(){
window.a=123; //a为全局变量,不会被回收
}
为了防止这种错误的发生,可以在你的 JavaScript 文件开头添加 'use strict'; 语句
2)闭包引起的内存泄漏
(function(){
var a=123;
return function(){ console.log(a) };
})()
3)定时器或回调函数引起的内存泄漏
当不需要setInterval或者setTimeout时,定时器没有被clear,定时器的回调函数以及内部依赖的变量都不能被回收,造成内存泄漏。
function func(){
var i=0;
var timer=setTimeout(function(){
console.log(i++);
},1000);
}
func();
4)dom清空或删除时,事件未清除导致的内存泄漏
$('#container').bind('click', function(){
console.log('click');
}).remove();
// zepto 和原生 js下,#container dom 元素,还在内存里jquery 的 empty和 remove会帮助开发者避免这个问题
$('#container').bind('click', function(){
console.log('click');
}).off('click').remove();
//把事件清除了,即可从内存中移除
Number对象、String对象、Array对象、Date对象、Math对象、正则表达式对象、Function对象。
测试地址:http://xxx.xxxx.xx/kt?channelid=123&name=xiaoming&age=23
方法一:
function getURL(){
var URL = window.location.href; //获取地址栏的地址
var arg = URL.split('?');
if(arg[0] == URL){ //无参数
return "";
}
//对?后面的参数进行处理
var arr = arg[1].split('&');
var params = {};
for(var i = 0;i< arr.length;i++){
var p = arr[i].split('=');
params[arg[0]] = p[1];
}
return params;
}
var url = getURL(); // obj
console.log(url['age']); // 打印结果:23
方法二:
function getUrlParam(name){
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = decodeURIComponent(window.location.search).substr(1).match(reg);
if (r!=null) return unescape(r[2]);
return null;
}
console.log(getUrlParam('age')); //打印结果:23
注意:String类型有两种生成方式
1) var str1 = "hello"; -> typeof(str)== "string"
2) var str2 = new String("hello"); -> str.constructor == String
function checkStr(str){
return typeof(str)== "string" || str.constructor == String;
}
(1)在html元素事件属性中使用,如:
(2)构造函数
function classA(color){
this.color=color;
}
(3)input点击,获取值
(4)apply()/call()求数组最值
var nums = [3,12,6,21,-16 ];
var maxNum1 = Math.max.apply(this, nums);
console.log(maxNum1); // 21
var maxNum2 = Math.max.call(this, 3,12,6,21,-16);
console.log(maxNum2); // 21
$(this) 返回一个 jQuery 对象,你可以对它调用多个 jQuery 方法,比如用 text() 获取文本,用val() 获取值等等。
而 this 代表当前元素,它是 JavaScript 关键词中的一个,表示上下文中的当前 DOM 元素。你不能对它调用 jQuery 方法,直到它被 $() 函数包裹,例如 $(this)。
$.ajax({
url:'请求地址',
type:'get', //或者method:'get',
dataType:'json',
data:data,
success:function(){},
error:function(){}
});
function trim(str) {
if (str && typeof str === "string") {
return str.replace(/(^\s*)|(\s*$)/g,""); //去除前后空白符 或者/^\s+|\s+$/g
}
}
var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;
var email = "[email protected]";
console.log(reg.test(email)); // true
定义和用法:
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。Ajax 是一种用于创建快速动态网页的技术。Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。
优点:
1) 减轻服务器的负担,按需取数据,最大程度的减少冗余请求
2) 局部刷新页面,减少用户心理和实际的等待时间,带来更好的用户体验
3) 基于xml标准化,并被广泛支持,不需安装插件等,进一步促进页面和数据的分离
缺点:
1) AJAX大量的使用了javascript和ajax引擎,这些取决于浏览器的支持.在编写的时候考虑对浏览器的兼容性.
2) AJAX只是局部刷新,所以页面的后退按钮是没有用的.
3) 对流媒体还有移动设备的支持不是太好等
AJAX的工作原理:
1) 创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))
2) 判断数据传输方式(GET/POST)
3) 打开链接 open()
4) 发送 send()
5) 当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行回调函数
共同点:这两种事件都代表的是页面文档加载时触发。
异同点:
load 事件的触发,表示页面包含图片等文件在内的所有元素都加载完成。
ready 事件的触发,表示文档结构已经加载完成(不包含图片等非文字媒体文件)。
创建新节点:
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点
添加、移除、替换、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替换
insertBefore() //插入
查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值
getElementById() //通过元素Id,唯一性
复制节点
cloneNode() 复制节点并返回复制的节点
node.cloneNode(true|false) ; //默认是 false。
参数设置为 true,克隆节点及其属性,以及后代;设置为 false,克隆节点本身
如下:
这是一个段落
第二个段落
/*--------------------------结果
当参数为true时,结果如下:
这是一个段落
第二个段落
这是一个段落
第二个段落
当参数为false时,结果如下:
这是一个段落
第二个段落
冒泡事件:父级和子级绑定了同样的事件的时候,触发了子级,同时也会把父级同样的事件触发。
阻止事件冒泡(在子级加):
1) return false
2) e.stopPropagation()
阻止默认行为(如a的跳转):
1) return false
2)e.preventDefault()
事件委托就是利用事件冒泡原理,把处理任务委托给父元素或者祖先元素(通常用父元素),我们通过目标对象来判断事件源,并执行事件处理。
1)定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。
2)表现形式:使函数外部能够调用函数内部定义的变量。
例子:
var aa=(function(){
var i=0;
return function(){
alert(i);
i++;
}
})();
aa(); //0
aa(); //1
aa(); //2
3)使用闭包的注意点
1)滥用闭包,会造成内存泄漏:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)会改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
var arr=['h','e','l','l','o','2',1,2,1,3,2];
var quchong=[];
for(var i=0; i
其他js数组去重方法可参考另一篇博客:https://blog.csdn.net/qq_41638795/article/details/82965874
原理是这样的,不同的对象在底层都表示为二进制,在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型, null 的二进制表示是全 0,自然前三位也是 0,所以执行 typeof 时会返回“ object ”。
这个bug是第一版Javascript留下来的。在这个版本,数值是以32字节存储的,由标志位(1~3个字节)和数值组成。标志位存储的是低位的数据。这里有五种标志位:
最低位有一位,那么标志位只有一个1字节长度;或者是零位,标志位有3个字节长度,多出两个了字节,一共多出四种类型。
有两个特殊的数值: