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

 
posted @ 2019-12-25 15:43  旧崖  阅读(633)  评论(0编辑  收藏  举报