一、數(shù)據(jù)類型:
| 原始類型: | 引用類型 |
|---|---|
| null | object |
| undefined | function |
| number | |
| string | |
| boolean |
NAN也是數(shù)據(jù)類型,表示數(shù)據(jù)不應(yīng)該存在。例如0/0的計(jì)算結(jié)果,就是NAN
typeof(xx)的返回值即為基本數(shù)據(jù)類型,而這些數(shù)據(jù)類型顯示都是字符串類型
typeof("1")//返回string
typeof "1"http://也可以直接加空格再接參數(shù),效果與加括號一樣返回的也是string
原生JS里,只有手動賦值給一個變量null,才會產(chǎn)生null
未賦值的變量都是undefined
表達(dá)式一種數(shù)據(jù),數(shù)據(jù)內(nèi)容為表達(dá)式的計(jì)算結(jié)果
賦值表達(dá)式也是數(shù)據(jù)
console.log(a = 1 + 9 + 9)//結(jié)果為19
對象:
var obj = {
0:"number",
name:"daming",
'age':28,
sun:{
name:"xiaoming",
age:2
}
}
console.log(obj[0]) //number
js會把數(shù)字屬性,自動轉(zhuǎn)化為字符串。
四、顯式類型轉(zhuǎn)換
| -- |
|---|
Number(mix) |
parseInt(string,radix) |
parseFloat(string) |
String(mix) |
toString(radix) |
Boolean() |
1.Number(mix)把字符串轉(zhuǎn)換成數(shù)字。
Number(-123) // -123
Number(2.22) // 2.22
Number(null) // 0
Number(undefined) // NAN
Number("a") // NAN
Number("123abc") // NAN
2.parseInt(string,radix)把參數(shù)轉(zhuǎn)化成整數(shù),并向下取整。
parseInt(1.1) // 1
parseInt(1.9) // 1
parseInt("-123.3") // -123
console.log(parseInt("0.1") === parseInt("-0.1")) // true
parseInt(string,radix)有兩個參數(shù),默認(rèn)第二個參數(shù)為10進(jìn)制。該函數(shù)的意思是:radix進(jìn)制的string,輸出其在10進(jìn)制下的結(jié)果
console.log(parseInt(10,16) ) // 16 把10轉(zhuǎn)化為16進(jìn)制,結(jié)果就是16
//意思是,十六進(jìn)制的10,在10進(jìn)制下,結(jié)果為16。
console.log(parseInt("b",16)) // 11
//十六進(jìn)制的b,在10進(jìn)制下,結(jié)果為11
//當(dāng)參數(shù)為:不填 、字符串空、null、undefined、"abc" 、"123abc"之類的無法轉(zhuǎn)化為數(shù)字的內(nèi)容時時,
//返回NAN
3.parseFloat(string) 與 parseInt類似。只是把參數(shù)轉(zhuǎn)化為float類型。好處是不會像OC一樣有浮動。
parseFloat("0.11a") // 0.11
parseFloat(123) // 123
//支持負(fù)數(shù)
4. String()把參數(shù)轉(zhuǎn)化成字符串。能把輸入的任意內(nèi)容轉(zhuǎn)化成字符串。包括undefined null NAN。
5.toString() 用法跟String()有些區(qū)別。
toString()參數(shù)在前,一般用于把對象轉(zhuǎn)化成字符串:object.toString()
String(Object)參數(shù)在中
兩者區(qū)別在于
1.toString()不能把null,undefined,NAN作為參數(shù)。而String()可以把上述3個直接轉(zhuǎn)化成字符串。
2.不能直接111.toString()。但是可以
var number = 111
number.toString()
toString()還可以像parseInt()進(jìn)行進(jìn)制轉(zhuǎn)換。
var number1 = 10
var number2 = number1.toString(16)
console.log(number2)
// a
但是這里有一些細(xì)節(jié)要注意:
1:
object.toString(redix)十進(jìn)制的object,輸出其在redix進(jìn)制下的結(jié)果。
parseInt(object,radix):radix進(jìn)制的object,輸出其在10進(jìn)制下的結(jié)果。
2:
toString()是對象方法。所以前不能直接跟數(shù)字,例如1.toString()就會報(bào)錯。但是如上例一樣,先把Number類型賦值給變量number1。就可以使用。同理boolean類型也會報(bào)錯。
6.Boolean() 有實(shí)際意義的參數(shù),結(jié)果都是true。包括函數(shù),對象。undefined null NAN返回fasle
五、隱式類型轉(zhuǎn)換
| -- | 隱式轉(zhuǎn)換 |
|---|---|
| isNAN() | Number() |
| ++/-- +/-(正負(fù)符號如-1) | Number() |
| +(加號) | 只要前后有字符串存在,就都拼接成字符串 |
| - * / % | Number() |
| && !|| | Boolean() |
| < > <= >= | 如果比較左右有數(shù)字,就會把不是數(shù)字的一端轉(zhuǎn)化為數(shù)字。Number() |
| == != | 如果比較左右有數(shù)字,就會把不是數(shù)字的一端轉(zhuǎn)化為數(shù)字。Number() |
| === !== | 不發(fā)生類型轉(zhuǎn)換 |
isNAN(object) 內(nèi)部會先把object進(jìn)行Number(object)轉(zhuǎn)換,在拿結(jié)果與NAN進(jìn)行比較。如果是NAN,則返回true。
console.log(isNAN(null)) // false
console.log(isNAN(undefined)) // true
console.log(isNAN("123")) // fasle
console.log(isNAN("abc")) // true
1 > 2 > 3
會先進(jìn)行1 > 2 再把結(jié)果 > 3;
console.log(undefined == null) //ture
console.log(NAN == NAN) //fasle
console.log(typeof(a)) //console一個未定義的變量,只有這種情況不會報(bào)錯,結(jié)果為字符串"undefined".
六:立即執(zhí)行函數(shù)(匿名函數(shù)):
(function() {}) ()
(function() {} ())
作用是避免全局污染,強(qiáng)行改變作用域。
正常的函數(shù)調(diào)用的方法為:
function fun() {
}
fun()
但是如果這樣寫,就會報(bào)錯。
function fun() {
}()
因?yàn)?function 可以是語句或者表達(dá)式
//語句
function fun(){
};
//表達(dá)式
var fun = function (){
};
為了避免解析上的歧義,JS規(guī)定,如果function出現(xiàn)在行首,一律解析成語句。
因此JS看到行首是function關(guān)鍵字以后,認(rèn)為這一段都是函數(shù)定義,不應(yīng)該以原括號結(jié)尾,所以就報(bào)錯了。
七:this
-
在函數(shù)中使用this,它的指向完全取決于函數(shù)是如何被調(diào)用的
調(diào)用方式 示例 函數(shù)中的this指向 通過new調(diào)用 new method()新對象 直接調(diào)用 method()全局對象 通過對象調(diào)用 obj.method()前面的對象 call method.call(ctx)call的第一個參數(shù) apply method.apply(ctx)apply的第一個參數(shù) call函數(shù)的理解
function func(e) {
console.log(this)
};
var obj = {
func2: function () {
}
}
func.call(obj)//{ func2: [Function: func2] }
//立即執(zhí)行func()函數(shù),但把func函數(shù)里的this指向obj.
- 偽數(shù)組轉(zhuǎn)數(shù)組:
var obj = {
0: 'a',
1: 'b',
2: 'c',
length:3
}
console.log(Array.prototype.slice.call(obj))//[ 'a', 'b', 'c' ]
要理解這個轉(zhuǎn)換,需要先理解slice()的實(shí)際執(zhí)行含義。
var arr = ['a', 'b', 'c']
console.log(arr.slice(1, 2))//[ 'b']
slice方法在上述語句中的的意思是:
對arr這個數(shù)組取其length為2的部分。從下標(biāo)1開始讀,每讀到一個數(shù)據(jù),就添加到數(shù)組中,最終返回這個數(shù)組。
理解了slice()方法,就能完全理解上述轉(zhuǎn)換的原理了:
call()方法,把slice()里的this指向obj(因?yàn)閛bj是對象,沒有slice()方法)。然后slice會取obj的length,得到的結(jié)果是3。然后從下標(biāo)0開始讀,一直讀到長度3結(jié)束。把讀到的結(jié)果,添加到數(shù)組中,并返回。
假如把上述obj改為:
var obj = {
0: 'a',
2: 'c',
3: 'c',
length:3
}
console.log(Array.prototype.slice.call(obj))//['a', empty, 'c']
八:構(gòu)造函數(shù)
function Obj (name,age) {
this.name = name,
this.age = age,
this.sayHi = function() {
console.log(this.name+this.age)
}
}
var obj = new Obj('lili',18)
obj.sayHi();
因此可以看出,其實(shí)每個對象都是一個函數(shù)。每個函數(shù)也都是一個對象。
九:原型鏈
原型:

