一、自动转换为布尔值---Boolean( if语句 的条件部分)
1)当JavaScript遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值。
它的转换规则请参考博文《javascript---强制数据类型转换》中Boolean部分,也就是说,在预期为布尔值的地方,系统内部会自动调用Boolean方法。
因此除了以下六个值,其他都是自动转为true:
> undefined
> null
> +0
> -0
> NaN
> '' 空数组
二、自动转换为字符串---String
当JavaScript遇到预期为字符串的地方,就会将非字符串的数据自动转为字符串,转换规则与“强制转换为字符串”相同。
1)字符串的自动转换,主要发生在 加法运算 时。当一个值为字符串,另一个值为非字符串,则后者转为字符串。
运算子之中,只要有一个是字符串,则另一个不管是什么类型,都会被自动转化为字符串,然后执行字符串连接运算。通俗说就是:加号(+)两边只要有字符串,就把相应的值转化成字符串,然后做字符串连接操作
ex:
6 + "abc" // "6abc"
"a" + 2 // "a2"
三、自动转换为数值
1)除了加法运算符有可能把运算子转为字符串外,其他运算符---减乘除 都会把两侧的运算子自动转成数值。
当JavaScript遇到预期为数值的地方,就会将参数值自动转换为数值,转换规则与“强制转换为数值”相同。
ex:
"5" - "2" // 3
"5" * "2" // 10
true - 1 // 0
false -1 // -1
"1" - 1 // 0
"5" * [] // 0
false / "5" // 0
"abc" - 1 // NaN --- "abc"转化成数值是NaN,和NaN做任何数值运算结果都是NaN
*以上是二元算数运算符的例子,JavaScript的两个一元算数运算符——正号(+)和负号(-)也会把运算子自动转为数值。
ex:
+ "abc" // NaN
- "abc" // NaN
+ true // 1
- false // 0
- "5" // -5
2)运算子为数值或布尔值的时候,布尔值自动转换成数值
这种情况下,执行加法运算,布尔值转为数值(true为1,fal se为0)。
ex:
true + 5 // 6
true + false // 1
true + true // 2
5 - true // 4
true * 8 // 8
四、运算子中存在对象
运算子之中存在对象(或者准确地说,存在非原始类型的值),则先调用该对象的val ueOf方法。如果返回结果为原始类型的值,则运用上面的规则;否则继续调用该对象的toString方法,对其返回值运用上面两条规则。
ex:
1 + [1,2] // "11,2" --- 先调用[1,2].val ueOf(),结果还是数组[1,2]本身,则继续调用[1,2].toString(),结果字符串“1,2”,所以最终结果为字符串“11,2”。
1 + {a:1} // "1[object Object]" --- 先调用{a:1}的valueOf方法,返回的就是这个对象的本身,因此接着对它调用toString方法。({a:1}).toString()默认返回字符串"[object Object]",所以最终结果就是字符串“1[object Object]”
{ a : 1 } + 1 // 1 --- JavaScript引擎不将{a:1}视为对象,而是视为一个代码块,这个代码块没有返回值,所以被忽略。因此上面的代码,实际上等同于 {a:1};+1 ,所以最终结果就是1。为了避免这种情况,需要对{a:1}加上括号。如下
( { a : 1 } ) + 1 // "[object Object]1" ---- 将{a:1}放置在括号之中,由于JavaScript引擎预期括号之中是一个值,所以不把它当作代码块处理,而是当作对象处理,所以最终结果为“[object Object]1”。
五、四个特殊表达式
1)空数组 + 空数组
[] + [] // "" --- 首先,对空数组调用valueOf方法,返回的是数组本身;因此再对空数组调用
toString方法,生成空字符串;所以,最终结果就是空字符串。
2)空数组 + 空对象
[ ] + { } // "[object Object]" --- 这等同于空字符串与字符串“[object Object]”相加。因此,结果就是“[object Object]”。
3)空对象 + 空数组
{ } + [] // 0 --- JavaScript引擎将空对象视为一个空的代码块,加以忽略。因此,整个表达式就
变成“+ []”,等于对空数组求正值,因此结果就是0。
转化过程如下:+ [ ]
// Number ( [ ] )
// Number ( [ ] . toString ( ) )
// Number ( " " )
// 0
如果JavaScript不把前面的空对象视为代码块,则结果为字符串“[object Object]”。
( { } ) + [ ] // "[object Object]"
4)空对象 + 空对象
{ } + { } // NaN --- JavaScript同样将第一个空对象视为一个空代码块,整个表达式就变成“+ {}”。这时,后一个空对象的Val ueOf方法得到本身,再调用toSting方法,得到字符串“[object Object]”,然后再将这个字符串转成数值,得到NaN。所以,最后的结果就是NaN。
转化过程如下: + { }
// Number( { } )
// Number( { } . toString ( ) )
// Number( " [object Object ] " )
如果,第一个空对象不被JavaScript视为空代码块,就会得到“[object Object][object Object]”的结果。
( { } ) + { } / / " [object Object][object Object] "
( { } + { } ) / / " [object Object][object Object] "
console . log ( { } + { } ) / / " [object Object][object Object]"
var a = { } + { } ; a / / "[object Object][object Object] "
需要指出的是,对于第三和第四种情况,Node.j s的运行结果不同于浏览器环境。
{ } + { } / / " [object Object] [object Object]"
{ } + [ ] / / " [object Object] "
可以看到,Node.j s没有把第一个空对象视为代码块。原因是Node.j s的命令行环境,内部执行机制大概是下面的样子:
eval . call ( this , " ( function ( ) { return { } + { } } ) . call ( this ) " )
Node.j s把命令行输入都放在eval中执行,所以不会把起首的大括号理解为空代码块加以忽略。
相关推荐
类型转换是网页编程不可或缺的内容,本文先介绍自动类型转换,接着是强制性的显式类型转换,最后如何将基本数据类型提升为对象。 JavaScript的数据类型分为基本数据类型和复合数据类型。复合数据类型主要有对象、...
本文主要介绍了Javascript的基本数据类型和数据类型的转换规则。具有很好的参考价值,需要的朋友可以看下
当绝没有弱类型那么随便,也就是说变量在声明时不需要指定数据类型,变量由赋值操作确定数据类型),所以在JavaScript的类型转换中就存在了强类型语言所没有的隐式转换。 1.1 JavaScript中的隐式转换(自动类型转换) ...
JavaScript是一种无类型语言,但同时JavaScript提供了一种灵活的自动类型转换的处理方式。基本规则是,如果某个类型的值用于需要其他类型的值的环境中,JavaScript就自动将这个值转换成所需要的类型。
javascript中,变量可以赋予任何类型的值。但是运算符对数据类型是有要求的,如果运算符的类型与预期不符,就会自动转换类型。数据类型除了可以自动转换以外,还可以手动强制转换。
Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改变。请看示 例: var n = 10; n = "hello CSSer!"; n = {}; 上面的示例中,首先声明n变量并初始化其值...
我们都知道JavaScript是一门弱类型(或称动态类型)的语言,即变量的类型是不确定的。 var num = 123 ; //123 var num = 'HAHAHA' + num ;...这种数据类型的转换大多数情况下都是自动转换的,但有时却是需要手动强
javascript中,变量可以赋予任何类型的值。但是运算符对数据类型是有要求的,如果运算符的类型与预期不符,就会自动转换类型。数据类型除了可以自动转换以外,还可以手动强制转换。
JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object。object是引用类型,其它的五种是基本类型或者是原始类型。 比如像是Number() ,还是parseInt() 、parseFloat()都属于显示类型...
JavaScript是一种无类型语言,但同时JavaScript提供了一种灵活的自动类型转换的处理方式。基本规则是,如果某个类型的值用于需要其他类型的值的环境中,JavaScript就自动将这个值转换成所需要的类型。
9.36 使用JavaScript向表格中写入数据 9.37 类C# GridView的编辑效果(一) 9.38 类C# GridView的编辑效果(二) 第10章 单选框和复选框 10.1 选择了哪一个单选框 10.2 单击文字实现单选框的选定 10.3 被选中的复选...
当您存储数据时,Argon会为每种本机javascript数据类型添加类型提示。 在检索过程中使用类型提示来自动以其本机格式返回数据。 这甚至适用于功能。安装克隆仓库或通过凉亭安装bower install argon用法氩气将自身...
9.36 使用JavaScript向表格中写入数据 9.37 类C# GridView的编辑效果(一) 9.38 类C# GridView的编辑效果(二) 第10章 单选框和复选框 10.1 选择了哪一个单选框 10.2 单击文字实现单选框的选定 10.3 被选中的复选...
Calculate1.java 计算浮点数运算结果并调用页面中JavaScript函数的Applet。 Calculate1.class Calculate1.java的字节码文件。 第16章(\c16) 示例描述:介绍JavaScript访问本地文件的各种方法。 16.1....
1_3.htm JavaScript中的强制类型转换。 1_4.htm 在HTML中为JavaScript传递变量。 1_5.htm 在HTML中引用JavaScript的变量。 1_6.htm 比较undefined和"undefined"。 第2章(\2) 示例描述:客户端的流程控制...
一般存在四种情况,JavaScript会对变量的数据类型进行转换。 目录 * if中的条件会被自动转为Boolean类型 * 会被转为false的数据 * 会被转为true的数据 * 参与+运算都会被隐式的转为字符串 * 会被转为空字符串的...
1_3.htm JavaScript中的强制类型转换。 1_4.htm 在HTML中为JavaScript传递变量。 1_5.htm 在HTML中引用JavaScript的变量。 1_6.htm 比较undefined和"undefined"。 第2章(\2) 示例描述:客户端的流程控制...
JavaScript是一的种解释型、基于对象的脚本语言,被设计用来向 HTML 页面添加交互... JavaScript 是一种宽松类型的语言,不必显式定义变量的数据类型,在大多数情况下, JavaScript 将根据需要自动进行数据类型转换。
Number、String函数是特殊的函数,在JS引擎中,他会自动判断是作为构造函数调用还是普通调用,所以既可以使用new关键字,也可以作为函数直接调用。