涉及面試題:原始型別有哪幾種?null 是物件嘛?
在js中,存在著6中原始值,分別是:
typeof string // "function"
typeof string // "undefined"
typeof "string" // "string"
除了會在必要的情況下強轉型別以外,原始型別還有一些坑。
最為明顯的就是js的0.1 + 0.2 !== 0.3
的精度小數問題了.
另外對與null
來說,很多人會認為他是個物件型別,其實他是錯誤的,雖然typeof null
會輸出object
,但是這只是js存在的歷史悠久bug.在js的最初版本中使用的是32位系統,為了效能考慮,使用低頻儲存變數的型別資訊,000
開頭表示物件,然而null
表示為全零,所以他錯誤的判斷為object
.雖然現在內部型別判斷**已經改變了,但是這個bug卻一直流傳了下來.
涉及面試題:物件型別和原始型別的不同之處?函式引數是物件會發生什麼問題?
在js中除了,除了原始型別,其他就是物件型別了.物件型別和原始型別不同的是,原始型別儲存的是值,物件型別儲存的是位址(指標),當你建立了乙個物件型別的時候,記憶體會開闢乙個空間來存放值,但是我們需要找到這個空間,這個空間會擁有乙個位址(指標).
const a =
對於常量a
來說,假設記憶體位址為#001
,那麼在位址(指標)#001
上存放了值
,常量a
存放了位址(指標)#001
,再看下面的**:
const a =
const b = a
b.push(1)
當我們將變數賦值給另乙個變數時,其實賦予的是原本變數的位址(指標),也就是說變數b
存放的位址(指標)是#001
,所以我們進行資料修改時,修改的是位址(指標)#001
下面的值,因而位址的值改變了,所以兩個變數的值都發生了變化.
console.log(a) ---[1]
console.log(b) --[1]
接下來我們看函式引數是物件的變化情況
function test(person)
return person
}const p1 =
const p2 = test(p1)
console.log(p1) // -> ?
console.log(p2) // -> ?
對於以上**:
涉及面試題:typeof 是否能正確判斷型別?instanceof 能正確判斷物件的原理是什麼?
typeof
對於原始型別來說,除了null
都可以正確顯示型別
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof symbol() // 'symbol'
typeof
對於物件來說,除了函式都會顯示object
,所以說typeof
並不能準確判斷變數到底是什麼型別.
如果我們想判斷乙個物件的準確型別,這時候可以用instanceof
,因為內部機制是通過原型鏈來判斷的.
const person = function() {}
const p1 = new person()
p1 instanceof person // true
var str = 'hello world'
str instanceof string // false
var str1 = new string('hello world')
str1 instanceof string // true
對於原始型別來說,你想直接通過 instanceof 來判斷型別是不行的,當然我們還是有辦法讓 instanceof 判斷原始型別的
class primitivestring
}console.log('hello world' instanceof primitivestring) // true
你可能不知道symbol.hasinstance
是什麼,其實就是自定義乙個instanceof行為的東西,以上這段**,就等同於typeof 'hello world' === 'string'
,所以結果自然就是true了
涉及面試題:該知識點常在筆試題中見到,熟悉了轉換規則就不懼怕此類題目了
在js轉化型別中,基本為
轉化型別大致**如下:
在條件判斷時,除了undefined、null、0、-0、false、nan
,其他所有值都會為true,包括所有物件.
物件在轉原始型別時會呼叫內建的[[toprimitive]]
函式,對於該函式來說,演算法邏輯來說一般如下:
lat a = ,
tostring(),
[symbol.toprimitive]()
}1 + a = // =>3
加法運算子不同於其他運算子,具備以下特點:
1 + 『1』 // 11
true + true // 2
4 + [1,2,3] // 41,2,3
如果你對答案有疑問的?,請看下面解釋:
對於加法還需要注意 這類表示式'a' + + 'b' // => 'anan'
首先我們先執行+ 'b'
,嘗試把字串'b'
轉換成數字,結果失敗了,轉化不了真實的數字,返回nan
,所以得到答案anan
那麼對於除了加法的運算子來說,只要其中一方是數字,那麼另一方就會被轉為數字
4 * '3' // 12
4 * // 0
4 * [1, 2] // nan
涉及面試題:如何正確判斷 this?箭頭函式的 this 是什麼
普通函式
function foo()
var a = 1
foo()
const obj =
obj.foo()
const c = new foo()
簡單對上面例子進行分析,
箭頭函式
function a()
}}console.log(a()()())
對於箭頭函式來說,是沒有this指向的,this永遠指向外層的this,所以包裹箭頭函式的a()函式的this就是函式內部的this,此處指向window,另外對箭頭函式使用bind這類函式是無效的
function fruits() {}
fruits.prototype =
}
banana =
var func = function(arg1, arg2) ;
呼叫如下:
func.call(this, arg1, arg2);
獲取陣列中的最大值和最小值
var numbers = [5, 458 , 120 , -215 ];
maxinnumbers = math.max.call(math,5, 458 , 120 , -215); //458
bindvar bar = function()
var foo =
bar(); // undefined
var func = bar.bind(foo);
func(); // 3
這裡我們建立了乙個新的函式 func,當使用 bind() 建立乙個繫結函式之後,它被執行的時候,它的 this 會被設定成 foo , 而不是像我們呼叫 bar() 時的全域性作用域。 JS 基礎知識點及常考面試題(一)
分為6個基本型別 number,string,boolean,null,undefine,symble 陣列,物件,函式 typeof 基本型別 typeof出了null,判斷為object,其他均能正確判斷 引用型別 函式判斷為function,其他均為object instanceof 內部機制...
js基礎知識點(一)
js原始型別有哪幾種 null是物件嗎?boolean number null undefined string symbol 另外對於null來說,很多人會認為他是個物件型別,其實這是錯誤的。雖然typeof null會輸出object,但是這只是 js 存在的乙個悠久 bug。在 js 的最初版...
JS基礎知識點
1.js基本資料型別 number 數字型別 string 字串 boolean 布林型別 ture false 非0即為真 null 空值 有值,值為空 undefined 未定義的 沒有值 object 物件型別 array 陣列 js語言特點 1.解釋性執行,指令碼語言 2.物件導向 一切事物...