Lu-yeom / mentor-program-5th-self-learning

0 stars 0 forks source link

week16(2021/7/26~2021/8/1) #13

Open Lu-yeom opened 3 years ago

Lu-yeom commented 3 years ago

日期:110年7月26日20:30~22:00
進度:[JS201] 進階 JavaScript:那些你一直搞不懂的地方


課程筆記:

一、變數的資料型態

二、如何知道變數的型態?

三、null是object的bug

四、如何更詳細的知道變數的型態?
console.log(Object.prototype.toString.call())

五、另一種常見用法

if (typeof a !== 'undefined') {
  console.log(a)
}
Lu-yeom commented 3 years ago

日期:110年7月27日20:00~22:30
進度:[JS201] 進階 JavaScript:那些你一直搞不懂的地方


課程筆記:

一、== 與 === 的差別

二、變數的生存範圍

三、從 Hoisting 理解底層運作機制

test()

但會回傳 test is not a function, 是因為以上程式碼分成兩個步驟  

var test test() test = function() { console.log(123) }


  * 因為test 是 undefined。賦值不會提升,宣告會提升  
Lu-yeom commented 3 years ago

日期:110年7月28~29日
進度:[JS201] 進階 JavaScript:那些你一直搞不懂的地方


課程筆記:

一、hoisting的順序

test()

// 得 undefined,預設的值就是 undefined。

function test(a) { console.log(a) var a = 456 console.log(a) } test(123)

// 得 123 , 得 456


二、hoisting 的原理  

var a = 1; function test(){ console.log('1.', a); var a = 7; console.log('2.', a); a++; var a; //有跟沒有是一樣的,並不會變成 undefiend inner(); console.log('4.', a); function inner(){ console.log('3.', a); a = 30; b = 200; } } test(); console.log('5.', a); a = 70; console.log('6.', a); console.log('7.', b);

答案會是:
  * 1.undefined => 因為 hoisting
  * 2.7
  * 3.8 => 因為 inner() 裡面沒有 a,只有被賦值 30,所以必須往上找 test() 裡面最後一個 a = 8 (a++)
  * 4.30 => 因為 inner() 裡面的 a 最後被賦值 30
  * 5.1
  * 6.70
  * 7.200 => b = 200 會被渲成全域變數  
原理在於:  

VO: { a: 123, b: function, c: undefined }

function test(a,b) { function b() {} var c = 30 }

test(123)


* 補充教材 - [我知道你懂 hoisting,可是你了解到多深?](https://github.com/aszx87410/blog/issues/34)  
Lu-yeom commented 3 years ago

日期:110年7月30日~8月1日
進度:[JS201] 進階 JavaScript:那些你一直搞不懂的地方


課程筆記:

一、Closure
所有的函式都是閉包:談 JS 中的作用域與 Closure

二、物件導向基礎與 prototype

// ES5  
function Dog(name) {
  this.name = name
}

Dog.prototype.getName = function() {
  return this.name
}

Dog.prototype.sayHello = function() {
  console.log(this.name)
}

var d = new Dog('abc')
d.sayHello()

var b = new Dog('123')
b.sayHello()
// ES6  
Class Dog {
  constructor(name) {
    this.name = nam
  }
  getName() {
    return this.name
  }
  sayHello() {
    console.log(this.name)
  }
}

var d = new Dog('abc')
d.sayHello()

var b = new Dog('123')
b.sayHello()

三、從 prototype 來看「原型鍊」

// ES5
function Dog(name) {
  this.name = name
}

Dog.prototype.getName = function() {
  return this.name
}

Dog.prototype.sayHello = function() {
  console.log(this.name)
}

var d = new Dog('abc')
console.log(d.__proto__ ===  Dog.prototype)

四、new到底做了什麼?

function Dog(name) {
  this.name = name
}

Dog.prototype.getName = function() {
  return this.name
}

Dog.prototype.sayHello = function() {
  console.log(this.name)
}

var b = newDog('sdfdfh')
b.sayHello()
console.log(b.getName())

function newDog(name) {
  var obj = {}
  Dog.call(obj, name)
  obj.__prototype__ = Dog.prototype
  return obj
}