javascript教程隐式类型转换如何操作

在学习javascript(http://www.maiziedu.com/course/web/229-1988/)中,我们都发现JavaScript的数据类型是非常弱的!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加。之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加:
3 + true; // 4
结果是一个数值型!如果是在C或者Java环境的话,上面的运算肯定会因为运算符两边的数据类型不一致而导致报错的!但是,在JavaScript中,只有少数情况下,错误类型才会导致出错,比如调用非函数,或者读取null或者undefined的属性时,如下:
"hello"(1); // error: not a function
null.x; // error: cannot read property ‘x‘ of null
多数情况下,JavaScript都不会出错的,而是自动的进行相应的类型转换。比如-, *, /,和%等算术运算符都会把操作数转换成数字的,但是“+”号就有点不一样了,有些情况下,它是算术加号,有些情况下,是字符串连接符号,具体的要看它的操作数,如下:
2 + 3; // 5
"hello" + " world"; // "hello world"
但是,如果字符串和数字相加,会是怎样的结果呢?JavaScript会自动把数字转换成字符的,不管数字在前还是字符串在前,如下:

"2" + 3; // "23"
2 + "3"; // "23"
字符串和数字相加结果是字符串,字符串和数字相加结果是字符串,字符串和数字相加结果是字符串,重要的事情说三遍!!!!!!
此外,需要注意的是,“+”的运算方向是从左到右的,如下:
1 + 2 + "3"; // "33"
这与下面是等价的:
(1 + 2) + "3"; // "33"
相比之下,下面的结果是不一样的:
1 + "2" + 3; // "123"
但是,隐式类型转换,有时候,会隐藏一些错误的,比如,null会转换成0,undefined会转换成NaN。需要注意的是,NaN和NaN是不相等的(这是由于浮点数的精度决定的),如下:
var x = NaN;
x === NaN; // false
虽然,JavaScript提供了isNaN来检测某个值是否为NaN,但是,这也不太精确的,因为,在调用isNaN函数之前,本身就存在了一个隐式转换的过程,它会把那些原本不是NaN的值转换成NaN的,如下:

isNaN("foo"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN({ valueOf: "foo" }); // true
上面代码,我们使用isNaN来测试后,发现字符串,undefined,甚至对象,结果都返回真!!!但是,我们总不能说他们也是NaN吧?总而言之,得出的结论是:isNaN检测NaN并不可靠!!!
幸运的是,有一种可靠的并且准确的方法可以检测NaN。我们都知道,只有NaN是自己不等自己的,那么,我们就以使用不等于号(!==)来判断一个数是否等于自身,从而,可以检测到NaN了,如下:
var a = NaN;
a !== a; // true
var b = "foo";
b !== b; // false
var c = undefined;
c !== c; // false
var d = {};
d !== d; // false
var e = { valueOf: "foo" };
e !== e; // false

我们也可以把这种模式定义成一个函数,如下:
function isReallyNaN(x) {
return x !== x;
}
OK,NaN的检测方法就是这么简单,我们下面继续讨论对象的隐式转换!
对象是可以转换成原始值的,最常见的方法就是把它转换成字符串,如下:
"the Math object: " + Math; // "the Math object: [object Math]"
"the JSON object: " + JSON; // "the JSON object: [object JSON]"
对象转换成字符串是调用了他的toSting函数的,你可以手动的调用它来检测一下:
Math.toString(); // "[object Math]"
JSON.toString(); // "[object JSON]"
类似的,对象也是可以转换成数字的,他是通过valueOf函数的,当然,你也是可以自定义这个valueOf函数的,如下:
"J" + { toString: function() { return "S"; } }; // "JS"
2 * { valueOf: function() { return 3; } }; // 6
如果,一个对象同时存在valueOf方法和toString方法,那么,valueOf方法总是会被优先调用的,如下:
var obj = {
toString: function() {
return "[object MyObject]";
},
valueOf: function() {
return 17;
}
};
"object: " + obj; // "object: 17"
但是,多数情况下,这都不是我们想要的,一般的,尽可能使valueOf和toString表示的值相同(尽管类型可以不同)。
最后一种强制类型转换,我们常常称之为“真值运算”,比如,if, ||, &&,他们的操作数不一定是布尔型的额。JavaScript会通过简单的转换规则,将一些非布尔类型的值转换成布尔型的。大多数的值都 会转换成true,只有少数的是false,他们分别是:false, 0, -0, ”", NaN, null, undefined,因为存在数字和字符串以及对象的值为false,所以,直接用真值转换来判断一个函数的参数是否传进来了,这是不不太安全的。比如, 有一个可以具有默认值得可选参数的函数,如下:
function point(x, y) {
if (!x) {
x = 320;
}
if (!y) {
y = 240;
}
return { x: x, y: y };
}
这个函数会忽略任何的真值为假的参数的,包括0,-0;
point(0, 0); // { x: 320, y: 240 }
检测undefined的更加准确的方法是用typeof操作:
function point(x, y) {
if (typeof x === "undefined") {
x = 320;
}
if (typeof y === "undefined") {
y = 240;
}
return { x: x, y: y };
}
这种写法,可以区分开0和undefined的:
point(); // { x: 320, y: 240 }
point(0, 0); // { x: 0, y: 0 }
另外一种方法是利用参数跟undefined作比较,如下:
if (x === undefined) { ... }
总结:
1. 类型错误有可能会被类型转换所隐藏。
2. “+”既可以表示字符串连接,又可以表示算术加,这取决于它的操作数,如果有一个为字符串的,那么,就是字符串连接了。
3. 对象通过valueOf方法,把自己转换成数字,通过toString方法,把自己转换成字符串。
4.具有valueOf方法的对象,应该定义一个相应的toString方法,用来返回相等的数字的字符串形式。
5.检测一些未定义的变量时,应该使用typeOf或者与undefined作比较,而不应该直接用真值运算。
关于JavaScript隐式类型转换就给大家介绍到这里,希望对大家有所帮助!

时间: 2024-10-29 19:08:12

javascript教程隐式类型转换如何操作的相关文章

javascript的隐式类型转换(使(a==1&&a==2&&a==3) 成立)

一些团队规定禁用 == 运算符换用=== 严格相等.以工程标准衡量,== 带来的便利性抵不上其带来的成本,团队协作时候你看到别人代码中的 ==,有些时候需要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,增加了一些额外的成本.但是我比较喜欢的一本书  You don't know JS,中作者也写道过一个我比较赞同的观点 Many developers feel that === is more predictable, so they advocate always u

有趣的JavaScript隐式类型转换

JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加: 3 + true; // 4 结果是一个数值型!如果是在C或者Java环境的话,上面的运算肯定会因为运算符两边的数据类型不一致而导致报错的!但是,在JavaScript中,只有少数情况下,错误类型

「译」JavaScript 的怪癖 1:隐式类型转换

原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 [此贴子是 javascript 的 12 个怪癖(quirks) 系列的第一篇.] JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型. 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字: > '5' - '2' 3 > '5' * '2' 10 自动转

JavaScript隐式类型转换

编程中少不了将某个数据类型转换成另一种数据类型.其中通过函数或者方法调用以及强制转换称为显示转换,相反的,在"不知情"的情况下"有意"的进行的转换,则称为隐士转换. 运算符中的隐士类型转换 比较常见隐士类型转换,很多语言中都存在的.这里仅仅说说JavaScript中存在的. 1."+"运算符 function add(){ var a ='2'; var b =2; var c = a + b; console.info(c); //输出22 c

Javascript显示和隐式类型转换

1.转换成字符串 多数的JavaScript宿主环境(比如Node.js和Chrome)都提供了全局函数toString: 与此同时Object.prototype也定义了toString方法,使得所有对象都拥有转换为字符串的能力. 比如一个Number转换为String: var n = 1; n.toString(); // '1' toString接受一个参数指定进制,默认为10. 可以利用这个参数生成包括字母和数字的随机字符串: Math.random().toString(36).su

scala学习手记35 - 隐式类型转换

先来看一下下面的内容: 2 days "ago" 5 days "from_now" 如上的内容具体应该是什么呢?不过怎么看也不像是代码.不过既然是在学代码,拿不是代码的东西出来做什么! 非要强说是代码的话,那么执行起来肯定是要报错的--因为scala的Int和RichInt,以及Integer中都没有days这样的方法: 如果说不是代码的话,那么scala中的to或until本来看起来也不像代码: 2 to 6 2 until 7 现在剩下的就是怎么为整型值添加上

JavaScript的隐式转换

原文:JavaScript的隐式转换 JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object.object是引用类型,其它的五种是基本类型或者是原始类型.我们可以用typeof方法打印来某个是属于哪个类型的.不同类型的变量比较要先转类型,叫做类型转换,类型转换也叫隐式转换.隐式转换通常发生在运算符加减乘除,等于,还有小于,大于等.. typeof '11' //string typeof(11) //number '1

JS 基础1: 理解number 数据类型 和隐式类型转换

1, Javascript only has one type of numberic data, named "number". You can see this reflected in the behavior of the typeof operator, which classifies intergers and floating-point numbers alike simply as numbers: typeof 10; // "number"

c++隐式类型转换和explicit

什么是隐式转换? 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了哪些转换. 为什么要进行隐式转换? C++面向对象的多态特性,就是通过父类的类型实现对子类的封装. 通过隐式转换,你可以直接将一个子类的对象使用父类的类型进行返回. 在比如,数值和布尔类型的转换,整数和浮点数的转换等. 某些方面来说,隐式转换给C++程序开发者带来了不小的便捷. C++是一门强类型语言,