数据类型
Number
JS不区分整数和浮点数,统一用Number。
123; // 整数123
0.456; // 浮点数0.456
1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5
-99; // 负数
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
Number可以直接做四则运算,规则和数学一致。
字符串
字符串是python风格的。单引号括起来和双引号括起来均可。
布尔值
true和false。 包括逻辑运算符也与C风格的完全一致。&&、||、!
比较运算符
其他等同C语言。但是在比较是否相等时要好好说道说道。
JS有两种相等运算符,一种是==
,一种是===
。
==
会自动转换数据类型再进行比较,所以可能会得到奇奇怪怪的结果。
===
不会自动转换类型,如果类型不同,直接返回false.
这是个JS设计的缺陷,我们要始终用===进行比较。
运用相等运算符时有个例外。NaN这个特殊的Number值,竟然与NaN不相等。
判断是否是NaN只能用isNaN(NaN);这个函数。它会返回true指示这是个NaN。
最后我们要特别注意浮点数相等的比较。
(1/3) === (1-2/3)会返回false.因为浮点数在计算过程中会有误差。
要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null和undefined
null表示值为空,undefined表示值未定义。并没有什么卵用。undefined仅仅在判断函数参数是否传递的情况下有用。没传递自然是未定义了。
数组
js的数组和python的list类似,不要求元素类型相等。
以下是一个合法的js数组。
[1, 2, 3.14, 'Hello', null, true];
还可以用Array函数创建数组,但是可读性很差劲。
new Array(1, 2, 3); // 创建了数组[1, 2, 3]
对象
JS的对象类似于python的字典:
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
是键值对的无序集合。
JavaScript对象的键都是字符串类型(无需用引号包裹,自动就是字符串),值可以是任意数据类型。上述person对象一共定义了6个键值对,其中每个键又称为对象的属性。
要获取一个对象的属性,我们用对象变量.属性名的方式:
person.name; // 'Bob'
person.zipcode; // null
变量
命名规则同Java语言一样。
字母、数字、下划线、$符号组成,数字不打头。
申明一个变量用var语句。
在JavaScript中,使用等号=对变量进行赋值。可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次:
var a = 123; // a的值是整数123
a = 'ABC'; // a变为字符串
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。
和静态语言相比,动态语言更灵活,就是这个原因。
要显示变量的内容,可以用console.log(x)
,打开Chrome的控制台就可以看到结果。
MAC-Chrome打开控制台:option+command+I(i)
使用console.log()代替alert()的好处是可以避免弹出烦人的对话框。但是其实效果都是差不多的。
strict模式
JS的设计缺陷:如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量:
i = 10; // i现在是全局变量
怎么启动strict模式?
在JavaScript代码的第一行写上:
'use strict';
这是一个字符串,不支持strict模式的浏览器会把它当做一个字符串语句执行,支持strict模式的浏览器将开启strict模式运行JavaScript。