变量
最小全局变量
每个JavaScript环境有一个全局对象,浏览器中就是window对象,Node环境中是global对象,在函数外面,this指向window对象,不管是通过var 声明或者直接创建的变量,都是这个全局对象的属性。在函数内部通过var声明的变量只会成为一个函数内部局部变量,直接创建的对象还是会成为全局对象的属性。
this指向调用改函数的对象
var myglobal = "hello"; // 不推荐写法
console.log(this); // window
console.log(myglobal); // "hello"
console.log(window.myglobal); // "hello"
console.log(window["myglobal"]); // "hello"
console.log(this.myglobal); // "hello"
(function (){
var mylocal= 'world';
myglobal1 = "!!";
console.log(this); //window
console.log(mylocal); //"world"
console.log(window.mylocal); //undefined
console.log(this.indow.mylocal); //undefined
console.log(window.myglobal1); //"!!"
console.log(myglobal1); //"!!"
}());
需要注意的地方:
创建隐式全局变量 var a = b = 0; 赋值运算从右到左,在此情况下好比var a = (b = 0),b是未声明的。
var的副作用
通过var 声明的变量不能delete。
JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样(变量提升)发挥作用。需要注意的是ES6中通过let和const声明的变量是不存在变量提升情况的。
// 例子
myname = "global"; // 全局变量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
myname = "global"; // global variable
function func() {
var myname; // 等同于 -> var myname = undefined;
alert(myname); // "undefined"
myname = "local";
alert(myname); // "local"}
func();
代码处理分两个阶段,第一阶段是变量,函数声明,以及正常格式的参数创建,这是一个解析和进入上下文的阶段。第二个阶段是代码执行,函数表达式和不合格的标识符(为声明的变量)被创建。变量,函数的声明永远在代码处理的第一步,与代码编写位置无关。
定义变量
ECMAScript变量是松散类型的,可以保存任何类型的数据。
var message = "hello" ;
message = 100; //有效,不推荐
通过var定义局部变量;忽略var会定义全局变量,作为window的属性;
使用未定义的变量,会报错,xxx is not defined,对于未定义的变量,只能使用typeof操作符,返回"undefined"。
var message;
等同于
var message = undefined;
非
var message = 'undefined';
数据类型
5种简单数据类型
Undefined, Null, Boolean, Number, String复杂数据类型
Object-
Null 类型
null值表示一个空对象指针,如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值。这样只要检查变量的值是否为null,就可以判断变量是否判断一个对象的引用。console.log( null == undefined); // true console.log( null === undefined); // false obj !=null 可以判断对象是否为null 或者 为undefined var obj; console.log(obj != null) //false console.log(obj != undefined) //false
使用typeof操作符返回字符串
"undefined" 变量未定义或者声明定义后未赋值。除了typeof操作符,操作未定义的变量会报错 "boolean" 变量的值是布尔值 "string" 变量的值是字符串 "number" 变量的值是数值 "object" 变量的值是对象或null "function" 变量的值是函数
数据类型转换
隐式类型转换
Number 类型
如果小数点后面没有跟任何数字,或者浮点数值本身就是一个整数,那么该浮点数会被转换为整数。保存浮点数所需的内存空间是整数的两倍,如果可能,ECMAScript会不失时机地将浮点数转化为整数。
var floatNum1 = 1.; // 解析为1
var floatNum2 = 10.0; // 解析为10
基于IEEE754数值的浮点计算会产生舍入误差,不要测试某个特定的浮点数值。
console.log(0.1 + 0.2 == 0.3); // false
非数值转换为数值
Number();
parseInt(); 指定基数
parseFloat(); 只解析十进制值,没有第二个参数指定基数
-
+;
console.log(+'5'); //5 console.log(+'5.5'); //5.5 console.log(+'5w'); //NaN console.log(+'ww'); //NaN console.log(parseInt('5',10)); // 5 console.log(parseInt('5.5',10)); //5 console.log(parseInt('5w',10)); //5 console.log(parseInt('ww',10)); //NaN var month = "06", year = "09"; console.log(parseInt(month)); //6 console.log(parseInt(month, 10)); //6 console.log(parseInt(year)); //0 console.log(parseInt(year, 10)); //9
parseInt()可以从字符串中获取数值。当字符串以”0″开头的时候就有可能会出问题,开头为”0″的字符串会被当做8进制处理。为了避免矛盾和意外的结果,总是指定基数(radix)参数---第二个参数。
+"08" // 结果是 8 +"08netease" //NaN Number("08") // 8 Number("08netease") //NaN parseInt("08netease", 10) //8 parseInt(arg0, arg1)较慢