1. 变量的概念:
在 javascript 中, 变量是松散类型的, 可以用来保存任何数据类型.
在定义变量时, 使用 var 操作符, 后面跟变量名.
- var message;// 变量未初始化, 此时变量为 undefined
- var message = "hi";// 定义变量时直接初始化,
- var i=0,sum;// 可同时声明多个变量, 逗号隔开
2. 变量作用域
局部变量: 是在函数内部声明的变量, 在函数内部任何地方都是有定义, 在函数退出后, 会被销毁;
全局变量: 拥有全局作用域, 在 js 代码中的任何地方都有定义.
3. 执行环境及作用域链
执行环境定义了变量或函数有权访问的其他数据, 决定了它们各自的行为. 某个执行环境中的所有代码执行完毕后, 该环境被销毁, 保存在其中的所有变量和函数也随之销毁(全局执行环境直到关闭页面时才会销毁). 全局执行环境是最外围的执行环境, 在 web 浏览器中, 全局执行环境被认为是 window 对象.
每一段 js 代码 (全局代码或函数) 都有一个与之关联的作用域链. 这个作用域链是一个对象列表, 定义了这段代码 "作用域中" 的变量.
js 就是这样一层层向外查找变量, 直到最外层.
数据类型
1. 基本概念
简单数据类型 (基本数据类型) 和复杂数据类型(引用类型). 与基本数据类型不同的是, 引用类型的值是按引用访问的.
基本数据类型: undefined,null,boolean,number,string
引用类型: object
2. 判断数据类型
- typeof x;
- typeof(x);
使用 typeof 后, 会返回的是一个字符串; 根据返回值可以判断该值的数据类型.
(注:"object"-- 该值是对象或者 Null;
"function"-- 该值是函数)
3. 基本数据类型和对象类型的区别
基本类型是不可改变的, 对象是可修改的.
字符串而言, 每次改变, 其实都是创建了一个新的字符串去替代原先的值.
- var s = "hello";
- console.log(s.toUpperCase());//HELLO
- console.log(s);//hello
这个例子中, 对虽然 s 进行了操作, 但是 s 的值并没有被改变;
对象可修改:
- var o = {x:1};
- console.log(o.x);//x 的值未修改, 输出 1
- o.x = 3;
- console.log(o.x);//x 值被修改为 3
- o.y = 2;
- console.log(o.y);// 创建新的属性 y, 并赋值 2
2. 基本类型的比较是比较值本身, 只有在它们的值相等时, 它们才相等; 对象的比较是引用的比较, 当且仅当它们是基于同一个对象时, 他们才相等.
- var o = {x:1},p = {x:1};
- var q = o;
- alert(o === p); //false
- alert(o === q); //true
- q.x = 2;
- alert(q.x); //2
- alert(o.x); //2
- var x = 1,y = 1;
- var z = x;
- alert(x === y); //true
- alert(x === z); //true
- z = 2;
- alert(z); //2
- alert(x); //1
3. 引用类型的值, 可以动态的为其添加, 改变或删除属性和方法, 基本类型则不行
我们可以为对象动态添加, 改变或删除属性. 但是我们给基本类型的值添加属性的时候, 虽然不会导致错误, 但是访问属性的时候, 会提示我们属性不存在.
关于数据类型的转换
数据类型的转换分为显示转换和隐式转换;
显式转换:
- 1.
- Number("3");
- // 只用于十进制
- String(false);
- Boolean([]);
- Object(2);
- //==new Number(3)
2.toString(),toFixed(),toExponential(),toPrecision()可以转换为字符串
- //toString()
- alert([1,2,3].toString()); //1,2,3
- var n = 17;
- var binary_string = n.toString(2);
- var octal_string = "0" + n.toString(8);
- var hex_string = "0x" + n.toString(16);
- alert('十进制数 17, 转换为二进制为:' + binary_string + '; 转换为八进制为:' + octal_string + '; 转换为十六进制为:' + hex_string + '.');
- // 十进制数 17, 转换为二进制为: 10001; 转换为八进制为: 021; 转换为十六进制为: 0x11.
- //toFixed(), 按照指定的小数位返回值
- var n = 123456.789;
- alert(n.toFixed(0)); //"123457" 四舍五入
- alert(n.toFixed(2)); //"123456.79" 四舍五入
- alert(n.toFixed(5)); //"123456.78900" 不足位数补 0
- //toExponential(), 使用指针计数法将数字转换为指数形式字符串
- var n = 123456.789;
- alert(n.toExponential(1)); //"1.2e+5" 四舍五入
- alert(n.toExponential(3)); //"1.235e+5" 四舍五入
- alert(n.toExponential(10)); //"1.2345678900e+5" 不足位数补 0
- //toPrecition(), 根据制定的有效数字位数将数值转换为字符串. 如果有效数字位数少于数字整数部分位数, 将转换为指数计数法.
- var n = 123456.789;
- alert(n.toPrecision(4)); //"1.235e+5" 四舍五入
- alert(n.toPrecision(7)); //"123456.8" 四舍五入
- alert(n.toPrecision(10)); //"123456.7890" 不足位数补 0
3.parseInt()和 parseFloat()
这两个方法都将传入的参数转换为数字直接量. 并且都会忽略任意数量的前导空格, 并忽略后面的非法的数值直接量. 如果第一个非空格字符是非法的数值直接量, 终将返回 NaN.
parseInt()只解析整数, 而 parseFloat()方法可以解析整数和浮点数.
parseInt()如果前导是 "0x" 或者 "0X",parseInt()将解析为十六进制数; 在使用 parseInt 解析八进制字面量的字符串时, 如 "070",ECMAscript3 将其当做八进制字面量, 输出对应的十进制数值 56,ECMAscript5 会输出 70.
parseInt()可以接收第二个可选参数, 这个参数指定数字转换的基数(即多少进制).
parseFloat()只解析十进制值
隐式转换
用于检测是否为非数值的函数: isNaN()
isNaN()函数, 经测试发现, 该函数会尝试将参数值用 Number()进行转换, 如果结果为 "非数值" 则返回 true, 否则返回 false.
运算符造成的隐式转换
Javascript 的变量是松散类型的, 它可以存储 Javascript 支持的任何数据类型. Javascript 会根据需要, 对数据自行进行转换. 但是一个值能转换为另一个值并不意味着两个值是相等的.
来源: http://www.qdfuns.com/note/50410/c9e22d7a7116ecba897684d946eaad60.html