每一个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();
代码处理分两个阶段,第一阶段是变量,函数声明,以及正常格式的参数建立,这是一个解析和进入上下文的阶段。第二个阶段是代码执行,函数表达式和不合格的标识符(为声明的变量)被建立。变量,函数的声明永远在代码处理的第一步,与代码编写位置无关。this
定义变量
ECMAScript变量是松散类型的,能够保存任何类型的数据。spa
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, Stringcode
复杂数据类型
Object对象
Null 类型
null值表示一个空对象指针,若是定义的变量准备在未来用于保存对象,那么最好将该变量初始化为null而不是其余值。这样只要检查变量的值是否为null,就能够判断变量是否判断一个对象的引用。blog
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)较慢