javascript中的数据类型
数据类型分为:基本数据类型 对象
1.基本数据类型
基本数据类型有5种,数字,字符串,布尔值,undefined,null
1.1 数字类型:number
>var n = 1;
>typeof n;
"number"
1.1.1 Infinity
在javascript中有一种叫infinity的特殊值,他所代表的是超出了javascript处理范围的值,但是Infinity依然是一个数字。
>Infinity
Infinity
>typeof Infinity
"number"
>1e309
Infinity
>1e308
1e308
>var a = 6 / 0;
>a
>Infinity
注意:
1.任何数除以0都是Infinity
2.Infinity于其他任何操作数执行任何算数运算的结果也都等于Infinity
1.1.2 NaN
如果在算数运算中使用了不恰当的操作数,导致运算失败,该运算就会返回NaN
typeof NaN
"number"
1.2 字符串:string
一对双引号或单引号之间的任何值都会被视为一个字符串。
一个字符串类型如果和算数运算符在一起使用的话字符串会转换成number
var s = 100;
s = s * 1 ;
typeof s ;
"number"
1.3 布尔值:boolean : true false
逻辑运算符:&& || !
falsy值:空字符串,null,undefined,数字0,数字NaN,布尔值false
其他情况都是truthy值。
1.4 undefined
当我们尝试使用一个不存在的变量时,打log的时候就会出现undefined。
1.5 null
javascript中的函数
预定义函数
javasctipt引擎中有一组可供随时调用的内建函数
- parseInt()
- parseFloat()
- isNaN()
- isFinite()
- encodeURI()
- decodeURI()
- encodeURIComponent()
- decodeURIComponent()
- eval()
parseInt('abc123');
NaN
parseInt('123abc');
123
parseFloat('1e10');
10000000000
parseInt('1e10');
1
注意:parseFloat比parseInt更强大的就是它可以操作指数
变量的作用域
全局变量:定义在函数以为的变量
局部变量:某个函数中定义的变量
注意:如果声明一个变量的时候没有使用var语句,该变量就会被默认认为是全局变量
变量提升
var a = 123 ;
function f(){
alert(a);
var a = 1;
alert(a);
}
==>等价
var a = 123 ;
function f(){
var a ; // 在函数内部的a变量提升了。
alert(a); // undefined
a = 1;
alert(a); // 1
}
匿名函数
没有名字的函数,可以作为参数传递给其他函数,使用匿名函数完成一次性工作。
function(){
return 1 ;
}
function(){
return 2;
}
回调函数
function作为参数传递给另一个函数
// 例子1
$("#btn_1").click(function() {
alert("Btn 1 Clicked");
});
// 例子2
var friends = ["Mike", "Stacy", "Andy", "Rick"];
friends.forEach(function (eachName, index){
console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick
即时函数
这种函数可以在定义后立即使用。我们只需要将匿名函数的定义放进一对括号中,然后外面在紧跟一对括号即可,其中第二对括号起到的是“立即调用”的作用,同时它也是我们向匿名函数传递参数的方法。
(
fucntion(){
alert("foo");
}
)();
==> 等价于
(
function(){
alert("foo");
}()
)
优先第一种方法。
内部(私有)函数
在一个函数内部在定义一个函数
function outer = function(param){
var inner = function(theinput){
return theinput * 2 ;
};
return 'the result is' + inner(param);
}
outer(2)
the result is 4 ;
闭包
作用域链
javascript中不存在大括号级的作用域,但它有函数作用域,也就是说,在某函数内定义的所有变量在该函数外是不可见的,但是如果该变量是在某代码块中被定义的(如在if或for语句中),那么它在代码块外是可见的。
var a = 1;
function f(){
var b = 1;
return a ;
}
f();
1
b
ReferenceError:b is not defined
在这里,变量a是属于全局域的,而变量b的作用域就在函数f()内了,所以,
在f()内,a和b都是可见的
在f()外,a是可见的,b则不可见
下面看一个例子,如果我们在函数outer()中定义了另一个函数inner(),那么在inner()中可以访问的变量既来自它自身的作用域,也可以来自其“父级”作用域,这就形成了一条作用域链(scope chain),该链的长度则取决我们的需要。
var gloabl = 1;
function outer(){
var outer_local = 2;
function inner(){
var inner_local = 3;
return inner_local + outer_local + gloabal;
}
return inner();
}
outer()
6