今天复习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;
嘛嘛,当然只是猜测。
以上仅供参考。萌新一只,望各位大佬轻批。