JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。ES6 又新增了第七种 Symbol 类型的值
JavaScript有三种方法,可以确定一个值到底是什么类型。
1.布尔值 (下面六个值被转为false 其他都转化成true)
需要特别注意的是,空数组([])和空对象({})对应的布尔值,都是true。
2.数值
由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。
parseInt() 、 Number()、parseFloat()
3.字符串
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)
var s = ‘hello‘; s[0] // "h" s[1] // "e" s[4] // "o" // 直接对字符串使用方括号运算符 ‘hello‘[1] // "e"
4.对象
检查变量是否声明
if (‘a‘ in window) {
// 变量 a 声明过
} else {
// 变量 a 未声明
}
查看所有属性
使用Object.keys方法
var o = {
key1: 1,
key2: 2
};
Object.keys(o);
// [‘key1‘, ‘key2‘]
in运算符
in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false;
在JavaScript语言中,所有全局变量都是顶层对象(浏览器的顶层对象就是window对象)的属性,因此可以用in运算符判断,一个全局变量是否存在。
for…in循环
for...in循环有两个使用注意点。
如果只想遍历对象本身的属性,可以使用hasOwnProperty方法,在循环内部判断一下是不是自身的属性。
5.数组
本质上,数组属于一种特殊的对象。typeof运算符会返回数组的类型是object。
数组的length属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员会自动减少到length设置的值。
var arr = [ ‘a‘, ‘b‘, ‘c‘ ];
arr.length // 3
arr.length = 2;
arr // ["a", "b"]
将数组清空的一个有效方法,就是将length属性设为0。
var arr = [ ‘a‘, ‘b‘, ‘c‘ ];
arr.length = 0;
arr // []
in 运算符
检查某个键名是否存在的运算符in,适用于对象,也适用于数组。
var arr = [ ‘a‘, ‘b‘, ‘c‘ ]; 2 in arr // true ‘2‘ in arr // true 4 in arr // false
使用delete命令删除一个数组成员,会形成空位,并且不会影响length属性。
var a = [1, 2, 3];
delete a[1];
a[1] // undefined
a.length // 3
6.函数
JavaScript有三种方法,可以声明一个函数。
(1)function命令
function print(s) {
console.log(s);
}
(2)函数表达式
var print = function(s) {
console.log(s);
};
这种写法将一个匿名函数赋值给变量。这时,这个匿名函数又称函数表达式(Function Expression),因为赋值语句的等号右侧只能放表达式。
采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。
(3)Function构造函数(几乎不使用)
var add = new Function(
‘x‘,
‘y‘,
‘return x + y‘
);
// 等同于
function add(x, y) {
return x + y;
}
Function构造函数,除了最后一个参数是函数的“函数体”,其他参数都是函数的参数。
这种声明函数的方式非常不直观,几乎无人使用。
函数可以调用自身,这就是递归
如果同时采用function命令和赋值语句声明同一个函数,最后总是采用赋值语句的定义。
不能在条件语句中声明函数
length属性
length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。
toString()
函数的toString方法返回函数的源码。
函数作用域
在函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。
var v = 1;
function f(){
console.log(v);
}
f() // 1
在函数内部定义的变量,外部无法读取,称为“局部变量”
function f(){
var v = 1;
}
v // ReferenceError: v is not defined
对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。
if (true) {
var x = 5;
}
console.log(x); // 5
函数本身的作用域
函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在的作用域无关。
参数
参数传递方式:函数参数如果是原始类型的值(数值、字符串、布尔值),传递方式是传值传递(passes by value)。这意味着,在函数体内修改参数值,不会影响到函数外部。
如果函数参数是复合类型的值(数组、对象、其他函数),传递方式是传址传递(pass by reference)。也就是说,传入函数的原始值的地址,因此在函数内部修改参数,将会影响到原始值。
注意,如果函数内部修改的,不是参数对象的某个属性,而是替换掉整个参数,这时不会影响到原始值。
arguments对象
arguments对象包含了函数运行时的所有参数