首页 > 网站开发 > JavaScript >
-
JavaScript教程之JavaScript的数据类型问题总结(2)
3-1-2 强制转换为字符串类型:Boolean()
转换规则
(1)Boolean()转换规则,任意类型转化成布尔值
undefined,null,-0,+0,NaN,""(空字符串)这六个值转换为false,其它的都转换为ture,注意对象(new Boolean(false))转换后对应的也是true
(1)eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
Boolean(011) + "<br>" + // true
Boolean('011') + "<br>" + // true
Boolean(false) + "<br>" + // false
Boolean(new Boolean(false)) + "<br>" + // true
Boolean(undefined) + "<br>" + // false
Boolean({}) + "<br>" + //true
Boolean(null) + "<br>" + // false
Boolean([]) + "<br>" + // true
Boolean(function () {}); // true
</script>
</body>
3-2 JS的自动类型转换
3-2-1 js何时自动转换
(a)不同类型数据互相运算,多个非数值相加时,将非字符串自动强制转换为字符串,再相加成字符串,其余自动强制转换为十进制数值再运算
(b)非布尔值类型数据求布尔值,如if中的条件,自动强制转换为布尔类型
(c)非数值类型数据用一元运算符("+"和"-"),自动强制转换为十进制类型
(d)使用相等或不相等操作符时,会自动强制转换操作数,再比较他们的相等性。将非整数类型自动强制转换为整数类型,但是undefined和null不改变,
且undefined==null返回true,NaN==NaN返回false
3-2-2 自动转换为数值Number类型
eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
("2" - "1") + "<br>" + // 1
("2" + "1")+ "<br>" + // 21
(true + 1) + "<br>" + // 2
("1" * []) + "<br>" + // 0
("a" - 1 ) + "<br>" + // NaN
(+"a") + "<br>" + // NaN
(+false) + "<br>"; // 0
</script>
</body>
3-2-3 自动转换为字符串String类型
eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
("2" + "1")+ "<br>" + // "21"
(true + "1") + "<br>" + // "true1"
("1" + {}) + "<br>" + // "1[object Object]"
("1" + []) + "<br>" + // "1"
("1" + [1.2]) + "<br>" + // "11.2"
("1" + function () {}) + "<br>" + // "1function () {}"
("1"+ undefined) + "<br>" + // "1undefined"
("1"+ null) + "<br>"; // "1null"
</script>
</body>
3-2-3 自动转换为布尔值Boolean类型
eg:
<script>
if (!undefined && !null && !0 && !NaN && !"") {
console.log("true");
} // true
</script>
ps:自动转换类型有很大不确定性,不易去除错误,在预期为原始数据数值,字符串,布尔值时全部使用显示转换方法,Number(),String(),Boolean()比较好。
3-2-4 有相等与不相等操作符的自动转换
eg:
<body> <p id = "demo"></p> <script> document.getElementById("demo").innerHTML = (null == undefined)+ "<br>" + // true (null == 0) + "<br>" + // false (NaN == NaN) + "<br>" + // false (NaN != NaN) + "<br>" + // true ("3" == 3) // true </script> </body>
ps:由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,除了使用(obj.a === null || obj.a === undefined)简化为(obj.a == null)外,别的都使用全等和不全等操作符
3-3 一些转换的特殊情况
1 + {a: 1} // "1[object Object]"
{a: 1} + 1 // "1" 此种对象在前的情况,JS引擎将其视为代码块,不看作对象,由于无返回值,被忽略掉
({a: 1}) + 1 // "[object Object]1"
[ ] + [ ] // " "
[ ] + { } // "[object Object]"
{ } + [ ] // 0 // +[ ] -> Number([ ]) -> Number([ ].toString()) -> Number(" ") -> 0
({ }) + [ ] // "[object Object]"
{ } + { } // "[object Object]" // +{ }
({ }) + { } / console.log({ } + { }) / var a = { } + { }; a // "[object Object] [object Object]"
小结:+[ ] 会强制转化十进制数值0,多个不是数值数相加,会强制转化为字符串,对象在前没有被括号包起来,会被当作代码块处理,没有返回值就被忽略掉。