1)真伪数组转换
真伪数组的意思不在解释了很简单 真数组就是array 对象的 都是伪数组
那么我们怎么区分真伪数组?
1)真数组长度可变
2)伪数组不可以变
3)真数组可以使用数组方法 伪数组不可以 比如((.forEach))
我们先做真数组转伪数组
var temp1=[1,2,4,4,5,6,7];
var obj1={};
[].push.apply(obj1,temp1);
console.log(obj1);
[].push.apply(obj1,temp1)的意思 是temp1的内部元素依次取出 存入obj1
伪数组转真数组
// 伪数组转换成真数组 这个方法在IE8和以下不好用
var temp={0:'ss',1:"222",length:2};
var obj=[];
[].push.apply(obj,temp);
console.log(obj);
//IE8支持(推荐)
var obj2= [].slice.call(temp);
console.log(obj2);
用[].push.apply(a,b)也可以转换 但是IE8一下不支持 所以
用 var b =[].slice.call(a)
slice:是截取用的
splice:是做删除 插入 替换用的
3)怎么区分判断真伪数组?
//怎么区分真伪数组?
console.log( typeof temp1);//object
console.log( typeof temp); //object
console.log( temp1.toString());//1,2,4,4,5,6,7
console.log( temp.toString()); //[object Object]
//获得对象类型 意思是把对象.toString方法里的this转成temp1
console.log(({}).toString.apply(temp1));//[object Array]
({}).toString.apply(temp1) 这个方法是把对象的类型返回回来
先知道怎么用 以后再去感觉原理
2)我们在时候JQ的时候 一般都用过$(function(){}) 入口函数 和JS的 window.onload作用是一样的
那么Jq的是怎么实现的那 他们的作用是什么?
入口函数的的原理是 当界面标签加载完 在执行一个function() 那么 我们的问题是怎么知道HTML加载完了? HTML标签是什么? 当然是Document了 那方法属性肯定都在DOM里
1)DOMContentLoaded 事件就是IE8以上版本 中DOM加载完的实现 下面的代码可以替代window.onload
//DOMContentLoaded事件 只要DOM元素加载完就会实现这个代码
//只支持高级浏览器 IE8 以上 与onload平级
document.addEventListener("DOMContentLoaded",function()
{
var div = document.querySelectorAll("div");
console.log(div);
})
2)IE8以下因为没有DOMContentLoaded 事件和 AddEventlistener 所以我们用下面代码
1)attachEvent 和onreadystatechange 支持IE8 以下版本
2)document.readyState 这个版本都支持 它就是判断DOM是否加载完毕的属性 下面是它的四个状态
uninitialized - 还未开始载入
loading - 载入中
interactive - 已加载,文档与用户可以开始交互
complete - 载入完成
// onreadystatechange事件专门用于监听 document.readyState属性的改变
document.attachEvent("onreadystatechange",function()
{
if(document.readyState=='complete'){
var div = document.querySelectorAll("div");
console.log(div);
}
Jq那么自己实现入口函数的完整的代码 就是
ready:function(fu)
{
if(document.readyState=='complete')
{
//如果加载完毕 执行这个方法
fu();
}else if(document.addEventListener)
{
//DOMContentLoaded事件 只要DOM元素加载完就会实现这个代码
//只支持高级浏览器 IE8 以上 与onload平级
document.addEventListener("DOMContentLoaded",function()
{
//如果加载完毕 执行这个方法
fu();
})
}else
{
//IE8以下
document.attachEvent("onreadystatechange",function()
{
if(document.readyState=='complete'){
//如果加载完毕 执行这个方法
fu();
}
})
}