记录个人的一些些笔记!!!
自己常用的 电脑 快捷键
Win + R 打开 cmd 运行窗口
Win + L 锁桌面
Win + D 快速显示桌面
Win + table / Alt + table 快速切换窗口
Win + E 打开资源管理(自己电脑本地盘)
Ctrl + Shift + Esc 快速打开任务管理器
Ctrl + Shift + N 快速创建一个文件夹
Ctrl + Alt + . 打开安全窗口
检查数据类型方法
1.typeof
console.log(typeof ""); //string
console.log(typeof 1); //number
console.log(typeof true); //boolean
console.log(undefined); //undefined
console.log(typeof null); //注意,用typeof 检查null时候为obj,不准确
console.log(typeof {}); //obj
console.log(typeof []); //obj
2.instanceof
console.log("1" instanceof String); // false
console.log(1 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log({} instanceof Object); // true
console.log([] instanceof Object); // true
console.log(function(){} instanceof Object); // true
console.log(null instanceof Null); // 报错
console.log(undefined instanceof Undefined); //报错
3.constructor
console.log(("1").constructor == String); //true
console.log((1).constructor == Number); //true
console.log((true).constructor == Boolean); //true
console.log(({}).constructor == Object); //true
console.log(([]).constructor == Array); //true
console.log((function(){}).constructor == Function); //true
console.log((null).constructor == Null); //报错
console.log((undefined).constructor == Undefined); //报错
4.prototype (Object.prototype.toString.call())
console.log(Object.prototype.toString.call("1")); // [object String]
console.log(Object.prototype.toString.call(1)); //[object Number]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
console.log(Object.prototype.toString.call({})); //[object Object]
console.log(Object.prototype.toString.call([])); //[object Array]
console.log(Object.prototype.toString.call(function(){})); //[object Function]
5.引入Jquery 用$.type()
$.typle("1"); //[object String]
$.typle(1); //[object Number]
$.typle([]); //[object Array]
$.typle(undefined); //[object Undefined]
$.typle(null); //[object Null]
”=“代表赋值
"=="与"==="的区别
== 代表相同,先检查两边数据类型是否相同,如果相同,进行比较,如果不相同,可以进行数据转换再比较
例如:(1 == 1)返回true,(1 == "1")返回true
=== 代表严格相同,数据类型相同,进行比较,如不相同,直接返回false
例如:(1 === 1)返回true,(1 === "1")返回false
闭包的理解:
//1.正常情况下 外部是拿不到test()里的a的值
function test(){
var a = 1;
}
console.log(a); //报错,undefined
//运用闭包可以获取值,如下代码:
function test01(){
var a = 1;
return function(){
console.log(a);
}
}
var rusult = test01();
rusult(); // 输出1
i++ 与 ++i
i++是先赋值后加
++i是先加后赋值
例子1:
var i = 0;
var eg = i++;
console.log(i) ; // 1
console.log(eg) ; // 0
例子2:
var i = 0;
var eg = ++i
console.log(i); //1
console.log(eg); //1
闭包 a++ 面试题
function fun(){
var a = 0;
return function(){
console.log(a++);
}
}
var f1 = fun(),f2 = fun();
//console.log(f1);
//f1(); // 输出0
//f1(); // 输出1
//f2(); // 输出0
/普通函数
function fun2(){
var a = 0;
console.log(a++);
}
//fun2(); //输出0
//fun2(); //输出0
function test02(){
var a = 99;
return function(e){
a += e;
console.log(a);
}
}
var f1 = test02(),f2 = test02();
f1(1); //100
f1(1); //101
f2(1); //100
面试题:
var a=0,b=0;
function A(a){
A = function(b){
alert(a + b++);
}
alert(a++);
}
A(1); //输出1
A(2); //输入4
解释:
当第一次调用A时,执行到console.log(a++)时,a已经完成了自加,此时a的值为2,但是a++的值为1;
当第二次调用A时,A重新被赋值,而且是新的函数引用,
由于标识符A是在全局作用域定义的,所以在函数内部被重新赋值,在全局作用域也可以访问到重新赋值后的函数。
此时,也创建了一个闭包,该闭包保存了创建环境的活动对象。
此时活动对象:{ a: 2 },同时,根据传入的数值2,确定 b = 2,b++值为3。
执行到 console.log(a + b++),故而输出4
A(2)=4
面试题 闭包问题
for(var i=0; i<10; i++){
setTimeout(function(){
console.log(i);
},1000)
}
答案是输出(10个10) 10 10 10 10 10 10 10 10 10 10
解释:第二个for循环,定时器里有回调函数。等于是一个异步任务,异步任务是只有等执行栈中同步任务执行完毕后才可以执行异步,因为js最大的特性就是单线程。
当for循环同步任务结束后,此时i的值是10。for循环了10次,等于就是要调用10次这个回调函数,有10个异步任务在异步队伍列表里面等待,等执行栈同步任务执行
完毕再执行,这10个任务就是log这个i变量。此时的i是10所以就是10个10
for(var i=0; i<10; i++){
setTimeout(
console.log(i)
)
}
答案是输出(0-9) 0 1 2 3 4 5 6 7 8 9
解释:第一个for循环每次遍历的i是全局变量,setTimeout里面没有回调函数,等于都是同步,你log输出就是0到9
call()和apply(),bind()
1.调用函数没区别
function fun4(){
alert("我是fun函数");
}
//fun4();
//fun4.call();
//fun4.apply();
//var f1 = fun4.bind();
//f1();
2.可以修改上下文的this指向
function fun5(){
alert(this);
}
var obj = {};
//fun5(); //上面的this指向window
//fun5.call(obj); //上面的this指向是 Object
//fun5.apply(obj); //上面的this指向是 Object
//var f1 = fun5.bind(obj);
//f1();
function fun6(){
alert(this.name);
}
var obj1 = {name:"obj1"};
var obj2 = {name:"obj2"};
//fun6.call(obj2);
//fun6.apply(obj1);
//var f1 = fun6.bind(obj2);
//f1();
var obj3 = {
name:"obj3",
sayName:function(){
alert(this.name);
}
};
//obj3.sayName.apply(obj3);
//obj3.sayName.call(obj3);
//var f1 = obj3.sayName.bind(obj3);
//f1();
//apply(),call()区别
var obj4 = {
name:"obj4",
sayName:function(){
alert(this.name);
}
};
function fun7(a,b){
console.log("a=" + a);
console.log("b=" + b)
}
//fun7.call(obj4,2,3);
//fun7.apply(obj4,[2,3]);
//var f1 = fun7.bind(obj4,2,3);
//f1();
/*总结:
* call(),apply(),bind()共同点:
* 功能都是相同,改变this的指向
* call(),apply(),bind()区别
* 1.call,apply都是立即执行函数,而bind是调用返回原函数,需要再调一次,有点类似闭包的味道
* 2.call,apply传递参数形似不同()
*
*/
//浏览器隐形给我们传两个参数,第一个是this,第二个是arguments
//arguments 是保存实参的,即使你不定义形参,它是类数组,有长度,也可操作数据
function fun8(){
//console.log(arguments.length); //2
//console.log(arguments[0]); // hello
//console.log(arguments[1]); // true
}
fun8("hello",true);
var 常见面试题
var a = 99;
fun1();
console.log(a); //99
function fun1(){
console.log(a); //undefined
var a = 10;
console.log(a); //10
}
输出结果为:
undefined
10
99
解析:声明一个函数会提升到作用域顶部:
即理解为:
function fun1(){
console.log(a); //向外(上)找,找不到a,因此为undefined
var a = 10;
console.log(a); //前面定义了a并赋值10了,因此为10
var a = 99;
fun1();
console.log(a); //前面定义了a,并赋值了99,因此为99
//var 与 let 区别
js中只有全局与局部作用域,用var定义全局变量,局部可以访问,定义局部变量,全部访问不到,还有定义函数会函数会提升到作用域的顶部
不用var定义的变量会使变量提升(到全局作用域)
1.let 块级作用域
{
let i = 1;
}
console.log(i); //报错
2.let 不能在同作用域重复声明
let a = 0;
let a = "hello"; //会报错
3.let适合for循环,用它声明的变量不会发生改变,不受外界影响
面试题:实现一个函数,判断是不是回文字符串
补充:回文字符串:aabaa是, aadcc不是,即从左边读或从右边读都一样的是回文。
function run(arry){ //简写2行代码搞定
if(typeof arry !== 'string' ) return false;
return arry.split('').reverse().join('') === arry
}
var a = run('aadcc') //false,如果为aacaa则为true
//下面不简写,则写判断语句,写得多
function test(arry){
if(typeof !== 'string'){
return false;
}else{
if(arry.split('').reverse().join('') === arry ){
return false;
}
}
}
var a = test('aabcc'); //false
面试题:
请列出三种以上减少页面加载时间的方法
1.优化图片,可使用精灵图,雪碧图等,即把所用到的图片合并到一起,通过样式写定位去获取图片
2.可以选用图片的格式,可使用gif格式的,因为提供的颜色比较少
3.优化css,可使用压缩css,如{margin-top;margin-left......}
4.减少http请求,可使用合并文件等
5.标明高度和宽的,浏览器解析会计算大小,影响速度,当标明高宽度,即使图片不显示,但会腾一个位置出来,然后加载内容,体验更好。
回调函数
定义:回调函数就是一个参数,只不过是把这个函数作为参数传到另一个函数里面去,但那个函数执行完后,再去执行传进去的那个函数,这过程叫做回调。
回调:就是回头调用的意思,主函数的事先干完,回头再调用传进来的那个函数。
举一个例子:
就好比说你送女朋友回家,当送到了楼下,你会留那么一句话,当你走到家发一条信息给我,你留的话作为参数函数(到家发信息给我),女朋友走回家的动作是主函数,她
必须走到家(即执行完主函数),然后再发信息给我(即回调函数),最终你就接收到信息
代码如图:

输出结果:

结论:
主函数A先执行,然后去执行callback回调函数,最终结果是先输出主函数,在输出回调函数内容,
所以说,主函数不用等callback执行完再往下执行,它会先执行完自己的代码,这也是异步操作
一般回调函数都用在耗时操作上面,比如ajax请求,比如处理文件等等。
浙公网安备 33010602011771号