国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

來探討下JS類型轉換的哪些坑

來源:懂視網 責編:小采 時間:2020-11-27 20:26:04
文檔

來探討下JS類型轉換的哪些坑

來探討下JS類型轉換的哪些坑:為啥要說這個東西?一道面試題就給我去說它的動機。題如下:var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); }運行結果是true。其實啥類型轉換啊,操作符優先級啊,這些東西都是最最基
推薦度:
導讀來探討下JS類型轉換的哪些坑:為啥要說這個東西?一道面試題就給我去說它的動機。題如下:var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); }運行結果是true。其實啥類型轉換啊,操作符優先級啊,這些東西都是最最基

為啥要說這個東西?
一道面試題就給我去說它的動機。
題如下:

var bool = new Boolean(false);
if (bool) {
 alert('true');
} else {
 alert('false');
}

運行結果是true!!!
其實啥類型轉換啊,操作符優先級啊,這些東西都是最最基本的。
犀牛書上有詳細的介紹。但我很少去翻犀牛書的前5章。。
比如說優先級那塊兒,很多書都教育我們,“不用去背誦優先級順序,不確定的話,加括號就行了。“
平常我們寫代碼時也確實這么做的。
但現實是啥呢?面試時會出這種題,讓你來做。。
真不知道這種題的意義是啥。。
抱怨到此為止,本文嘗試來解決類型轉換問題,爭取把《JS權威指南》49頁那個表背下來。
都有哪些東西是假值?
共6個:

0或+0、-0,NaN
""
false
undefined
null

上面的順序是按照基本類型來排列的。
除此之外的一律不是!!哪怕是如下形式:

Infinity
'0'、'false'、" "(空格字符)
任何引用類型:[],{},function(){}

if (a && b)的正確理解方式是:a && b進行表達式求值后,然后再轉換為Boolean類型。
&&是種短路語法,求值后不一定是個Boolean類型,更不是兩邊轉化布爾值再運算。
比如 2&&3 的結果是3,不是true。
所以if(a && b),我們平常理解的那種,"如果a和b同時為真的話",是一種錯誤的描述方式。
其他基本類型轉化為字符串,基本和預期的一樣:

console.log("" + null); // "null"
console.log("" + undefined); // "undefined"
console.log("" + false); // "false"
console.log("" + true); // "true"
console.log("" + 0); // "0"
console.log("" + NaN); // "NaN"
console.log("" + Infinity); // "Infinity"

其他基本類型轉化為數字,需要特殊記憶:

console.log(+null); // 0
console.log(+undefined); // NaN
console.log(+false); // 0
console.log(+true); // 1
console.log(+""); // 0
console.log(+'1'); // 1
console.log(+'1x'); // NaN

其中null,空字符是0,undefined是NaN。
以上,基本類型轉換都說明白了。

下面來看看引用類型轉換為基本類型。
引用類型轉換為布爾,始終為true
引用類型轉換為字符串

1.優先調用toString方法(如果有),看其返回結果是否是原始類型,如果是,轉化為字符串,返回。
2.否則,調用valueOf方法(如果有),看其返回結果是否是原始類型,如果是,轉化為字符串,返回。
3.其他報錯。

引用類型轉化為數字

1.優先調用valueOf方法(如果有),看其返回結果是否是基本類型,如果是,轉化為數字,返回。
2.否則,調用toString方法(如果有),看其返回結果是否是基本類型,如果是,轉化為數字,返回。
3.其他報錯。

首先我們看看常見引用類型toString和valueOf返回什么?

var a = {};
console.dir(a.toString()); // "[object Object]"
console.dir(a.valueOf()); // 對象本身
 
var b = [1, 2, 3];
console.dir(b.toString()); // "1,2,3"
console.dir(b.valueOf()); // 對象本身
 
var c = [[1],[2]];
console.dir(c.toString()); // "1,2"
console.dir(c.valueOf()); // 對象本身
 
var d = function() {return 2};
console.dir(d.toString()); // "function() {return 2}"
console.dir(d.valueOf()); // 對象本身

因此對應的轉換為字符串和數字的情形是:

var a = {};
console.dir(a + ""); // "[object Object]"
console.dir(+a); // NaN
 
var b = [1, 2, 3];
console.dir(b + ""); // "1,2,3"
console.dir(+b); // NaN
 
var c = [[1],[2]];
console.dir(c + ""); // "1,2"
console.dir(+c); // NaN
 
var d = function() {return 2};
console.dir(d + ""); // "function () {return 2}"
console.dir(+d); // NaN

再來個報錯的情形:

var a = {};
a.toString = function() {return {};}
console.log("" + a); // 報錯
console.log(+a) // 報錯

以上類型轉換規律基本說完。

最后來說一下萬惡的“==”
面試題如下:

var a = false;
var b = undefined;
if (a == b) {
 alert('true');
} else {
 alert('false');
}

本以為會彈出true的。天那!為啥是false?
哈哈。。
雙等號,如果兩邊類型不同,會有隱式轉換發生。犀牛書75頁總結如下:

1,null和undefined,相等。
2,數字和字符串,轉化為數字再比較。
3,如果有true或false,轉換為1或0,再比較。
4,如果有引用類型,優先調用valueOf。
5,其余都不相等。

因此有:

console.log(undefined == false); // false
console.log(null == false); // false
console.log(0 == false); // true
console.log(NaN == false); // false
console.log("" == false); // true

0 == false之所以為true根據第3條。
"" == false之所以為true根據第3條,變成了"" == 0,再根據第2條。
第4條再來一個例子:

console.log([[2]] == 2)

其上結果為true,原因如下:
[[2]]的valueOf是對象本身,不是基本類型。
嘗試調用toString的結果是'2'。
因此變成了'2'和數字2的比較。根據第2條,相等。WTF!!
最后說句,使用"==="就沒有這些問題了。
本文完。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

來探討下JS類型轉換的哪些坑

來探討下JS類型轉換的哪些坑:為啥要說這個東西?一道面試題就給我去說它的動機。題如下:var bool = new Boolean(false); if (bool) { alert('true'); } else { alert('false'); }運行結果是true。其實啥類型轉換啊,操作符優先級啊,這些東西都是最最基
推薦度:
標簽: 轉換 js 類型
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 天天操天天插天天干 | 能看毛片的网站 | 在线啊v| 国产成人精品免费视 | 欧美精品在线视频 | 欧美a在线观看 | 精品在线网站 | 国产精品一区二区国产 | 亚洲一区影院 | 国产视频最新 | 国产成人精品亚洲一区 | 亚洲一区二区三区高清 不卡 | 日韩欧美色综合 | 国产免费一区二区三区香蕉精 | 国产欧美一区二区三区精品 | 欧美成人一区二区三区在线视频 | 久久亚洲伊人成综合人影院 | 日本成本人观看免费fc2 | 97伊人久久 | 高h肉肉视频在线播放观看 福利视频一区二区三区 | 精品国产福利 | 日韩专区第一页 | 欧美极品欧美日韩 | 久久性| 国产全黄一级毛片 | 国产91精品黄网在线观看 | 一边摸一边叫床一边爽视频 | 欧洲高清一区二区三区试看 | 看毛片的网站 | 亚洲欧美综合图区官网 | 久久婷婷色一区二区三区 | 四虎影在线永久免费观看 | 欧美激情一区二区 | 河边性xxxxfreexxxxx | 亚洲首页在线观看 | 精品国产一区二区三区免费看 | 久久久久久久一精品 | 97国产精品欧美一区二区三区 | 手机看片91精品一区 | 欧美精品一区二区三区在线 | 最新国产视频 |