1、說一下你對js中的數(shù)據(jù)類型的理解:
js中總共有七種內(nèi)置類型阱飘,這七種內(nèi)置類型可以分為兩大類:基本類型(原始類型 Primitive)和對象類型(Object)斥杜。
基本類型有六種: boolean、null沥匈、undefined蔗喂、number、string咐熙、symbol
其中JS中的數(shù)字都是浮點(diǎn)類型的, 沒有整型弱恒,并且使用的時(shí)候容易出現(xiàn)bug,例如
console.log(typeof NaN === "number"); // true
返回的是true,并且NaN 和自身也是不相等的棋恼。
console.log(NaN === NaN); // false;
console.log(NaN == NaN); // false;
對于基本類型來說,存儲的都是值锈玉,也就是說是沒有函數(shù)可以調(diào)用的,比如爪飘,你輸入 undefined.toString() 會報(bào)錯(cuò),對于基本類型來說拉背,如果使用字面量师崎,那么這個(gè)字面量只是字面量,只有在必要的時(shí)候才會轉(zhuǎn)換為對象類型椅棺。
let a = 111; // 字面量只是字面量 不是number類型
a.toString();// 使用時(shí)候才會轉(zhuǎn)換為對象類型
string 類型是不可變的犁罩,無論你對 string 調(diào)用了何種方法,值都不會改變两疚。
順便說一下床估,JS的 null 是 基本類型,但是使用 typeof 判斷 null 返回的是object 這其實(shí)是一個(gè)由來已久的bug诱渤。一直流傳下來丐巫。
對象(object)是引用類型,當(dāng)我們創(chuàng)建一個(gè)對象的時(shí)候,計(jì)算機(jī)會開辟一塊空間存儲值,變量的名稱存儲的是指針递胧,指向相應(yīng)的內(nèi)存地址碑韵。
當(dāng)我們將對象的值賦值給另外一個(gè)變量的時(shí)候,復(fù)制的其實(shí)是原本變量的地址(指針),當(dāng)我們修改新的變量的值的時(shí)候缎脾,其實(shí)修改的是同一塊內(nèi)存地址的內(nèi)容祝闻,因此兩個(gè)變量的值都會改變。
使用的時(shí)候會再造成深淺拷貝的問題遗菠。也是一道比較經(jīng)典的面試題治筒。(后續(xù)整理)。
let a = { name: 'FE' }
let b = a
b.name = 'EF'
console.log(a.name) // EF
我們再看一個(gè)函數(shù)參數(shù)是對象的情況:
function test(person) {
person.age = 26
person = {
name: 'yyy',
age: 30
}
return person
}
const p1 = {
name: 'yck',
age: 25
}
const p2 = test(p1)
console.log(p1) // -> ?
console.log(p2) // -> ?
分析舷蒲,調(diào)用test方法傳入 p1 ,執(zhí)行到 person.age = 26 這行代碼的時(shí)候
傳入的參數(shù)值被修改耸袜,因此 p1-->
const p1 = {
name: 'yck',
age: 25
}
但是當(dāng)我們?yōu)閜erson 重新賦值一個(gè)對象的時(shí)候,這時(shí)候就出現(xiàn)了問題牲平,所以最后 person 擁有了一個(gè)新的地址(指針)堤框,也就和 p1 沒有任何關(guān)系了,導(dǎo)致了最終兩個(gè)變量的值是不相同的纵柿。
2蜈抓、typeof
涉及的面試題目:
typeof 能夠準(zhǔn)確的判斷類型嗎?instanceof 能夠正確判斷對象的原理是什么昂儒?
typeof 對于原始類型來說沟使,除了null 都可以顯示正確的類型, 使用 typeof 判斷 null 返回 object
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // boolean
typeof Symbol() // 'symbol'
typeof 對于對象來說,除了函數(shù)都會顯示 object,所以說 typeof 并不能準(zhǔn)確的判斷變量到底是什么類型渊跋。
typeof [] // 'object';
typeof {} // 'object';
typeof console.log() // 'function'
如果想要正確的判斷一個(gè)對象的正確的類型,這時(shí)候可以考慮使用instanceof腊嗡,因?yàn)閮?nèi)部機(jī)制是用過原型鏈
來判斷的,在后面的章節(jié)中我們會自己去實(shí)現(xiàn)一個(gè) 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;