HTML5技术

【javascript】详解变量,值,类型和宿主对象 - 外婆的彭湖湾(5)

字号+ 作者:H5之家 来源:H5之家 2017-09-03 13:26 我要评论( )

中使用了未曾声明过的变量a,但是无报错发生,而且此时返回的是undefined!! 也就是说typeof的安全机制把 undeclared的行为改变了,且和undefined一样, 这会让我们感到困惑(要注意typeof中的这种变量行为只是一种

中使用了未曾声明过的变量a,但是无报错发生,而且此时返回的是undefined!!
也就是说typeof的安全机制把 undeclared的行为改变了,且和undefined一样, 这会让我们感到困惑(要注意typeof中的这种变量行为只是一种特殊情况,不要奉为圭筹)

2. 输出undeclared变量的时候会报错,但是此时的输出具有迷惑性:

console.log(a) // a未声明时输出 Uncaught ReferenceError: a is not defined

实际上,这里的not defined如果改为undeclared或许会更好理解一些


为什么要这样做呢? 这当然是有原因的, 这让我们可以安心地判断一个变量的类型,即使它不存在也不会报错, 我们的程序

Number篇


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. ""(空字符串)


嗯嗯,就这样

String篇

强大的模板字符串

你可能遇到过这种问题:
有些时候你会写一些HTML字符串

 

然后当它变长一些的时候你决定要换行(其实主要是觉得不换行太难看了)

 

然后换行后你就看到了这一幕:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要讲故事啦~~ - 外婆的彭湖湾

    【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要

    2017-08-16 11:00

  • 【javascript】详解javaScript的深拷贝 - 外婆的彭湖湾

    【javascript】详解javaScript的深拷贝 - 外婆的彭湖湾

    2017-08-15 12:01

  • 一次浴火重生的MySQL优化(EXPLAIN命令详解) - 禁心尽力

    一次浴火重生的MySQL优化(EXPLAIN命令详解) - 禁心尽力

    2017-08-02 14:00

  • AngularJS“路由”的定义概念、使用详解——AngularJS学习资料教程 - 我叫小熊

    AngularJS“路由”的定义概念、使用详解——AngularJS学习资料教程 -

    2017-07-12 11:01

网友点评
-