call和apply都是function原型上的方法,用来改变this的指向
// call传参是一个一个传 // 参数的个数不固定 fn.call(obj, 10, 20 ,30) // apply传参是已数组的形式传 // 参数是固定的 fn.apply(obj, [10, 20, 20]) // 参数的个数3个以内2个性能差不多,3个以上call性能好 let arr = [10, 20, 30], obj = []; function fn(x, y, z){} fn.apply(obj, arr); fn.call(obj,...arr); // console.time 可以测试出一段程序的执行时间 console.time("A"); for (let i = 0; i < 1000000000; i++) {} console.timeEnd("A");处理方案:
把所有需要延迟加载的图片用一个盒子包起来,设置宽高和默认占位图开始让所有的img的src为空,把真实图片的地址放到img的自定义属性上,让img隐藏等到所有其他资源都加载完成后,我们再开始加载图片对于很多图片,需要当页面滚动时,当前图片区域完全显示出来以后再加载真实图片==进行比较的时候,如果左右两边数据类型不一样,则先转换为相同的数据类型,然后在进行比较
{} == {} 两个对象进行比较,比较的是堆内存地址
null == undefined 是相等的 ,null === undefined 不相等
NaN == NaN 不相等,NaN和谁都不相等
[12] == “12” 对象和字符串比较,是把对象toString()转换为字符串后再进行比较
剩余所有情况在进行比较的时候,都是转换为数字(前提数据类型不一样)
对象转数字:先转换成字符串,然后再转换为数字
字符串转数字:只要出现一个非数字字符,结果就是NaN
布尔转数字:true->1 false->0
null转数字0
undefined转数字NaN
// a等于什么可以打出ok var a = ?; if(a == 1 && a == 2 && a == 3){ console.log("ok") } // ======方式1========= var a = { n:0, toString: function(){ return ++this.n } }; if(a == 1 && a == 2 && a == 3){ console.log("ok"); } // ======方式2========= var a = [1,2,3]; a.toString = a.shift if(a == 1 && a == 2 && a == 3){ console.log("ok"); } // ======方式3========= Object.defineProperty(window, 'a', { get: function(){ this.value ? this.value++: this.value = 1; return this.value; } }); if(a == 1 && a == 2 && a == 3){ console.log("ok"); }