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