布尔值
布尔值指真或假,开或关,是或否,关键字true和false。下面这些值会被转换成false:
- undefined
- null
- 0
- -0
- NaN
- "" // 空字符串
布尔值包含toString()方法,可以用这个方法将字符串转换为true或false。
如var b = true; b.toString() 则变成字符串"true"。
null和undefined
null是JavaScript的关键字,他表示一个特殊值,常用来描述空值,使用typeos(null)结果返回object,我们可以把它理解成一个特殊的对象,主要用来描述一个字符串,数组或者一个对象是空的没有值的。
JavaScript还有第二个用于表示空值undefined,它是变量的一种取值。
- 如果变量没有被初始化将被赋值为undefined。
- 如果查询对象属性或数组元素的值时,返回undefined则说明这个属性或元素不存在。
- 如果函数没有返回任何值,默认返回的是undefined。
- 引用没有提供实参的函数,形参的值是undefined。
undefined是预定义的全局变量(它和null不一样,它不是关键字),它的值就是未定义。在ECMAScript3中,undefined是可读/写的变量,可以给它赋予任意值,这个错误在ECMAScript5中做了修正。undefined在该版本中是只读的。如果使用typeof(undefined)会得到undefined,表名这个值是这个类型的唯一成员。
尽管null和undefined是不同的,但它们都表示空的值,两者往往可以互换,使用“==”会得到两者是相等的,如果使用“===”则两者是不相等的。null和undefined都不包含任何属性和方法。
全局对象
全局对象在JavaScript中有着重要的用途,全局对象的属性是全局定义的符号,JavaScript程序可以直接使用。当JavaScript解释器启动时(或者任何web浏览器加载新页面的时候),他将创建一个新的全局对象,并给它一组定义的初始属性:
- 全局属性:undefined,Infinity和NaN等
- 全局函数:isNaN(),parseInt()和eval()等
- 构造函数:Date(),RegExp(),String(),Object()和Array()等
- 全局对象:Math和JSON等
在代码的最顶级,不在任何函数内的JavaScript代码,可以使用JavaScript关键字this来引用全局对象。在客户端JavaScript中,在其表示的浏览器窗口中的所有JavaScript代码中,window对象充当了全局对象,这个全局window对象有一个属性window引用自身,可以代替this来引用全局对象。window对象定义了核心全局属性,但它也针对web浏览器和客户端JavaScript定义了以少部分其它全局属性。
包装对象
JavaScript对象是一种复合值,通过使用“对象.属性/方法”来引用属性或方法。字符串string它不是对象,但是却有属性和方法。这主要是因为当使用“字符串.方法”时JavaScript就会将字符串值通过调用new String()的方式转换成对象,这个对象继承了String类下的所有属性和方法,当引用结束后这个新创建的临时对象将会被销毁。数字和布尔值也有各自的属性和方法也是一样,它们是通过Number()和Boolean()构造函数创建一个临时对象,通过临时对象来调用类的属性和方法。null和undefined没有属于自己的类,所以也就不存在属性和方法了。
如下代码:
var s = "Hello"; s.len = 4; var t = s.len;
最终结果是t等于undefined,第二行代码创建一个临时字符串对象,并给对象封装len属性,赋值为4,其实第二行代码执行完后这个临时对象就被销毁了。所以第三行代码在接收s.len时此时s.len是一个新的临时对象。这个新的对象是没有值的,JavaScript默认给了一个undefined,所以最终t等于undefined。
不可变的原始值和可变的对象引用
原始值:undefined、null、布尔值、数字、字符串
可变对象:数组、函数、对象({键:值})。
原始值是不可更改的,任何方法都无法更改一个原始值。
例如:var s = "Hello";
s.toUpperCase();
toUpperCase()并不会将变量s中的字符串全部修改成大写,而是会返回一个新的大写字符串,不会对原数据进行修改。
原始值的比较是值的比较,只有在它们的值相等时它们才相等。如var a = 1;var b = 1我们可以说a和b是相等的,var a = "abc";var b = "abc"我们也可以说字符串a和字符串b是相等的。
但如果是对象的比较就不是值的比较了,如var a = [1,2,3];var b = [1,2,3];console.log(a === b);我们会得到结果是false,同样
var a = {"x":1};var b = {"x":1};console.log(a === b)得到的结果也是false。
我们通常将对象称为引用类型(引用一块内存地址),以此来和JavaScript的基本类型进行区分。对象的值都是引用,对象的比较是引用的比较。也就是判断两个对象是否相等,判断的是两个对象是否引用同一块内存地址。如var a = [1,2,3];var b = a;console.log(a === b);这样就会返回true了。因为a和b引用的是同一块内存。
思考题:
三位数的反转,如用户输入123,反转后输出321