一、简介
JavaScript 的数据类型有 7 种:
- 数值(number)
- 字符串(string)
- 布尔值(boolean)
- undefined
- null
- 对象(object)
- Symbol(ES6 中新增的类型,表示独一无二的值)
对象时复杂的数据类型,它有分为三个子类型:
- 狭义的对象
- 数组(array)
- 函数(function)
二、typeof
JavaScript 中判断一个数据的类型,有三种方法:
typeof运算符instanceof运算符Object.prototype.toString方法
下面来介绍 typeof 运算符:
| 数据类型 | 返回值 |
|---|---|
| 数值 | number |
| 字符串 | string |
| 布尔值 | boolean |
| null | object |
| 侠义的对象 | object |
| 函数 | function |
| 数组 | object |
| 未声明的变量 | undefined |
通过上面的介绍,这里说一个例子:
//错误写法
if(v){//....
}
// ReferenceError: v is not defined//正确写法
if(typeof v === "undefined"){//....
}
复制代码还有两种方法后边会继续介绍。
三、null和dundefinded
- 两者都表示“没有”。
- 在 if 语句中都会被自动转化为 false
null表示空对象,转化数值时为0;undefined表示无定义的值,转化数值时为NaN
四、布尔值
我们在做if...else判断时,会转化判断数据为true或false。转换规则时除了下面六个值为false,其他都视为true:
- undefined
- null
- 0
- "" 或 ''(空字符串)
- NaN
- false
五、数值
这里主要讲到NaN 、Infinity 和 数值相关函数
- NaN
NaN 是 JavaScript 中的特殊数值,数据类型依然是 number。它不等于任何值,包括它本身。
typeof NaN //number
NaN === NaN //false
NaN.indexof(NaN) // -1
Boolean(NaN)// false
复制代码- Infinity
//`Infinity`表示无穷大。有正负之分。
//`0`乘以`Infinity`,返回`NaN`;0除以`Infinity`,返回`0`;`Infinity`除以`0`,返回`Infinity`。
//`Infinity`与`undefined`计算,返回的都是NaN。
//`Infinity`加上或乘以`Infinity`,返回的还是`Infinity`。
//`Infinity`与`null`计算时,`null`会转成`0`,等同于与0的计算。
复制代码- 与数值相关的全局方法
| 方法 | 用法 |
|---|---|
parseInt() | 1. 用于把字符串转化为整数 2. 如果参数不是字符串,则会先转化为字符串在转换 3. 如果字符串的第一个字符不能转化为数字(正负号除外),返回NaN 4. 有两个参数,第二个参数代表按照规定进制转换 |
parseFloat() | 1. 用于将一个字符串转为浮点数 2. 如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN |
isNaN() | 用来判断一个值是否为NaN,但是只对数值有效,如果传入其他值,会被先转化为数值。 |
isFinite() | 返回一个布尔值,表示值是否为正常数值。除了Infinity、-Infinity、NaN和undefined返回false,对于其他数值都返回true |
六、字符串
- 字符串可以视为字符串数组,所以可以使用数组的方括号运算符,如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。
- 有
length属性
七、对象
- 如果不同的变量名指向同一个对象,那么他们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个,会影响到其他所有变量。
- 属性的读取有两种方法,如读取
p属性:obj.p和obj['p'] - 查看所有属性,可以用
Object.keys()方法 - 删除属性,使用
delete命令,如删除 obj 的 p 属性delete obj.p - 属性是否存在,使用
in运算符 - 属性的遍历,使用
for...in循环
with 语句: 它的作用是操作同一个对象的多个属性时,提供一些书写的方便。
// 例一
var obj = {p1: 1,p2: 2,
};
with (obj) {p1 = 4;p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5;
复制代码八、函数
- 函数声明的三种方法:
function命令
function print(s) {console.log(s);
}
复制代码- 函数表达式
var print = function(s) {console.log(s);
};
复制代码- Function 构造函数
var add = new Function('x','y','return x + y'
);// 等同于
function add(x, y) {return x + y;
}
复制代码- 如果同一个函数被多次声明,后面的声明会覆盖前面的声明。
- 函数可以调用自身,这就是递归(recursion)
- JavaScript 引擎将函数名视为变量名,所以采用
function命令声明函数时,整个函数会被提升到代码头部。 - 有
name属性。length属性(返回函数预期传入的参数个数) - 函数的
toString()方法返回函数源码的字符串 - 函数的作用域是指变量存在的范围,分为全局作用域和函数作用域。ES6中有新增了块级作用域。
- 函数本身也是一个值,有自己的作用域,其访问变量只能访问到其所在作用域内的变量。同样的,函数体内部声明的函数,作用域绑定函数体内部。正是这种机制,构成了“闭包”现象。
var x = function () {console.log(a);
};function y(f) {var a = 2;f();
}y(x)
// ReferenceError: a is not defined
function foo() {var x = 1;function bar() {console.log(x);}return bar;
}var x = 2;
var f = foo();
f() // 1
复制代码- 同名参数去后面的那个
arguements对象包含了函数运行时的所有参数,虽然很像数组,但是它是一个对象。- 闭包就是有权访问其他作用域变量的函数。作用有两个:一个是可以读取函数内部的变量,让变量一直保存在内存中;另一个时封装对象的私有属性和私有方法。
八、数组
- 数组的本质就是一种特殊的对象。所以
typeof运算符会返回object in运算符适用于对象,也适用于数组for...in循环不仅可以遍历对象,也可以遍历数组- 如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,语法上称为“类似数组的对象”(array-like object)。











