数据类型的转换
概述
JavaScript
是一种动态类型语言,变量没有类型限制,可以随时赋予任意值。
1var x = y ? 1 : 'a';
上面代码中,变量x到底是数值还是字符串,取决于另一个变量y的值。y为true时,x是一个数值;y为false时,x是一个字符串。这意味着,x的类型没法在编译阶段就知道,必须等到运行时才能知道。
虽然变量的数据类型是不确定的,但是各种运算符对数据类型是有要求的。如果运算符发现,运算子的类型与预期不符,就会自动转换类型。比如,减法运算符预期左右两侧的运算子应该是数值,如果不是,就会自动将它们转为数值。
1'4' - '3' // 1
上面代码中,虽然是两个字符串相减,但是依然会得到结果数值1,原因就在于
JavaScript 将运算子自动转为了数值。
本章讲解数据类型自动转换的规则。在此之前,先讲解如何手动强制转换数据类型。
强制转换
强制转换主要指使用Number()、String()和Boolean()三个函数,手动将各种类型的值,分别转换成数字、字符串或者布尔值。
Numbe ...
其他运算符,运算顺序
void 运算符
void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。
12void 0 // undefinedvoid(0) // undefined
上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用圆括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7。
下面是void运算符的一个例子。
123var x = 3;void (x = 5) //undefinedx // 5
这个运算符的主要用途是浏览器的书签工具(Bookmarklet),以及在超级链接中插入代码防止网页跳转。
请看下面的代码。
123456<script>function f() { console.log('Hello World');}</script><a href="http://example.com" onclick="f(); ret ...
二进制位运算符
概述
二进制位运算符用于直接对二进制位进行计算,一共有7个。
二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。
二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。
二进制否运算符(not):符号为~,表示对一个二进制位取反。
异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。
左移运算符(left
shift):符号为<<,详见下文解释。
右移运算符(right
shift):符号为>>,详见下文解释。
头部补零的右移运算符(zero filled right
shift):符号为>>>,详见下文解释。
这些位运算符直接处理每一个比特位(bit),所以是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能使用它们,否则会使代码难以理解和查错。
有一点需要特别注意,位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。另外,虽然在
JavaScript
内部,数值都是以64位浮点数的形式储存,但是 ...
布尔运算符
概述
布尔运算符用于将表达式转为布尔值,一共包含四个运算符。
取反运算符:!
且运算符:&&
或运算符:||
三元运算符:?:
取反运算符(!)
取反运算符是一个感叹号,用于将布尔值变为相反值,即true变成false,false变成true。
12!true // false!false // true
对于非布尔值,取反运算符会将其转为布尔值。可以这样记忆,以下六个值取反后为true,其他值都为false。
undefined
null
false
0
NaN
空字符串('')
12345678910!undefined // true!null // true!0 // true!NaN // true!"" // true!54 // false!'hello' // false![] // false!{} // false
上面代码中,不管什么类型的值,经过取反运算后,都变成了布尔值。
如果对一个值连续做两次取反运算,等于将其转为对应的布尔值,与Boolean函数的作用相同。 ...
比较运算符
概述
比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件。
12 > 1 // true
上面代码比较2是否大于1,返回true。
注意,比较运算符可以比较各种类型的值,不仅仅是数值。
JavaScript 一共提供了8个比较运算符。
> 大于运算符
< 小于运算符
<= 小于或等于运算符
>= 大于或等于运算符
== 相等运算符
=== 严格相等运算符
!= 不相等运算符
!== 严格不相等运算符
这八个比较运算符分成两类:相等比较和非相等比较。两者的规则是不一样的,对于非相等的比较,算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较
Unicode 码点);否则,将两个运算子都转成数值,再比较数值的大小。
非相等运算符:字符串的比较
字符串按照字典顺序进行比较。
12'cat' > 'dog' // false'cat' > 'catalog' // false
JavaScript 引 ...
算术运算符
运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript
提供了多种运算符,覆盖了所有主要的运算。
概述
JavaScript 共提供10个算术运算符,用来完成基本的算术运算。
加法运算符:x + y
减法运算符: x - y
乘法运算符: x * y
除法运算符:x / y
指数运算符:x ** y
余数运算符:x % y
自增运算符:++x 或者
x++
自减运算符:--x 或者
x--
数值运算符: +x
负数值运算符:-x
减法、乘法、除法运算法比较单纯,就是执行相应的数学运算。下面介绍其他几个算术运算符,重点是加法运算符。
加法运算符
基本规则
加法运算符(+)是最常见的运算符,用来求两个数值的和。
11 + 1 // 2
JavaScript 允许非数值的相加。
12true + true // 21 + true // 2
上面代码中,第一行是两个布尔值相加,第二行是数值与布尔值相加。这两种情况,布尔值都会自动转成数值,然后再相加。
比较特殊的是,如果是两个字符串相加,这时加法运算符会变成连接运算符,返回一个新的字符串,将两个原字符串 ...
数组
定义
数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。
1var arr = ['a', 'b', 'c'];
上面代码中的a、b、c就构成一个数组,两端的方括号是数组的标志。a是0号位置,b是1号位置,c是2号位置。
除了在定义时赋值,数组也可以先定义后赋值。
12345var arr = [];arr[0] = 'a';arr[1] = 'b';arr[2] = 'c';
任何类型的数据,都可以放入数组。
123456789var arr = [ {a: 1}, [1, 2, 3], function() {return true;}];arr[0] // Object {a: 1}arr[1] // [1, 2, 3]arr[2] // function (){return true;}
上面数组arr的3个成员依次是 ...
函数
函数是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。
概述
函数的声明
JavaScript 有三种声明函数的方法。
(1)function 命令
function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。
123function print(s) { console.log(s);}
上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应的代码。这叫做函数的声明(Function
Declaration)。
(2)函数表达式
除了用function命令声明函数,还可以采用变量赋值的写法。
123var print = function(s) { console.log(s);};
这种写法将一个匿名函数赋值给变量。这时,这个匿名函数又称函数表达式(Function
Expression),因为赋值语句的等号右侧只能放表达式。
采用函数表达式声明函数时,function命令后面不带有 ...
对象
概述
生成方法
对象(object)是 JavaScript
语言的核心概念,也是最重要的数据类型。
什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
1234var obj = { foo: 'Hello', bar: 'World'};
上面代码中,大括号就定义了一个对象,它被赋值给变量obj,所以变量obj就指向一个对象。该对象内部包含两个键值对(又称为两个“成员”),第一个键值对是foo: 'Hello',其中foo是“键名”(成员的名称),字符串Hello是“键值”(成员的值)。键名与键值之间用冒号分隔。第二个键值对是bar: 'World',bar是键名,World是键值。两个键值对之间用逗号分隔。
键名
对象的所有键名都是字符串(ES6 又引入了 Symbol
值也可以作为键名),所以加不加引号都可以。上面的代码也可以写成下面这样。
1234var obj = { 'foo': 'Hello', & ...
字符串
概述
定义
字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。
12'abc'"abc"
单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号。
12'key = "value"'"It's a long journey"
上面两个都是合法的字符串。
如果要在单引号字符串的内部,使用单引号,就必须在内部的单引号前面加上反斜杠,用来转义。双引号字符串内部使用双引号,也是如此。
12345'Did she say \'Hello\'?'// "Did she say 'Hello'?""Did she say \"Hello\"?"// "Did she say "Hello"?"
由于 HTML 语言的属性值使用双引号,所以很多项目约定 JavaScript
语言的字符串只使用单引 ...
