昨天寫了本身這三個月以來的面試總結,收到了許多人的喜歡,其實我更多的是把此次找工做看成一個全面複習鞏固的過程,複習資料的獲取一方面是本身總結,另外一方是查看其餘人總結的比較全面的內容,另外若是時間容許的狀況下,仍是很喜歡看書的;javascript
數據類型判斷以及變量聲明在js中是最基礎的了,在基礎內容中,我會標註一些你們容易忽略的點;java
引用類型的大類可分爲Object
類型,進行細分能夠分爲Object、Array、Date、Function
等;面試
正式由於數據存儲方式,因此纔會有了引用類型的身拷貝和淺拷貝;
在js的存儲中,js有兩種的數據存儲方式,基本類型是存儲在棧中,引用類型是存儲在堆中
;數組
基本數據類型存儲在棧內存中,是按照值進行訪問的;瀏覽器
var a = '1'; //變量對象
var b = 3 //變量對象
var str = '我是變量'
複製代碼
當訪問a的時候,會直接進行值的訪問
當變量的值修改的時候,系統會從新爲其賦值,開闢了一個新的空間存儲值,變量名直接等於變量值,而被修改的原始變量值,會在內存回收中進行回收;markdown
引用類型的值保存在堆內存中的對象,值的大小不固定,棧內存中存放地址,指向堆內存只可以的對象,按照引用進行訪問;函數
var obj = {
a:2,
b:33
}
var arr = [
2,3,4
]
複製代碼
js不容許直接訪問堆內存中的位置,所以咱們不能直接操做對象的堆內存空間。在操做對象時,其實是在操做對象的引用而不是實際的對象。爲此,引用類型的值是按引用訪問的。oop
所以 當咱們訪問引用類型的時候,是先找到當前存儲值的地址,而後在經過地址訪問到數據的值;post
變量中的數據發生拷貝的時候,系統會自動爲新的變量分配一個值,最後這些變量都是相互不影響的;測試
var name ='mfy'
var editName = name;
editName = 'yyy'
複製代碼
複製後的值是系統從新分配的,不會影響到原始被複制的值;
引用類型的複製又分爲深複製和淺複製;
此時咱們只說淺複製;
var personalMsg ={
name:'mfy',
age:22,
offer:'fy'
}
var clonePer = personalMsg;
personalMsg.name = 'yyy'
複製代碼
當咱們在使用某些數據變量時候,會自動發生一些類型的轉換;js自己爲弱類型,一般在使用的時候,不當心就會出現類型轉換;
1+'2' // '12'
1+3+'3' // '43'
'3'+1+2 //'312'
2+1+false // 3
2+1+true // 4
3+1+{a:2} // 4[object Object]
複製代碼
+在字符串使用會當成連接符號,而-則是直接進行類型轉換
1-'2' // -1
1+3-'3' //1
'3'+1-2 // 29
2+1-false // 3
2+1-true // 2
3+1-{a:2} // NaN
複製代碼
1 == 1 //true
2. x 、y 類型不相同
1=='1' //true
1==true //true
複製代碼
3.存在對象比較時候
1 =={a:3} //false
1 == {valueOf:()=>{return 1}} //true
複製代碼
存在對象時候,若是對象無valueOf屬性,則直接比較
主要用於基本數據類型比較,包含基本數據類型
對於null 是瀏覽器一直存在的這個問題
typeof null //"object"
複製代碼
typeof判斷引用類型,判斷引用類型的時候失效了
console.log(
Object.prototype.toString.call(null),'\n', //[object Null]
Object.prototype.toString.call(11),'\n', // [object Number]
Object.prototype.toString.call(false),'\n', // [object Boolean]
Object.prototype.toString.call('333'),'\n', // [object String]
Object.prototype.toString.call([3,4,2,2]),'\n', // [object Array]
Object.prototype.toString.call({a:3,b:44}),'\n', // [object Object]
Object.prototype.toString.call(new RegExp('.*?')),'\n', //[object RegExp]
Object.prototype.toString.call(new Promise((resolve,reject)=>{resolve(2)})),'\n', //[object Promise]
)
複製代碼
此方式可以判斷出不論是引用類型仍是基本類型都可以判斷出來
此方式可以判斷的是原型鏈上的連接關係
function Super (){
this.name = 'myyu'
}
let superNew = new Super();
console.log(superNew instanceof Super) //true
console.log(superNew instanceof Object) //true
console.log(superNew instanceof Array) //false
複製代碼
比較常見的就是
function myInstanceof(left,right){
if(!right || !left) return false;
//左側的實例進行查找
let pro = left.__proto__;
//獲取右側的原型
let prototype = right.prototype;
while(pro){
if(pro == prototype){
return true
}
pro = pro.__proto__;
}
return false;
}
複製代碼
判斷數組
Array.isArray([1,2,3]) //判斷是不是數組
isNaN(333) //false
isNaN(underfined+1) //true
複製代碼
做用域知識很是重要,內容比較多,這裏只簡單說起,具體的內容後續補充
console.log("全局1:"+golbalA)
var golbalA = 5;
console.log("全局2:"+golbalA)
複製代碼
var 定義聲明的變量是能夠進行變量提高的,所以第一個打印出undefind
console.log("全局1:"+golbalA)
var golbalA = 5;
console.log("全局2:"+golbalA)
function a (){
console.log(golbalA)
}
a()
複製代碼
全局定義的變量在函數中若是無同名的變量也能夠訪問;
console.log("全局1:"+golbalA)
var golbalA = 5;
console.log("全局2:"+golbalA)
function a (){
var golbalA =2222
console.log(golbalA)
}
a()
複製代碼
console.log("全局1"+letA)
let letA = "global";
console.log(letA)
複製代碼
直接告訴咱們不可以進行使用,在變量未初始化以前
let letA = "global";
console.log(letA) //global
function a(){
console.log(letA)//global
}
a()
複製代碼
let letA = "global";
console.log(letA)//global
function a(){
let letA = 'function'
console.log(letA) //function
}
a()
複製代碼
if(true){
let globala = 'globala'
var globalb = 'globalb'
}
console.log('globala',globala)
console.log('globalb',globalb)
複製代碼
此時就是用let定義在塊級做用域的變量,沒法在塊級之外進行修改;而var是能夠的;
暫時性死區是常常忽略的問題,
var a =222
if(true){
a = 33;
let a =44
}
複製代碼
const a = 3333;
console.log(a)
a= 444
複製代碼
由const定義的變量是沒法進行更改的
const a;
console.log(a)
複製代碼
const定義的基礎類型是沒法修改的,可是定義引用數據類型的時候;
const obj ={
a:22,
b:444
}
console.log(JSON.stringify(obj) )
obj.a = 'mayy'
console.log(JSON.stringify(obj) )
複製代碼
if(true){
a=3;
const a=5
}
複製代碼
變量提高其中能夠去排列組合測試下🥳🥳
null
和undefined
的區別typeof、instanceof
instanceof
實現隱式轉換
和強制轉換
暫時性死區
的含義以及生成方式let
、const
生成的做用域區間let 、const
使用方式js隱式類型轉換 《javascript 高級程序設計(第四版)》