中使用了未曾声明过的变量a,但是无报错发生,而且此时返回的是undefined!!
也就是说typeof的安全机制把 undeclared的行为改变了,且和undefined一样, 这会让我们感到困惑(要注意typeof中的这种变量行为只是一种特殊情况,不要奉为圭筹)
2. 输出undeclared变量的时候会报错,但是此时的输出具有迷惑性:
console.log(a) // a未声明时输出 Uncaught ReferenceError: a is not defined
实际上,这里的not defined如果改为undeclared或许会更好理解一些
为什么要这样做呢? 这当然是有原因的, 这让我们可以安心地判断一个变量的类型,即使它不存在也不会报错, 我们的程序
1. 浮点数计算失真问题
因为有些小数表示成二进制是无限循环的, 这导致无法“刚好”计算正确
console.log(0.2 + 0.5 === 0.7); // true console.log(0.5+ 0.5 === 1.0); // true console.log(0.2 + 0.4 === 0.6); // false console.log(0.2 + 0.1 === 0.3); // false
2. 诡异而有趣的NaN
首先你要搞清楚的一个问题是NaN的含义
让我们猜猜它是什么意思:
1. NaN不是number,也就是number之外的类型, 例如字符串,布尔值等等
2. NaN属于number类型,只不过是一种非常特殊的number的值, 为NaN
NaN属于第2种而不是第1种!!也就是说字符串, 布尔值表面上是Not A Number(也即NaN的表面意思) , 但它们和NaN是八竿子打不着的关系,不要弄混了。
而在这里,为了让我们能把NaN的概念变得混乱, javascript的一个糟心的API却开始了他的表演。。。
没错, ES5里面全局的isNaN方法不能区分纯粹的NaN和字符串等“非数字”
console.log(isNaN(NaN)); // true console.log(isNaN()); // true
ES6把isNaN方法纳入到了Number封装对象中, 并对这个糟糕的状况进行了改进:
console.log(Number.isNaN(NaN)); // true console.log(Number.isNaN()); // false
NaN的自反特性
NaN最诡异的地方在于: NaN是不等于NaN的!
console.log(NaN === NaN) // false
在所有数值类型中独一无二的逆天特性
在ES6前怎么检测"纯粹"的NaN呢? (不要误判字符串等)
1.事实上是这样做的
n === && window.isNaN( n )
其实还有另外一种更简洁的方式,
2.利用NaN的自反特性:
n !== n;
Boolean篇
布尔值false的替身:能充当false的“假值”
这要从if条件语句开始说起:
if(someValue){ }
作为一个JSer, 你绝对知道把undefined, null, 0 填上去会发生什么
对, 因为类型转换的机制, 它们最终都会等同于false
而undefined, null, 0就是我上面所说的 “假值”
但显然又又又又又又有东西会让我们搞混(啊!javascript你怎么老这样啊!!)
在这里我问大家
1."" "undefined", "null", "0", 是假值吗?(在判断条件下能被类型转换为false吗)
2. new Boolean(false), new Number(0), new String("")是假值吗?
3. [] (空数组), {}(空对象) function () { } 是假值吗?
如果你是一个有经验的JS开发者,这有可能不是什么难题, 但我认为这些“判断题”对初学JS的人来说的确不那么友好
下面我给三点论断让大家能够正确判断
1. 除空字符串("")外的字符串的都不是假值,而是真值 (一击击破 "" "undefined", "null", "0"所造成的认知混乱)
2. 凡是对象的都不是假值, 而是真值 (一击击破. [] , {}, function () { } 所造成的认知混乱)
【注意】对于2中请注意数组和函数本质上也是对象!
3.真正的假值只有屈指可数的那几个:
1. undefined
2. null
3. false
4. +0 、 -0 和 NaN
5. ""(空字符串)
嗯嗯,就这样
强大的模板字符串
你可能遇到过这种问题:
有些时候你会写一些HTML字符串
然后当它变长一些的时候你决定要换行(其实主要是觉得不换行太难看了)
然后换行后你就看到了这一幕: