var :函數做用域數組
var定義的變量做用域爲包含它函數的局部變量,改變量在函數退出時被銷燬。(因此在函數內部用var定義的變量在函數外部是訪問不到的)markdown
let和const:塊級做用域函數
let和const定義的變量做用域爲包含它的代碼塊。ui
typeof 檢測值 | 返回值 |
---|---|
未初始化、未聲明變量 | undefined |
boolean | boolean |
string | string |
number | number |
object、null | object |
function | object |
symbol | symbol |
typeof
原理:this
js 在底層存儲變量的時候,會在變量的機器碼的低位1-3位存儲其類型信息👉spa
000:對象prototype
010:浮點數code
100:字符串orm
110:布爾對象
1:整數
but, 對於 undefined 和 null 來講,這兩個值的信息存儲是有點特殊的。
null:全部機器碼均爲0
undefined:用 −2^30 整數來表示
因此,typeof 在判斷 null 的時候就出現問題了,因爲 null 的全部機器碼均爲0,所以直接被當作了對象來看待。
每一個 JavaScript 對象均有一個隱式的 proto 原型屬性,而顯式的原型屬性是 prototype。instanceof
原理就是先拿到右邊的prototype屬性,在依次檢查左邊原型鏈上的__prop__屬性,直到有相等的就返回true
,直到null還未找到就返回false
。
將非數值轉換爲數值:
Number()、ParseInt()、ParseFloat()
ParseInt()轉換規則: 從第一個非空格字符開始轉換
,若是第一個轉換的字符不是數值、+、-
則返回naN
,直至字符串末尾,因此空字符串也會返回naN。
ParseFloat()轉換規則: 從第一個非空格字符開始轉換
,若是第一個轉換的字符不是數值、+、-
則返回naN
,直至字符串末尾,因此空字符串也會返回naN,只有第一個小數點是有效的後面的都會忽略。
函數 | 參數 | 參數-->返回值 | true/false | 數值 | null | undefined | 字符串含數值 | 字符串含數值和+、- | 字符串含浮點數 | 字符串含十六進制數 | 空字符串 | 字符串前面的都不含 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Number() | 任何數據類型 | 1/0 | 直接返回 | 0 | naN | 十進制數 | 十進制數 | 浮點數 | 十六進制數 | 0 | naN | |
ParseFloat() | 字符串 | 1/0 | 直接返回 | 0 | naN | 十進制數 | 十進制數 | 浮點數 | 十六進制數 | 0 | naN | |
### 隱式轉換 |
換爲字符串:
toString():null和undefined除外,每一個值都有toString()屬性。
string()轉型函數:null和undefined返回"null"和"undefined",其餘值調用toString()。
用+給一個值加上一個" "
for in 和 for of 的異同點
比較 | for..in | for..of |
---|---|---|
不一樣點 | 能夠遍歷普通對象 遍歷出數組的原型對象 能夠遍歷出數組自身屬性 遍歷出來的值是 key 不能夠遍歷 map/set 不能夠迭代 generators IE 支持 |
不能遍歷普通對象 不會遍歷出原型對象 不會遍歷自身屬性 遍歷出來的值是 value 能夠遍歷 map/set 能夠迭代generators IE 不支持 |
相同點 | 能夠遍歷數組 能夠 break 中斷遍歷 |
能夠遍歷數組 能夠 break 中斷遍歷 |
function myInstanceof (left, right) {
const RigPro = right.prototype
while (true) {
if (left === null) {
return false
}
if (left.__proto__ === RigPro) {
return true
}
left = left.__proto__
}
}
複製代碼
new關鍵字作了什麼:
1.在內存中建立一個新對象
2.將這個新對象內部的__proto__
屬性賦值爲構造函數的prototype屬性。
3.構造函數的內部的this被賦值爲這個新對象(即this指向新對象)
4.執行構造函數內部的代碼(給新對象添加屬性)
5.若是構造函數返回非空對象,則返回該對象;不然,返回剛建立的新對象。
function myNew (func, ...args) {
// myNew函數接收兩個參數:構造函數,構造函數所須要的參數
const newObj = {}
newObj.__proto__ = func.prototype
const obj = func.call(newObj, ...args)
if( ( typeof obj == 'object' || typeof obj == 'function' )&& typeof obj !== 'null' ) {
return obj
}
return newObj
}
function Person(name, age) {
this.name = name
this.age = age
}
const p1 = myNew(Person, 'lili', 18)
console.log(p1);
複製代碼
Object.prototype.myCall = function (context, ...args) {
// 當context爲null或undefined時,將context賦值爲window
context = context || window
// 新建一個fn屬性,用來保存當前調用這個函數的this
context.fn = this
const result = context.fn(...args)
delete context.fn
return result
}
const p1 = {
add: function add (a, b) {
return a + b
}
}
console.log(p1.add.myCall(p1, 1, 2));
複製代碼