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

浙公网安备 33010602011771号