一、简介
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)。