本篇内容参考连结
PJCHENder - coercion系列
Coercion
Definition
Javascript中的 Coercion是指将资料强迫从一种型态转为另外一种型态的特性. 直接参考下面简单例子
var result = 1 + '2'; console.log(result);
输出则会得到 '12'(string) 而非 3 (number), 因为 Coercion 的关係, 在做运算时, JS 引擎把原本型态为number的1转换成字串'1', 在相加后才会得到字串'12'.
If Practice
知道此特性后, 在写程式上, 可以借由此特性来转写If的判断式, 首先观察 "Null" "undefined" 和 "", 在转换成布林值时, 结果是如何
console.log('null will convert to ' + Boolean(null)); console.log('undefined will convert to ' + Boolean(undefined)); console.log('Empty String will convert to ' + Boolean(""));
结果如下
由此我们就可以利用这样的结果, 然后写出确认变数使否有值的判断式.
var varNoValue; if(varNoValue) console.log("Having Value"); else console.log("No Value");
但是此种方法要特别注意几个重点,
变数为字串并且为空的时候也会为false变数为数字而为0时也为false当变数给的值为布林时, 不建议用此种方法.
Advance Practice - Default Value
也可以利用Coercion, 写出简洁的预设值. 首先来看假如不设立预设值会发生甚么事
function doSomething(something) { console.log("Hello " + something); } doSomething("World"); // Try (a) doSomething(); // Try (b)
上面的例子JS并不会报错, 先来看 Try (a), 很简单就直接console出"Hello World"
, 再来看Try (b), 此种写法并不会发生错误, 因为在doSomething()的execution context中something已经被定义并hoisting, 只是尚未给值, 所以Try (b)会console出 "Hello undefined"
(undefined 被强制转为字串).
那我们如何利用Coercion来写预设值呢, 参考以下範例
function doSomething(something) { something = something || "<Entner Your Words>"; // 预设预设 console.log("Hello " + something); } doSomething();
而这次就会输出 "Hello <Entner Your Words>"
.
在开始解释之前假如不了解JS的Precedence和Associativity可以参考此连结
我们输入true || false, true || 'Hello', false || 'Hello' 和 'Hi' || 'Hello'都会分别回传不同的结果。
true || false => truetrue || 'Hello' => truefalse || 'Hello' => 'Hello''Hi' || 'Hello' => 'Hi'当左边为true的时候, 则会输出true. 当左边为false的时候, 则会判断右边是否为true. 因为右边为非空字串因为Coercion的关係被转为布林并视为true, 同时回传字串.
此种预设值方法也要注意上方if判断式转换为布林值时会被视为false的几个case.