js中的或(||)運算符和與(&&)運算符


今天復習js繼承的時候發現了一個問題,先上代碼了

<script type="text/javascript">
        window.onload = function () {
            var mama,
                mama1,
                test = function (name) {
                debugger;
                this.name = name || 'mama';
                };
            debugger;
            mama = new test();
            mama1 = new test("mama1");
            alert(mama.name);//name = mama
            alert(mama1.name);// name = mama1
        }

    </script>

在執行構造函數的時候,無參的構造函數返回的name是'mama',有參數時,實例的name就是參數值了。

這個時候我就有點犯迷糊了,為什么邏輯運算符||能這么用呢?

由於是C#出身,所以對js ||這樣用感覺很奇怪。

沒轍,不懂先研究,實驗實驗就知道了。

var b, c, d;
            b = true || 0;//b=true;
            c = false || 0;//c=0;
            d = 1 || 0;//d=1;

換成別的呢?

var b, c, d;
            b = 1-1 || 1+1; //b=2
            c = function () { return undefined } || function () { return 1};//c=function();
            d = c();//d=undefined
var b, c, d;
            b = 1-1 || 1+1; //b=2
            c = function () { return 1 } || function () { return undefined};//c=function();
            d = c();//d=1
b = {} || { a: 1, getA: function () { return this.a}}; //b=object

 

var b, c, d;
            b = { a: 1, getA: function () { return this.a } } || {}; //b=object
            c = b.getA();//c=1;

通過這幾個實驗,可以看出,JS的||並不是像C#里面的||一樣 單純的返回一個布爾類型。

大家都知道js的布爾類型判定是

對象是true,非零是true,非空字符串是true

其余的都是false

 由此得出

邏輯或 ||  : var a = 表達式1 || 表達式2

      表達式1    表達式2    a取值

        1          0      表達式1結果值

        1        1      表達式1結果值

        0        1      表達式2結果值

        0        0      表達式2結果值

 

邏輯與 &&  : var a = 表達式1 && 表達式2

      表達式1    表達式2    a取值

        1          0      表達式2結果值

        1        1      表達式2結果值

        0        1      表達式1結果值

        0        0      表達式1結果值

 主要原因是因為短路,邏輯或 || 在前面有一個ture的時候則不看后面直接停止,邏輯與&&同理。

然后計算賦值和我們平時一樣之獲取最新的一次計算結果值。

例如

b = (1 + 1, 2 + 2, 3 + 3);//b=6;

嘛嘛,當然只是猜測。

以上僅供參考。萌新一只,望各位大佬輕批。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM