今天復習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;
嘛嘛,當然只是猜測。
以上僅供參考。萌新一只,望各位大佬輕批。