记录个人的一些些笔记!!!

 

自己常用的 电脑 快捷键

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请求,比如处理文件等等。

 

posted on 2021-03-06 19:01  Zero前端  阅读(57)  评论(0)    收藏  举报

导航