JavaScript类型
# Undefined
类型表示未定义,它的类型只有一个值,就是 undefined。任何变量在赋值前是 Undefined 类型、值为 undefined, undefined 是一个变量,而并非是一个关键字,这是 JavaScript 语言公认的设计失误之一
在2009年ECMAScript 5 (opens new window)修复了全局undefined不可修改。但是在对象和局部函数内部还是可以作为一个变量使用修改 所以,我们为了避免无意中被篡改,我建议使用 void 0 来获取 undefined 值。因为 「void 0」的执行结果永远是「undefined」
# 在现代浏览器中,全局的undefined的值将不能被重写
ECMAScript 5 (opens new window) 15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
undefined 的值是 undefined。这个属性有不可写,不可枚举,不可配置的特性。 undefined === void 0
// 在标准浏览器下作为全局作用域下 window的属性undefined是不可修改;
window.undefined='text-1'
console.log(undefined)//undefined
2
3
4
# 但对于一个普通对象或者在函数内部还是可以修改的
// 普通对象,undefined可作为属性且可以修改。
var obj={
undefined:"text"
}
console.log(obj.undefined) //"text"
// 在函数内部 undefined 可作为局部变量重新赋值
function fn(){
var undefined=true
console.log(undefined)
}
fn()//true
2
3
4
5
6
7
8
9
10
11
12
# Null
Null 表示的是:“定义了但是为空,Null 类型也只有一个值,就是 null,它的语义表示空值,与 undefined 不同,null 是 JavaScript 关键字,所以在任何代码中,你都可以放心用 null 关键字来获取 null 值。
# Boolean
Boolean 类型有两个值, true 和 false,它用于表示逻辑意义上的真和假,同样有关键字 true 和 false 来表示两个值。
# String
String 用于表示文本数据。String 有最大长度是 2^53 - 1,这在一般开发中都是够用的,但是有趣的是,这个所谓最大长度,并不完全是你理解中的字符数。因为 String 的意义并非“字符串”,而是字符串的 UTF16 编码,我们字符串的操作 charAt、charCodeAt、length 等方法针对的都是 UTF16 编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。
# Number
Number 类型表示我们通常意义上的“数字”。这个数字大致对应数学中的有理数,当然,在计算机中,我们有一定的精度限制。另外,值得注意的是,JavaScript 中有 +0 和 -0,在加法类运算中它们没有区别,但是除法的场合则需要特别留意区分,“忘记检测除以 -0,而得到负无穷大”的情况经常会导致错误
# 双精度浮点数
根据双精度浮点数的定义,Number 类型中有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff,所以 Number 无法精确表示此范围外的整数。
支持数值范围是:-2^53~2^53,即:- 9007199254740991(0x1FFFFFFFFFFFFF)~9007199254740991(0x1FFFFFFFFFFFFF)。
# 浮点数
同样根据浮点数的定义,非整数的 Number 类型无法用 ==(=== 也不行) 来比较,一段著名的代码,这也正是我们第三题的问题,为什么在 JavaScript 中,0.1+0.2 不能 =0.3:
console.log( 0.1 + 0.2 == 0.3);
这是浮点运算的特点,也是很多同学疑惑的来源,浮点数运算的精度问题导致等式左右的结果并不是严格相等,而是相差了个微小的值。 所以实际上,这里错误的不是结论,而是比较的方法,正确的比较方法是使用 JavaScript 提供的最小精度值:
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);
检查等式左右两边差的绝对值是否小于最小精度,才是正确的比较浮点数的方法。这段代码结果就是 true 了。Symbol
# Symbol
Symbol 是 ES6 中引入的新类型,它是一切非字符串的对象 key 的集合,在 ES6 规范中,整个对象系统被用 Symbol 重塑。
# Object
在 JavaScript 中,对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是 key-value 结构,key 可以是字符串或者 Symbol 类型。
提到对象,我们必须要提到一个概念:类。因为 C++ 和 Java 的成功,在这两门语言中,每个类都是一个类型,二者几乎等同,以至于很多人常常会把 JavaScript 的“类”与类型混淆。
事实上,JavaScript 中的“类”仅仅是运行时对象的一个私有属性,而 JavaScript 中是无法自定义类型的。