每個函數(shù)都會自動附帶一個屬性prototype,這個屬性的值是一個普通對象,稱之為原型對象。
每個實(shí)例都擁有一個特殊的屬性__proto__,稱之為隱式原型,它指向構(gòu)造函數(shù)的原型
當(dāng)訪問實(shí)例成員時,先找自身,如果不存在,會自動從隱式原型中尋找
這樣一來,我們可以把那些公共成員,放到函數(shù)的原型中,即可被所有實(shí)例共享
hasOwnProperty判斷一個屬性是在自身而不是在原型上。
in判斷屬性是不是在該對象自身或者原型上。
var obj = {a:1}
Object.prototype.b = 2;
console.log('a' in obj)//true
console.log('b' in obj)//true
原型鏈:

-
instanceof關(guān)鍵字【常用】object instanceof constructor // 判斷object的原型鏈中,是否存在constructor的原型
創(chuàng)建空原型的對象。
-
利用
Object.create()Object.create(target); // 返回一個新對象,新對象以target作為隱式原型 -
利用
Object.setPrototypeOf()Object.setPrototypeOf(obj, prototype); // 設(shè)置obj的隱式原型為prototype
十:繼承
function inherit(Child, Parent){
//改變原型鏈即可實(shí)現(xiàn)繼承。
Object.setPrototypeOf(Child.prototype, Parent.prototype);
}