最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

跟我學(xué)習(xí)javascript的隱式強制轉(zhuǎn)換

 更新時間:2015年11月16日 10:00:29   作者:小平果118  
跟我學(xué)習(xí)javascript的隱式強制轉(zhuǎn)換,感興趣的小伙伴們可以學(xué)習(xí)一下

JavaScript的數(shù)據(jù)類型分為六種,分別為null,undefined,boolean,string,number,object。

object是引用類型,其它的五種是基本類型或者是原始類型。我們可以用typeof方法打印來某個是屬于哪個類型的。不同類型的變量比較要先轉(zhuǎn)類型,叫做類型轉(zhuǎn)換,類型轉(zhuǎn)換也叫隱式轉(zhuǎn)換。隱式轉(zhuǎn)換通常發(fā)生在運算符加減乘除,等于,還有小于,大于等。。

typeof '11' //string 
typeof(11)  //number
'11' < 4 //false

一、基本類型的轉(zhuǎn)換

下面先講加減乘除:

1. 字符串加數(shù)字,數(shù)字就會轉(zhuǎn)成字符串。

2. 數(shù)字減字符串,字符串轉(zhuǎn)成數(shù)字如果字符串不是純數(shù)字就會轉(zhuǎn)成NaN。字符串減數(shù)字也一樣。兩個字符串相減也先轉(zhuǎn)成數(shù)字。

3. 乘,除,大于,小于跟減的轉(zhuǎn)換也是一樣。

//隱式轉(zhuǎn)換 + - * == / 
// + 
10 + '20' //'2010'
// -
10 - '20' //-10
10 - 'one' //NaN
10 - '100a' //NaN
// *
10*'20' //200
'10'*'20' //200
// /
20/'10' //2
'20'/'10' //2
'20'/'one'  //NaN

4.加法操作順序是敏感的

類似這樣的混合表達式有時令人困惑,因為 JavaScript 對操作順序是敏感的。例如,表達式:1+2+"3";  //"33"

由于加法運算是自左結(jié)合的(即左結(jié)合律),因此,它等同于下面的表達式:(1+2)+"3";  //"33"

與此相反,表達式:1+"2"+3;  //"123"的計算結(jié)果為字符串“123”。左結(jié)合律相當(dāng)于是將表達式左側(cè)的加法運算包裹在括號中。

5.再來看看一組 ==

1).undefined等于null

2).字符串和數(shù)字比較時,字符串轉(zhuǎn)數(shù)字

3).數(shù)字為布爾比較時,布爾轉(zhuǎn)數(shù)字

4).字符串和布爾比較時,兩者轉(zhuǎn)數(shù)字

// ==
undefined == null; //true
'0' == 0;    //true,字符串轉(zhuǎn)數(shù)字
0 == false; //true,布爾轉(zhuǎn)數(shù)字
'0' == false;    //true,兩者轉(zhuǎn)數(shù)字
null == false;   //false
undefined == false;  //false

7個false值:false,0,-0,“”,NaN,null以及undefined,所有其他值都是truth

6、NaN,不是一個數(shù)字

NaN 是一個特殊值,說明某些算術(shù)運算(如求負數(shù)的平方根)的結(jié)果不是數(shù)字。方法 parseInt() 和 parseFloat() 在不能解析指定的字符串時就返回這個值。對于一些常規(guī)情況下返回有效數(shù)字的函數(shù),也可以采用這種方法,用 Number.NaN 說明它的錯誤情況。

Math.sqrt(-2)
Math.log(-1)
0/0
parseFloat('foo')

對于很多JavaScript的初學(xué)者來說,它的第一個陷阱是調(diào)用typeof時返回結(jié)果的通常是你想不到的:

console.log(typeof NaN); // 'Number'

這情情況下,NaN并不意味著是一個數(shù)字,它的類型是數(shù)字。明白嗎?
因為typeof 返回的是字符串,有六種:“number”、”string”、”boolean”、”object”、”function”、”undefined

保持冷靜,因為下面還有很多混亂的地方。讓我們比較兩個NaN:

var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x == y); // false

也許這是因為我們沒有使用嚴格等價(===)操作?顯然不是。

var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x === y); // false

直接比較兩個NaN呢?

console.log(NaN === NaN); // false

因為有很多方法來表示一個非數(shù)字,所以一個非數(shù)字不會等于另一個為NaN的非數(shù)字,它還是有一定道理的。

但是當(dāng)然,解決方案現(xiàn)在已經(jīng)有了。讓我們認識一下全局函數(shù)isNaN:

console.log(isNaN(NaN)); // true

唉,不過 isNaN() 也有它自己的很多缺陷呀:

console.log(isNaN('hello')); // true
console.log(isNaN(['x'])); // true
console.log(isNaN({})); // true

