一营勤、數(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ù),效果與加括號(hào)一樣返回的也是string
原生JS里光坝,只有手動(dòng)賦值給一個(gè)變量null,才會(huì)產(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
對(duì)象:
var obj = {
0:"number",
name:"daming",
'age':28,
sun:{
name:"xiaoming",
age:2
}
}
console.log(obj[0]) //number
js會(huì)把數(shù)字屬性,自動(dòng)轉(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)
有兩個(gè)參數(shù),默認(rèn)第二個(gè)參數(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"之類的無(wú)法轉(zhuǎn)化為數(shù)字的內(nèi)容時(shí)時(shí)暂幼,
//返回NAN
3.parseFloat(string)
與 parseInt
類似筏勒。只是把參數(shù)轉(zhuǎn)化為float類型。好處是不會(huì)像OC一樣有浮動(dòng)旺嬉。
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ù)在前荡陷,一般用于把對(duì)象轉(zhuǎn)化成字符串:object.toString()
String(Object)
參數(shù)在中
兩者區(qū)別在于
1.toString()
不能把null
,undefined
,NAN
作為參數(shù)。而String()
可以把上述3個(gè)直接轉(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()
是對(duì)象方法耘沼。所以前不能直接跟數(shù)字,例如1.toString()
就會(huì)報(bào)錯(cuò)朱盐。但是如上例一樣群嗤,先把Number
類型賦值給變量number1
。就可以使用托享。同理boolean
類型也會(huì)報(bào)錯(cuò)骚烧。
6.Boolean()
有實(shí)際意義的參數(shù),結(jié)果都是true
闰围。包括函數(shù)赃绊,對(duì)象。undefined
null
NAN
返回fasle
五羡榴、隱式類型轉(zhuǎn)換
-- | 隱式轉(zhuǎn)換 |
---|---|
isNAN() | Number() |
++/-- +/-(正負(fù)符號(hào)如-1) | Number() |
+(加號(hào)) | 只要前后有字符串存在碧查,就都拼接成字符串 |
- * / % | Number() |
&& !|| | Boolean() |
< > <= >= | 如果比較左右有數(shù)字校仑,就會(huì)把不是數(shù)字的一端轉(zhuǎn)化為數(shù)字忠售。Number() |
== != | 如果比較左右有數(shù)字迄沫,就會(huì)把不是數(shù)字的一端轉(zhuǎn)化為數(shù)字稻扬。Number() |
=== !== | 不發(fā)生類型轉(zhuǎn)換 |
isNAN(object) 內(nèi)部會(huì)先把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
會(huì)先進(jìn)行1 > 2 再把結(jié)果 > 3;
console.log(undefined == null) //ture
console.log(NAN == NAN) //fasle
console.log(typeof(a)) //console一個(gè)未定義的變量黔宛,只有這種情況不會(huì)報(bào)錯(cuò)臀晃,結(jié)果為字符串"undefined".
六:立即執(zhí)行函數(shù)(匿名函數(shù)):
(function() {}) ()
(function() {} ())
作用是避免全局污染积仗,強(qiáng)行改變作用域哎迄。
正常的函數(shù)調(diào)用的方法為:
function fun() {
}
fun()
但是如果這樣寫(xiě),就會(huì)報(bào)錯(cuò)隆圆。
function fun() {
}()
因?yàn)?function 可以是語(yǔ)句或者表達(dá)式
//語(yǔ)句
function fun(){
};
//表達(dá)式
var fun = function (){
};
為了避免解析上的歧義漱挚,JS規(guī)定,如果function出現(xiàn)在行首渺氧,一律解析成語(yǔ)句旨涝。
因此JS看到行首是function關(guān)鍵字以后,認(rèn)為這一段都是函數(shù)定義侣背,不應(yīng)該以原括號(hào)結(jié)尾白华,所以就報(bào)錯(cuò)了。
七:this
-
在函數(shù)中使用this贩耐,它的指向完全取決于函數(shù)是如何被調(diào)用的
調(diào)用方式 示例 函數(shù)中的this指向 通過(guò)new調(diào)用 new method()
新對(duì)象 直接調(diào)用 method()
全局對(duì)象 通過(guò)對(duì)象調(diào)用 obj.method()
前面的對(duì)象 call method.call(ctx)
call的第一個(gè)參數(shù) apply method.apply(ctx)
apply的第一個(gè)參數(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' ]
要理解這個(gè)轉(zhuǎn)換,需要先理解slice()
的實(shí)際執(zhí)行含義潮太。
var arr = ['a', 'b', 'c']
console.log(arr.slice(1, 2))//[ 'b']
slice方法在上述語(yǔ)句中的的意思是:
對(duì)arr這個(gè)數(shù)組取其length為2的部分管搪。從下標(biāo)1開(kāi)始讀,每讀到一個(gè)數(shù)據(jù)铡买,就添加到數(shù)組中更鲁,最終返回這個(gè)數(shù)組。
理解了slice()方法奇钞,就能完全理解上述轉(zhuǎn)換的原理了:
call()
方法澡为,把slice()
里的this
指向obj
(因?yàn)閛bj是對(duì)象,沒(méi)有slice()方法)景埃。然后slice
會(huì)取obj
的length
,得到的結(jié)果是3
媒至。然后從下標(biāo)0
開(kāi)始讀,一直讀到長(zhǎng)度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í)每個(gè)對(duì)象都是一個(gè)函數(shù)条篷。每個(gè)函數(shù)也都是一個(gè)對(duì)象骗随。
九:原型鏈
原型:
每個(gè)函數(shù)都會(huì)自動(dòng)附帶一個(gè)屬性prototype
蛤织,這個(gè)屬性的值是一個(gè)普通對(duì)象,稱之為原型對(duì)象鸿染。
每個(gè)實(shí)例都擁有一個(gè)特殊的屬性__proto__
指蚜,稱之為隱式原型,它指向構(gòu)造函數(shù)的原型
當(dāng)訪問(wèn)實(shí)例成員時(shí)涨椒,先找自身摊鸡,如果不存在,會(huì)自動(dòng)從隱式原型中尋找
這樣一來(lái)蚕冬,我們可以把那些公共成員免猾,放到函數(shù)的原型中,即可被所有實(shí)例共享
hasOwnProperty
判斷一個(gè)屬性是在自身而不是在原型上囤热。
in
判斷屬性是不是在該對(duì)象自身或者原型上猎提。
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)建空原型的對(duì)象旁蔼。
-
利用
Object.create()
Object.create(target); // 返回一個(gè)新對(duì)象锨苏,新對(duì)象以target作為隱式原型
-
利用
Object.setPrototypeOf()
Object.setPrototypeOf(obj, prototype); // 設(shè)置obj的隱式原型為prototype
十:繼承
function inherit(Child, Parent){
//改變?cè)玩溂纯蓪?shí)現(xiàn)繼承。
Object.setPrototypeOf(Child.prototype, Parent.prototype);
}