一.== vs ==在做判斷時,如果對比雙方的類型不一樣的話,就會進行類型轉換 假如我們需要對比 x 和 y 是否相同,就會進行如下判斷流程: 首先會判斷兩者類型是否相同。相同的話就是比大小了 類型不相同的話,那麼就會進行類型轉換 判斷兩個類型是否為string 和number,是的話就將strin ...
==在做判斷時,如果對比雙方的類型不一樣的話,就會進行類型轉換
假如我們需要對比 x
和 y
是否相同,就會進行如下判斷流程:
-
首先會判斷兩者類型是否相同。相同的話就是比大小了
-
類型不相同的話,那麼就會進行類型轉換
判斷兩個類型是否為string 和number,是的話就將string轉換為number類型再判斷
2 == '4' ↓ 2 == 4
判斷其中一方是否為 boolean,是的話就會把 boolean
轉為
number 再進行判斷'2' == true ↓ '2' == 1 ↓ 2 == 1
View Code判斷其中一方是否為 object 且另一方為 string number ,是的話就會把 object 轉為原始類型再進行判斷
'1' == { name: 'laolarou' }
↓
'1' == '[object Object]'
=== 則就是判斷兩者類型和值是否完全相同
二.閉包
什麼是閉包
我的理解就是閉包就是能夠讀取其他函數內部變數的函數,閉包存在的意義就是讓我們可以間接訪問函數內部的變數
function A() { var a = 1 window.B = function () { console.log(a) } } A() B() // 1
之前前端部門面試的一個問題, 解決迴圈中var的問題 答出2種以上方案
第一種 給匿名函數傳參
var arr = []; for (var index = 0; index < 5; index++) { arr[index]=function (index) { return index; }(index); }
第二種 閉包方式
for (var index = 0; index < 5; index++) { arr[index]=(function (index) { return function() { return index; }; }(index)); } console.log(arr[2]());
第三種使用let方式解決
for (let index = 0; index < 5; index++) { arr[index]=index; } console.log(arr[2]);
淺拷貝與深拷貝
淺拷貝的時候如果數據是基本數據類型,那麼就如同直接賦值那種,會拷貝其本身,如果除了基本數據類型之外還有一層對象,那麼對於淺拷貝而言就只能拷貝其引用,對象的改變會反應到拷貝對象上;但是深拷貝就會拷貝多層,即使是嵌套了對象,也會都拷貝出來。
原型與原型鏈
如何理解原型與原型鏈
原型
在 JavaScript 中,每當定義一個對象(函數也是對象)時候,對象中都會包含一些預定義的屬性。其中每個函數對象都有一個prototype 屬性,這個屬性指向函數的原型對象
let person={age:12,name:"laonarou"};
console.log(person);
當我們列印的時候發現多了一個__proto__ 屬性,每個js對象都有這個屬性,這個屬性指向原型,這個屬性是瀏覽器用來使用的,可以在瀏覽器列印位置找到 constructor ->prototype
原型鏈
__proto__
和constructor
每一個對象數據類型(普通的對象、實例、prototype......)也天生自帶一個屬性proto,屬性值是當前實例所屬類的原型(prototype)。原型對象中有一個屬性constructor, 它指向函數對象。