JavaScript –类型之我晕
每次写博我觉得取上恬当的题目比整篇行文都难,词量有限的情况下突然想到JavaScript拾遗应该会是一个非常文艺而夺目的博文题目,但我并没有急着使用,经验告诉我应该先去搜一下看有没有被用过。果不其然,不搜不知道,一搜吓一跳。
不仅已经有JavaScript拾遗,JavaScript基础拾遗等题目的博文,而且更上一层楼的还有Javascript基础之贝海拾遗!看到这里我已然觉得高中每月买一本的《萌芽》真的是弱爆了。我要是早点融入到程序员的世界该多好,即学技术又没落下我追求文学的梦想。

看来我们程序员还是不乏文艺细胞,写代码的人搞文艺也差不到哪去啊。
学习资源
关于JavaScript比较优秀的中文资料我没有找到太多,无意间在MDN上发现了JavaScript Guid系列的文章,抱着试一试的心态我点击选择语言,居然还有中文版的!想学习的朋友们可以前去围观。本文就是看了该系列文章的一些记录。
另一个比较好的资料就是由StackOverflow网友整理的国内同行三生石上翻译的《JavaScript 秘密花园 》,属于进阶了,开始看着头晕的话建议再阅读MDN上的《JavaScript 指南》。
值,变量和字面量
千万不要随便拿数字与字符串相加
JavaScript中加号的使用需要小心,对于初学者来说很容易栽在这上面而良久无法找到问题的根源。现身说法,因为我就是被其所害所有映像特别深刻。问题大概是这样的,那时的我,刚当上程序员不久,和每一位刚出道的小朋友一样,热情高涨学习投入。我在JavaScript代码中做一些加法,其中涉及到数字与变量相加,所在代码大概是这样的:
if ((i+1)%10==0) {
//omitted for clarity
}
其中i无庸质疑是一个循环变量,然后我想用它跟1相加然后再对10求模,结果你猜怎么着,老出不来结果而且不报错。结果发现i+1 特么的出来的是"01"(如果这个时候i的值为'0'的话)。原来i是保存了数字的字符串变量,所以问题被找到了然后立马被干掉了。详情可围观我的博客处女作。
"37"-7 // 30
"37"+7 // "377"
从字符串解析数字
无非也就是用JavaScript内建的parseInt() 和parseFloat()函数等。需要注意的地方就是parseInt()只会返回整数部分,比如下面的情形:
parseInt("1.1"): 1
我想这也就是为什么有parseFloat()存在的意义吧,毕竟没有一个函数叫parseNum()。
一个完整的parseInt应该是这样的:parseInt(string, radix),其中radix指定数字的进制(十进制,二进制,十六进制etc.)
parseInt("f",16): 15
由于上面已经提到过,加号会把数字转为字符串,但使用得体,加号会有一种化腐朽为神奇的逆天效果。把加号放在包含合法数字的字符串前面会将字符串转化为数字。这也不失为一种从字符串获得数字的好便捷方法。
"1.1"+"1.1"="1.11.1" //单纯的两个基老相加得到的还是基老
(+"1.1")+(+"1.1")=2.2//括号括起来先用加号把字符串转为数字再相加最后数字加数字得数字
将字符串转为数字的加号外面的括号是可选的。
也就是说这样其实也可以:
+"1.1"++"1.1"=2.2
千万表感到神奇,JavaScript就是有这么灵活。
但有点要注意的地方就是中间两个加号间要有空格。不然会有语法错误。

在浏览器中测试加号这一神奇功能时,出来的结果也与上面是相符的.

关于Null
Null 用成数字时会表现为0,做布尔时表现为false.


*一个感叹号表示将表达式取反,两个感叹号可以理解为取反的基础上再次取反,也可以理解为将一个表达式转换为布尔类型。
关于Undefined
声明一个变量但没有赋值,此时这个变量的值为undefined. Undefined用作数字时类型表现为NaN, 用作布尔时表现为false.

一个有点耐人寻味的现象是,虽然 1+a=NaN, 但1+a的类型是数字。

由此可以想到,NaN类型是不是也是一种数字类型,答案是肯定的。

但NaN代表的是Not-a-Number. NaN本质上还是一种数字类型多少还是说得通的,因为它表示指定的值无法用现有的数字类型来表达罢了。
继续看这个神奇的NaN类型,还有更无法用常规思维理解的地方。它居然不等于它自己!

看来有必需细究一下NaN的定义。其实NaN不是跟number, string等一样是一种内建类型,它只是一种属性,通过这个属性表示一个变量是不是一个合法的数字类型。通过调用全局函数isNaN()可以得出一个变量是不是非数字类型。
对于NaN不等于NaN, 或许我们可以这样理解,两个不是数字类型的变量没有必要相等,因为它不是数字类型意味着它可能是除了数字类型外的任何类型,比如一个是string, 一个是bool,所以!!(NaN===NaN)当然应该为false.
但事实真的是这样么,下现这个实验无情地把我又拉回了无尽的迷茫中。

