JavaScript中令你抓狂的魔術變數

來源:互聯網
上載者:User

在存在這麼一個變數 tt, 它滿足下面的代碼.
代碼執行完畢後 ,errCount=0 而且 斷言函數也從未 alert 資訊
代碼如下: 複製代碼 代碼如下:<script>
var tt=/* 請在這裡定義tt */;
var errCount=0 //全域變數,用來記錄 assert 函數出現斷言宣告的次數
/*
斷言函數
如果v為假,該函數就 alert("assert error"),並累加計數器 errCount
如果v為真,就什麼也不做
*/
function assert(v) {
if (!v) {
alert("assert error");
errCount++;
}
}

assert((tt || true) == false)
assert((tt || false) == false)
assert((tt && true) == true)
assert((tt && false) == false)
assert((true || tt ) == true)
assert((tt || true ) == false)
assert((false || tt ) == false)
assert((tt || false ) == false)
assert((true && tt) == false)
assert((tt && true ) == true)
assert((false && tt ) == false)
assert((tt && false ) == false)

assert((tt ? true : false) == true)
assert((tt == false) == true)
assert((!tt == tt ) == true)
assert((tt + '') == "false")
assert(tt == false)

alert(errCount) //結果是列印 0

</script>

同發 CSDN: JavaScript中的魔術變數
這個問題是我一個同事在下班後考我的一個題目.我當時想了很久,也嘗試了很久.
得到如下答案,能滿足題目的要求.
答案如下:
var tt=new Object(false);
var tt=new Boolean();
var tt=new Boolean(false);
通過這個題目我們足可以感受到js的靈活,更可以加深對js的理解.
我以前經常在代碼中使用如下判斷
if (a){
alert('ok')
}
現在看來,這樣寫的邏輯隱患是非常大的.
借csdn中一個網友的精彩回複來解釋一下上面的問題
||是這樣運算的:從第一個開始,遇到有意義的返回,否則返回最後一個運算式(注意不一定是Boolean值);
&&是這樣運算的:從第一個開始,遇到無意義的返回,否則返回最後一個運算式(注意同上);
!是這樣運算的:對錶達式的值取非(注意不是對錶達式)。
什麼是無意義呢:如下六個 0,null,undefined,"",false,NaN
除此,視為有意義。
new Boolean(),new Boolean(false)是同一個東西,由於它是一個對象,故是有意義的,但其值為false,所以,可以看為“有意義的false”,這樣,就可以解釋所有的問題了。
new Object(false),也是有意義的,其值也為false,只不過其類型為Object,而new Boolean()其類型為Boolean而已。
再提醒一點:||與&&這兩個運算子不是對值的運算,即在運算過程中不管運算式的值,而是對錶達式本身進行運算;
這兩個運算子對錶達式究竟如何運算?
答:只管運算式是否有意義,而不管其值幾何。
對於運算式,無意義的只有6個;這裡要注意:所有以new方式產生的對象為動態對象,動態對象均視為有意義
再舉例兩個說明:
一、0||false||new Boolean(false)
運算如下:
首先:0是一個常數,剛好是無意義之一,故繼續;而false也是無意義之一,故再繼續;new Boolean(false)為動態對象,有意義,故上面運算結果為new Boolean(false)
二、0||new Boolean(false)||true
這會是什麼結果?很多人不注意就會以為結果為true,但這是不對的。
先說答案:結果同上
首先:0是一個常數,剛好是無意義之一,故繼續;new Boolean(false)為動態對象,有意義;這裡已經找到有意義的運算式,故不再往下運算了。所以結果同上。
=====
對&&運算子,同理,不再多說。
題外話:
有意思的是,在答案出來後,我們還採用了一些非常規手段的答這個題(僅供娛樂)

var tt=window["assert"]=new Function();
這句話的意思相當於下面兩行代碼
function assert(){}
function tt(){}
javascript允許重複定義函數,執行的時候以以後一個為準。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.