js整理解析(原题在https://juejin.im/post/5df643246fb9a016214cceae#heading-1)
1.js数据类型有七种包括:
- undefined
- null
- string
- boolean
- number
- symbol(ES6)
- Object
2.let关键字和var关键字的声明前不同
function sayHi(){ console.log(name); console.log(age); var name="aa"; let age =12; } sayHi(); //undefined ,RefenceError
这里要说一点,因为使用var关键字会使变量提升,var name 会跑最前面去,此时执行顺序为
var name; console.log(name); console.log(age); name ="aa"; let age = 12; 而let关键字并不会存在这个情况,所以它会报错显示VM12326:5 Uncaught ReferenceError: Cannot access 'age' before initialization;
3.let关键字和var关键字的作用域不同及setTimeout()的执行机制;
for(var i=0;i<3;i++){ setTimeout(()=>console.log(i),1); } for(let i=0;i<3;i++){ setTimeout(()=>{ console.log(i); },1) }
//3,3,3
//0,1,2
setTimeout()是以异步的方式执行的。在执行for循环的时候,并不是执行一次for循环就立刻执行一次setTimeout(),而会让setTimeout()进入另一条线程进行等待,当主线程函数执行完后,setTimeout()再依次执行。
在var中执行的时候:
因为var是没有块级作用域的,所以在for循环中声明的i会存在于函数作用域中。每一次for循环就会声明一次i,但后面声明的变量会覆盖前面声明的变量。所以当for循环执行完后(此时setTimeout()还未被执行),函数作用域中的i的值就变成2了
而setTimeout()所在的线程中是这样的:
//第一次进栈 setTimeout(()=>{ console.log(i); }); //第二次进栈 setTimeout(()=>{ console.log(i); });
4.对象键值
const a ={}; const b ={key:'b'}; const c={key:'c'}; a[b]=123; a[c]=456; console.log(a[b])
//456
为什么打印出来的结果是456呢,因为在a[b]的时候由于b是一个对象,便会解析成
a[b]=123 ==> a[Object,Object]=123,
然后又再赋值覆盖了前面的123
a[c]=456 ==> a[Object,Object]=456
所以打印出来的结果是456
5.++a与a++的区别
// let number = 0; // console.log(number++); // console.log(++number); // console.log(number);
//0 2 2
比如说
let number = 0; number++; console.log(number) //1; //这个是先进行加1然后输入打印为1
let number = 0; console.log(number++);
//0;
//这个是先进行计算number++后再console.log()打印
++number ++在前自增一,
number++ ++在后要通过其他条件来增加
比如
for(var number=0; number<3;number++){}
6.call()方法改变this指向与apply()类似
call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性; 作用 call()方法和apply()方法的作用相同:改变this指向。 区别 他们的区别在于接收参数的方式不同: call():第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。在使用call()方法时,传递给函数的参数必须逐个列举出来。 apply():传递给函数的是参数数组 如下代码做出解释: function add(c, d){ return this.a + this.b + c + d; } var o = {a:1, b:3}; add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16 add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34
let obj1= { name:'obj1_name', print:function(){ return ()=> console.log(this.name) } } let obj2={name:'obj2_name'} obj1.print()() obj1.print().call(obj2) obj1.print.call(obj2)()
// obj1_name obj1_name obj2_name