JavaScript学习(一):弱类型

来源:互联网 发布:减少睡眠时间知乎 编辑:程序博客网 时间:2024/06/01 09:33

学习JavaScript推荐阅读《JavaScript语言精粹》,这真的是一本很好的书,这本书JavaScript这门语言的精粹从糟粕筛选了出来,这种做法可以让我这样的读者很清晰地知道在这门语言中我们应该学习什么而避免学习什么。这样可以节省我们的时间还可以使我们的学习更加“绿色”,因为我们学习的“精粹“而不是”糟粕“。

首先JavaScript与其他语言如,C、Java语言反差鲜明的一点是:它是一门弱类型的语言。

在一开始我对这样的变化很恐慌,但是在后来的学习中,我认识到:强类型的语言并不能让我们的测试工作变得轻松,因为因为类型而发生的错误往往不是我们所头痛的错误,但是我们总是疲于应对像“将整形123转换成字符串型123”这样没有意义的工作。

弱类型是自由的—— 《JavaScript语言精粹》

弱类型与强类型的区别就在于计算时是否可以在不同类型之间对使用者透明地隐性转换。

如果一个变量在计算时,无论它原来的类型是什么,它总能转换成所需要的正确的类型,好像所有类型都能进行运算一样,这样就叫做弱类型。与之相反,则为强类型。

例如在C语言(强类型)中,在进行运算时,算式中的类型会统一转换成最长的类型。例如:

  1. int型、float型与double型一起运算,前两项会转换成double型。
  2. int型与char型一起运算,char型则会转换成int形
  3. int型、double型与long long型一起运算,自然前两者会转换成long long型
var number=666;var string="666";var result=number+string;document.writeln(result);

你希望它打印1332,但实际上它会打印666666.
但这并不是错误,这是强类型语言与弱类型语言的差别,在JavaScript中,数字与字符串的拼接是非常容易实现的。

var string="666";string=string-"666";alert(typeof string);

吸取了上次的教训,你认为它的结果是什么?它的结果是“number”,是否有一点诧异?

var string="666";String.prototype.mmp=function(){return this;};alert(typeof string.mmp());alert(string.mmp());

学过Java都知道this在这个环境下可以理解成当前类的实例对象,既然是对象了那么typeof string.mmp()返回的值是object是毫无疑问的。

但是string.mmp()返回的明明是对象,但是却隐形地转换成了字符串”666”。

PS:prototype属性是下一片博客要讲解的内容。

总结:

一、减法、乘法、除法、取余
这些操作符会把他们操作的值的类型统统转换成数字,如果转换不成功的话,这些值的的结果就是NaN

NaN是一个数值,他表示一个不能通常正常计算产生的结果,NaN不等于任何值,包括它自己。

var test1 ={    value:function(){        var a=1-"2";        var b="66"-"55";        var c="666x"/666;        document.writeln(a);//-1        document.writeln(b);//11        document.writeln(c);//Nan    }}test1.value();  

二、比较运算符
规则同一,有两处需要注意一下:
1、但是当操作符两边都是字符串时,会执行字符串比较,从左至右依次比较每一个字符的ASCII码,出现符合操作符的情况返回true,否则false。无法将操作的值转换成数字的情况下,总是返回false。

Boolean(Nan)==false

2、当操作符两边都是对象时,当这两个对象的引用都指向同一个对象时才返回true否则返回false。

三、加法
规则同一。但是:
1、操作符两边都是字符串时,很自然地进行字符串拼接操作。
2、操作符一边是字符串,另一边是其他类型时,讲其他类型转换成字符串类型,再进行拼接操作

var test2={    var value=function(){        var a="66x"+"11y";        var b=6+6;        var c="66x"+6;        ducoment.writeln(a);//66x11y        ducoment.writeln(b);//12        ducoment.writeln(c);//66x6    }}test2.value();

DONE!

原创粉丝点击