JavaScript隐式类型转换的实现方法

  介绍

这篇文章主要讲解了JavaScript隐式类型转换的实现方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)。在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加。之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加:

 3 +正确;//4 

结果是一个数值型!如果是在C或Java者环境的话,上面的运算肯定会因为运算符两边的数据类型不一致而导致报错的!但是,在JavaScript中,只有少数情况下,错误类型才会导致出错,,如下:

“hello" (1);//错误:没有一个函数   null.x;//错误:无法读取属性& # 39;x # 39;空

,如下:

 2 + 3;//5
  “hello"+“;world";//澳愫脀orld" 

但是,如果字符串和数字相加,会是怎样的结果呢?,如下:

“2”;+ 3;//?3”;   2 +“3”;//?3”

,重要的事情说三遍! ! ! ! ! !

此外,需要注意的是,“+”的运算方向是从左到右的,如下:

 1 + 2 +“3“;;//?3”

这与下面是等价的:

 (1 + 2)+“3“;;//?3”

相比之下,下面的结果是不一样的:

 1 +“2”;+ 3;//?23“

但是,隐式类型转换,有时候,会隐藏一些错误的,比如,,如下:

 var x=南;
  x===南;//错误

虽然,,如下:

isNaN (“foo");//正确的   isNaN(定义);//正确的   isNaN ({});//正确的   isNaN({返回对象的值:“foo"});//真正的

上面代码,我们使用isNaN来测试后,发现字符串,没有定义,甚至对象,结果都返回真! ! !但是,我们总不能说他们也是南吧?总而言之,得出的结论是:isNaN检测南并不可靠! ! !

幸运的是,有一种可靠的并且准确的方法可以检测南。我们都知道,只有南是自己不等自己的,那么,我们就以使用不等于号(==)来判断一个数是否等于自身,从而,可以检测到南了,如下:

 

我们也可以把这种模式定义成一个函数,如下:

函数isReallyNaN (x) {
  返回x !==x;
  }

好的,奶奶的检测方法就是这么简单,我们下面继续讨论对象的隐式转换!

对象是可以转换成原始值的,最常见的方法就是把它转换成字符串,如下:

“数学对象:“+数学;//笆Ф韵?对象:数学),   “JSON对象:“;+ JSON;//癑SON对象(对象:JSON)“

对象转换成字符串是调用了他的烤面包函数的,你可以手动的调用它来检测一下:

Math.toString ();//癧数学对象]“;   JSON.toString ();//癧JSON对象]“

类似的,对象也是可以转换成数字的,他是通过返回对象的值函数的,当然,你也是可以自定义这个返回对象的值函数的,如下:

“J"+ {toString:函数(){返回“S";}};//癑S"   2 *{返回对象的值:函数(){返回3;}};//6

如果,一个对象同时存在的方法和toString方法,那么,返回对象的值方法总是会被优先调用的,如下:

 var obj={
  toString:函数(){
  返回“[MyObject对象]“;
  },
  返回对象的值:函数(){
  返回17;
  }
  };
  “对象:“+ obj;//岸韵?17“

最后一种强制类型转换,我们常常称之为“真值运算”,比如,如果| |,,,,他们的操作数不一定是布尔型的额.JavaScript会通过简单的转换规则,将一些非布尔类型的值转换成布尔型的。大多数的值都会转换成事实,只有少数的是假的,他们分别是:假的,0,0,““,NaN, null,定义,因为存在数字和字符串以及对象的值为false,所以,直接用真值转换来判断一个函数的参数是否传进来了,这是不不太安全的。比如,有一个可以具有默认值得可选参数的函数,如下:

功能点(x, y) {
  如果(x) {
  x=320;
  }
  如果(y) {
  y=240;
  }
  返回{x, x, y, y};
  }

点(0,0);//{x: 320 y: 240} 

检测未定义的更加准确的方法是用“操作:

JavaScript隐式类型转换的实现方法