JS基礎(chǔ)變量、數(shù)據(jù)類型

1.語(yǔ)言基礎(chǔ)

變量,類型,聲明。

數(shù)組,對(duì)象,集合,hash

while if else switch do...while for forEach

< > <= + - | & || &&

JS的基礎(chǔ)類型判斷

JS有哪些內(nèi)置數(shù)據(jù)類型?

7種

- number

- string

- boolean

- null?

- undefined

- symbol

- object

number,string,boolean,null,undefined 為基本類型;

object 包含 function,array,date等。

如何做類型判斷?

typeof

console.log(typeof 5)// number

console.log(typeof undefined)// undefined

console.log(typeof 'wzj')// string

console.log(typeof true)// boolean

console.log(typeof Symbol())//symbol?

console.log(typeof {})// object

console.log(typeof null)// object

console.log(typeof [])// object

console.log(typeof (()=>{}))// function

console.log(typeof new Date())// object

總結(jié):

- typeof 會(huì)把 null 判斷成 object

- typeof 可以判斷除了 null 以外的基本類型;

- typeof 對(duì)于非基本類型,只能判斷出 symbol,function,其他都是object;

數(shù)組也會(huì)判斷成object。

instanceof 判斷

使用 a instanceof b 判斷,實(shí)際上是看 a 的原型鏈上是否存在 b 的構(gòu)造函數(shù)。

JS

function Person(name){

? ? this.name = name;

}

const p = new Person('wzj');

console.log(p instanceof Person);//true

但是基本類型不能這樣處理。console.log(10 instanceof Number) //false

console.log(new Number(10) instanceof Number)//true

手寫(xiě)實(shí)現(xiàn)一個(gè)instanceof

const myInstanceof = (left,Right) => {

? ? if(typeof left !== 'object'){

? ? return false

}

while(true){

? ? if(left === null){

? ? ? ? return false

????}

????if(Right.prototype === left._protp_){

? ? ? ? return true

????}

????left = left._proto_;

????}

}

Object.prototype.toString 判斷,萬(wàn)能方法

JS

console.log(Object.prototype.toString.call(1)); //[object Number]

console.log(Object.prototype.toString.call('wzj')); //[object String]

console.log(Object.prototype.toString.call(undefined)); //[object undefined]

console.log(Object.prototype.toString.call(true)); //[object Boolean]

console.log(Object.prototype.toString.call({})); //[object Object]

console.log(Object.prototype.toString.call([])); //[object Array]

console.log(Object.prototype.toString.call(function(){})); //[object Function]

console.log(Object.prototype.toString.call(null)); //[object Null]

console.log(Object.prototype.toString.call(Symbol('wzj'))); //[object Symbol]

JS類型轉(zhuǎn)換

為什么會(huì)有隱式轉(zhuǎn)換, JS 本身是一種弱類型語(yǔ)言,我們不用提前聲明好類型,程序運(yùn)行時(shí),類型會(huì)自動(dòng)分配。

console.log(1 + 1);//2

console.log(1 + '1');// '11'

console.log(1 + undefined);// NaN

console.log(1 + null);//1

console.log(1 + true);//2

console.log(1 + false);//1

console.log(1 + '');//'1'

console.log(1 + []);// '1'

console.log(1 + 'wzj');// '1wzj'

總結(jié):

- 當(dāng)使用 + 運(yùn)算符計(jì)算string和其他類型時(shí),都會(huì)轉(zhuǎn)換為 string 類型。(另外的值轉(zhuǎn)成字符串)

- 除以上情況外,會(huì)轉(zhuǎn)成number 類型,但是 undefined 會(huì)轉(zhuǎn)成 NaN,結(jié)果也是 NaN

- 當(dāng) + 號(hào)兩邊存在NaN,則結(jié)果為NaN(not a number)

- Infinity +?Infinity? 為?Infinity ,Infinity + -Infinity? 為NaN

- 如果 string 相加,直接拼接

- 如果 + 號(hào)兩邊,有一個(gè)是對(duì)象,則調(diào)用 valueof() 或 toString()

- 其他情況都會(huì)轉(zhuǎn)換成 number類型

對(duì)象在進(jìn)行轉(zhuǎn)換基本類型時(shí),會(huì)調(diào)用對(duì)象上的valueof() 或 toString() 方法,該方法的返回值為基本類型的結(jié)果。內(nèi)置有一個(gè)函數(shù) toPrimitive.

console.log(typeof NaN) // number

如何得到一個(gè)NaN

console.log(0/0) //NaN

console.log(Infinity + (-Infinity)) //NaN

console.log(Infinity -Infinity) //NaN

console.log(Infinity/ -Infinity) //NaN

console.log(Infinity + Infinity) //Infinity?

網(wǎng)紅題

can (a == 1 && a == 2 && a == 3) ever evalute to true ?

(a == 1 &&? a == 2 && a == 3)怎么能讓以上為true?

答:

const a = {

? ? value:1,

? ? toString:function(){

? ? ? ? return a.value ++?

????}

}

console.log((a==1 && a == 2 && a == 3)

另一種解法

let value = 0;

Object.defineProperty(global,'a',{

? ? get:function(){

? ? ? ? return ++value

????}

})

JS的引用與拷貝

基本數(shù)據(jù)類型,保存在棧中(占用空間小,大小固定,頻繁使用);

其他Array,Object,F(xiàn)unction都是 引用數(shù)據(jù)類型(占用空間大,大小不固定 )

JavaScript是有基本數(shù)據(jù)類型與引用數(shù)據(jù)類型之分的。對(duì)于基本數(shù)據(jù)類型:number,string,Boolean,null,undefined它們?cè)跅?nèi)存中直接存儲(chǔ)變量與值。而Object對(duì)象的真正的數(shù)據(jù)是保存在堆內(nèi)存,棧內(nèi)只保存了對(duì)象的變量以及對(duì)應(yīng)的堆的地址,所以操作Object其實(shí)就是直接操作了原數(shù)組對(duì)象本身。

Object.assign()

const foo = { a : 1}

const bar = { a: 10,b:20}

console.log(Object.assign({},bar,foo)) // {a:1,b:20}

特點(diǎn):

1.值拷貝

2.返回值為第一個(gè)參數(shù)

3.淺層 merge

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容