分析下代码,从'hello' 字符串中试图获取一个数字出来,显示会失败,那么x就是一个NaN

然后将x赋给y,此刻我肯定能说x跟y是完全相等的两个NaN了吧,但结果着实有点不科学。
关于数字类型,还有个JavaScript中比较灵活的用法。试看一下typeof +""的输出。在没看结果前,我绝对猜不到结果居然会是数字类型。

之前也提到过,加号有转换作用,把一个变量转成数字。所以上面的代码严格来说是这样的:
Typeof(+"");
所以结果会是一个数字类型。
我只能说JavaScript设计得太灵活了,难怪经常有人抱怨这是世界上设计错误最多的语言没有之一。
如果带着问题去学习,真的是心累的一件事情啊。反正到这里我已经是头晕了。
JavaScript –类型之我晕的更多相关文章
- javascript类型与类型检测
1.javascript类型: 注:包装对象:如"hello".length实际为js为我们隐式创建了一个String临时对象,去调用该对象的length属性,调用过后再将该临时对 ...
- javascript类型注意事项
以下是javascript类型的注意事项: null:表示尚未存在的对象,注意,尽管尚未存在,也是个对象啊,所以用typeof检测一个null值变量的结果是Object:不过,为了便于写if语句,在j ...
- 谈谈JavaScript类型检测
javascript内置的类型检测机制并非完全可靠.比如typeof操作符,并不能准确的判断数据是哪个类型,比如:数组和对象就不能通过typeof来区分. typeof [] ==="o ...
- Javascript类型检测
原地址 http://www.cnblogs.com/fool/archive/2010/10/07/javascrpt.html 开门见山,我们先来看一下代码: var is = function ...
- JavaScript 类型浅解
对于JavaScript 类型,可简单地概括为:相对于强类型语言来说,它是弱(松散)类型的语言:有基本类型和引用类型,他们是区别是一个有固定空间存在于栈内存中,一个没有固定空间保存在堆内存中并且在栈内 ...
- JavaScript类型和语法
JavaScript类型和语法 一.类型 1.内置类型(null.undefined.boolean.number.string.object.symbol(es6中新增))(除对象之外,其它统称为基 ...
- JavaScript权威设计--JavaScript类型,值,变量(简要学习笔记三)
1.负号是一元求反运算 如果直接给数字直接量前面添加负号可以得到他们的负值 2.JavaScript中的运算超出了最大能表示的值不会报错,会显示Infinity. 超出最小也不报错,会显示-I ...
- JavaScript类型判断instanceof与typeof对比
经常有人会在JavaScript里写如下的方法: function checkType() { var s1 = 123; var s2 = "OK"; if (s1 instan ...
- JavaScript类型判断
几种方法:typeof,instanceof,Object.prototype.toString,constructor,duck type ES6引入了一种新的原始数据类型Symbol,表示独一无二 ...
随机推荐
- 从Elo Rating System谈到层次分析法
1. Elo Rating System Elo Rating System对于很多人来说比较陌生,根据wikipedia上的解释:Elo评分系统是一种用于计算对抗比赛(例如象棋对弈)中对手双方技能水 ...
- 转载:JAVA中关于set()和get()方法的理解及使用
对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...
- Keep It Simple Stupid!
Kelly Johnson提出了KISS原则.他是一个飞机工程师以及航空发明家,同时也是一个管理天才,他一生中主要设计了40多架飞机,获得的荣誉相当之多,总之,很牛. 这个原则是对Johnson带领的 ...
- 今天我们要说的画一个三角形,恩,画一个三角形,第一种呢是利用我们的html标签结合css来实现;而第二种方法就就是我们的html5新增的一个标签canves,这个canves就是网页画幕,那么顾名思义就是在网页里建造一个画板,用来画画,好,那接下来就和我一起去看看吧!
第一种方法:利用我们的html标签结合css来实现 span{ width:0px; height:0px; border-width:7px; border-style:solid; border- ...
- HTML的ul和li标签的使用
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- git 笔记
查看某个提交的修改:git show commitID 查看某个提交修改涉及的文件:git show commitID --oneline --name-status 清理掉没有入库的文件,并把修改了 ...
- Emgu CV播放视频
public partial class Form1 : Form { Capture _capture; public Form1() { Initializ ...
- RabbitMQ 记录
RabbitMQ 中文文档 : http://rabbitmq.mr-ping.com/description.html 官方教程译文: 一 http://blog.csdn.net/xiaoxian ...
- [转]ORACLE 审计功能
审计是对选定的用户动作的监控和记录,通常用于: u 审查可疑的活动.例如:数据被非授权用户所删除,此时安全管理员可决定对该 数据库的所有连接进行审计,以及对数据库的所有表的成功地或不 ...
- HP iLo2 试用序列号
HP iLo2 试用序列号 2 条回复 32Q8W-GKHTR-NPDKY-5CD79-T525H hp的ilo2功能实在太有用了,不用往那个恶劣的机房跑了,系统重装也直接远程完成. 这个试用序列号用 ...