這樣又產(chǎn)生了很多不同的解決方案。其中一個是利用 了NaN的非反射性質(zhì)(例如, 看看 Kit Cambridge 的筆記)

var My = {
 isNaN: function (x) { return x !== x; }
}

不過幸運的是,在即將到來的ECMAScript 6中, 有一個Number.isNaN() 方法提供可靠的NaN值檢測。
換句話說,只有在參數(shù)是真正的NaN時,才會返回true

console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(Math.sqrt(-2))); // true
console.log(Number.isNaN('hello')); // false
console.log(Number.isNaN(['x'])); // false
console.log(Number.isNaN({})); // false

二、引用類型的轉(zhuǎn)換

基本類型間的比較相對簡單。引用類型和基本類型的比較就相對復(fù)雜一些,先要把引用類型轉(zhuǎn)成基本類型,再按上述的方法比較。

1.引用類型轉(zhuǎn)布爾全是true。

比如空數(shù)組,只要是對象就是引用類型,所以[]為true。引用類型轉(zhuǎn)數(shù)字或者字符串就要用valueOf()或者toString();對象本身就繼承了valuOf()和toString(),還可以自定義valueOf()和toString()。根據(jù)不同的對象用繼承的valueOf()轉(zhuǎn)成字符串,數(shù)字或本身,而對象用toString就一定轉(zhuǎn)為字符串。一般對象默認調(diào)用valueOf()。

1).對象轉(zhuǎn)數(shù)字時,調(diào)用valueOf();

2).對象轉(zhuǎn)字符串時,調(diào)用toString();

先看看下面的例子:

0 == []; // true, 0 == [].valueOf(); ---> 0 == 0;
'0' == []; // false, '0' == [].toString(); ---> '0' == '';
2 == ['2']; // true, 2 == ['2'].valueOf(); ---> 2 == '2' ---> 2 == 2;
'2' == [2]; // true, '2' == [2].toString(); ---> '2' =='2';

[] == ![]; //true, [].valueOf() == !Boolean([]) -> 0 == false ---> 0 == 0;

對象轉(zhuǎn)成數(shù)字時,調(diào)用valueOf(),在這之前先調(diào)用的是toString();所以我猜valueOf方法是這樣的。So上面的例子 0 == []要改成下面更合理。無論如何,[]最后是轉(zhuǎn)成0的。

var valueOf = function (){
 var str = this.toString(); //先調(diào)用toString(),轉(zhuǎn)成字符串
 //...
}
0 == []; // true, 0 == [].valueOf(); -> 0 == '0' -> 0 == 0;

自定義的valueOf()和toString();

  • 自定義的valueOf()和toString()都存在,會默認調(diào)用valueOf();
  • 如果只有toString(),則調(diào)用toString();

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return '1';}

a + 1; // 2, valueOf()先調(diào)用

去掉valueOf()就會調(diào)用toString()。

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return '1';}

a + 1; // 2, 先調(diào)用valueOf()
//去掉valueOf
delete a.valueOf;
a + 1; // '11', 調(diào)用toString()

如果返回其它會怎么樣呢?

var a = [1];

a.valueOf = function (){return ;}
a.toString = function (){return 1 ;};

1 - a; //NaN

其它對象 調(diào)用valueOf()轉(zhuǎn)成不同的類型:

var a = {};
a.valueOf(); //Object {}
var a = [];
a.valueOf(); //[] 自己本身
var a = new Date();
a.valueOf(); //1423812036234 數(shù)字
var a = new RegExp();
a.valueOf(); // /(?:)/ 正則對象

引用類型之間的比較是內(nèi)存地址的比較,不需要進行隱式轉(zhuǎn)換,這里不多說。

[] == [] //false 地址不一樣

var a = [];
b = a;
b == a //true

2.顯式轉(zhuǎn)換

顯式轉(zhuǎn)換比較簡單,可以直接用類當(dāng)作方法直接轉(zhuǎn)換。

Number([]); //0
String([]); //”
Boolean([]); //true

還有更簡單的轉(zhuǎn)換方法。

3 + ” // 字符串'3'
+'3' // 數(shù)字3
!!'3' // true

以上就是本文的全部內(nèi)容,詳細介紹了javascript的隱式強制轉(zhuǎn)換,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評論

建瓯市| 卓资县| 辽阳市| 曲周县| 天峨县| 龙胜| 赣州市| 兰溪市| 昌黎县| 鹤山市| 赤峰市| 封开县| 安远县| 陆川县| 屏边| 翼城县| 祁阳县| 赤水市| 本溪市| 通许县| 西昌市| 乐至县| 凤凰县| 中超| 攀枝花市| 通道| 宿州市| 封开县| 清徐县| 清流县| 菏泽市| 开江县| 枣庄市| 民勤县| 巴彦县| 石河子市| 界首市| 泽普县| 江都市| 玉林市| 咸宁市|