1. 概述
JavaScript一共有7种数据类型:
- 数值(number):整数和小数
- 字符串(string):文本(比如
Hello World)。 - 布尔值(boolean):表示真伪的两个特殊值,即
true(真)和false(假) undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值null:表示空值,即此处的值为空。- 对象(object):各种值组成的集合。
- 符号(symbol):ES6新增。暂不讨论。
一般将number,string,boolean视为原始类型(primitive type)的值,对象则称为合成类型(complex type)的值,undefined和null为JS特有的特殊的值。
对象又可以分为三个子类型:
- 狭义的对象(object)
- 数组(array)
- 函数(function)
需要注意的是array和function并不是七种类型之一。
2. 数值
- 所有数字都是以64位浮点数形式储存(很浪费)
- 小数运算不精确
0.1 + 0.2
0.30000000000000004
- JavaScript的精度范围为-253到253 ,能够表示的数值范围为21024到2-1023
- 数值的进制:开头有0要小心
- 十进制:没有前导0的数值。
- 八进制:有前缀
0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。 - 十六进制:有前缀
0x或0X的数值。 - 二进制:有前缀
0b或0B的数值。
0xff // 255
0o377 // 255
0b11 // 3
- 特殊数字
NaN:Not a Number+Infinity,-Infinity
3. 字符串
- JavaScript 不仅以 Unicode 储存字符,还允许直接在程序中使用 Unicode 码点表示字符,即将字符写成
\uxxxx。但 JavaScript 对 UTF-16 的支持是不完整的,只编到U+FFFF。 - 空字符串:
'' - 多行字符串
var a = '123' +
'456';
var a = `123
456`;
- 转义符
\n :换行符(\u000A)
\r :回车键(\u000D)
\' :单引号(\u0027)
\" :双引号(\u0022)
\\ :反斜杠(\u005C)
\0 :null(\u0000)
\b :后退键(\u0008)
\f :换页符(\u000C)
\t :制表符(\u0009)
\v :垂直制表符(\u000B)
- Base64 转码
btoa():任意值转为 Base64 编码atob():Base64 编码转为原来的值- 要将非 ASCII 码字符转为 Base64 编码,必须中间插入一个转码环节,再使用这两个方法
4. 布尔值
- 布尔值代表“真”和“假”两个状态。“真”用关键字
true表示,“假”用关键字false表示。布尔值只有这两个值。 - 运算符号
前置逻辑运算符:! (Not)
相等运算符:===,!==,==,!=
比较运算符:>,>=,<,<=
- 以下6个值转化为Boolean时为
false,称为falsy(虚值)。undefined null false 0 NaN ""或''(空字符串)
5. null 和 undefined
- 都表示没有值,
null表示空值,即该处的值现在为空。undefined表示“未定义”。
undefined == null // true
- (习俗)如果你想表示一个还没赋值的对象,就用
null。如果你想表示一个还没赋值的字符串/数字/布尔/symbol,就用undefined(但是实际上你直接var xxx一下就行了,不用写var xxx = undefined)
6. 对象
- 对象就是一组“键值对”(key-value)的集合,是就是几种基本数据类型(无序地)组合在一起。
- 因此对象里面也可以有对象
- key必须为字符串,不符合标识符条件必须加引号(更多人不喜欢加)。
- 属性读取:有两种方法,一种是使用点运算符,还有一种是使用方括号运算符
- 符合标识符规则时,
object['key']可以写作object.key - 如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。注意
object['key']与object[key]区别
- 符合标识符规则时,
- 属性删除:
delete object['key']- 查询该属性值为undefined,此时key也删掉了,用in查为false
- 如果给key赋值undefined,用in查为true
- 属性查看:
Object.keys - 属性是否存在:用
in运算符,自身和继承的都能看到。
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
- 属性遍历:
for...in- 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
- 它不仅遍历对象自身的属性,还遍历继承的属性。
7. typeof 运算符
typeof可以用来判断数据类型,但是存在两个bug:
typeof null //'object'- 并没有function数据类型,但会显示
function f() {}
typeof // "function"