一, 变量定义
ECMAScript 的变量是松散类型的, 所谓的松散类型, 就是可以用来保存任何类型的数据, 例如:
- var message = "Hello World";
- var num = 10;
当然, 我们也可以不赋予初始值, 例如: var data; 这样, 我们便定义 data, 但是 data 并未被初始化, 因此会被默认保存一个特殊的值 -- undefined.
用 var 操作符定义的变量将成为定义改变量的作用域的局部变量. 也就是说如果再函数中使用 var 定义一个变量, 那么这个变量在函数退出后便会被销毁. 省略 var 操作符时, 变量就成了全局变量, 当然 var 也可以定义全局变量, 但是不推荐甚至禁止创建全局变量.
在 ES6 中, 有了 let 和 const 之后, 便可以不再使用 var 操作符了, 理由是 var 会造成变量提升, 而且 var 能够重复定义相同变量, 会造成混乱, let 和 const 能避免这个问题.
二, 数据类型
基本数据类型: Undefined,Null,Boolean,String,Number(在 ES6 中新增了另一种基本数据类型 -- Symbol)
复杂数据类型: Object
三, 数据类型的检测
1. typeof: 不能检测到 null 类型, typeof;
2. null 会返回 "object";
3. instanceof: 用来判断 A 是否是 B 的实例, 表达式为 A instanceof B, 但是无法判断数组是 Array 还是 Object(虽然数组也是对象), 例如 [] instanceof Array 返回 true, 而[] instanceof Object 也是返回 true. 可以结合 ES5 新增的 Array.isArray() 方法判断具体是数组还是对象;
4. constructor: 不能检测到 null 和 undefined, 因为这两个是无效的对象, 并且 constructor 是不稳定的, 这个主要体现在自定义对象上, 当开发者重写 prototype 后, 原有的 constructor 引用会丢失, constructor 会默认为 Object;
5. toString: 比较好的判断方法, Object 的原型方法, 调用该方法, 默认返回当前对象的 [class] . 这是一个内部属性, 其格式为 [object xxx] , 其中 xxx 就是对象的类型. 例如: Object.prototype.toString.call(1)返回[object Number]
四, null 和 undefined
当一个变量被声明时, 这个变量的默认值就是 undefined, 而当一个变量为 null 时, 则代表着这个变量的值是一个空指针对象. 简单来说就是, 声明但未赋值, 就是 undefined,null 则是有值, 值为 null(空指针)
五, Boolean
Boolean 只有两个字面值: true 和 false, 这两个数值与数字值不是一回事, 因此 true 不一定等于 1,false 也不一定等于 0. 可以这么理解, 存在为 true, 不存在为 false, 成立为 true, 不成立为 false. 要将某个非布尔值转化成布尔值, 可以用 Boolean()方法.
六, Number
最基本的数值字面量格式为十进制整数, 就是我们常用的 1,2,3,4,5 等等; 除此之外, 还可以用八进制或十六进制表示, 但是八进制在严格模式 (use stric) 下无效, 算术计算时, 都将转化成十进制进行运算.
浮点数的精度最高达到 17 位, 但是在运算时其精度远远不如整数, 例如: 0.1 + 0.2 = 0.300000000000000004. 因此, 永远不要测试某个特定浮点数值, 当然这并非 ECMAScript 独有的问题, 这是基于 IEEE754 数值的浮点计算的通病.
NaN 是一个特殊的数值(Not a Number), 这个数值用于表示一个本来要返回数值的操作数未返回数值的情况. 例如 0 除以 0 都会导致错误, 此时会返回 NaN.
任何涉及 NaN 的操作都会返回 NaN;NaN 与任何数值都不相等; 包括它自己本身 (NaN == NaN 返回 false); 实际上, 只有 0 除以 0 才会返回 NaN, 正数除以 0 返回 Infinity(正无穷), 负数除以 0 返回 - Infinity(负无穷);isNaN() 方法能检测变量是否不是数值, 即可以用来判断变量是否能转化成数字, 如 isNaN('blue')返回 true,isNaN(true)返回 false
将其他非数值类型转化为数值类型的方法有三种: Number(),parseInt(),parseFloat(),Number()可以用于任何数据类型, 而另外两个则专门用于把字符串转换成数值. 这三个函数对于相同的输入会有不同的结果, 所以转换时请选择正确的方法去使用.
七, String
字符串可由英文的引号 ('') 和双引号 ("") 表示, 以什么符号开始, 就以什么符号结束, 如以双引号开始就以双引号结束("Hello World").
有一些特殊的字符串显示需要转义, 例如该字符串中含有单引号则需要加上斜杠, 例如:'\'Hello World\''
ECMAScript 中的字符串是不可变的, 也就是说, 字符串一旦创建, 它们的值就不能再改变, 要改变, 首先要销毁原来的字符串, 然后再用另一个字符串填充该变量
要把一个值转换成字符串的方法有两种, 一种是使用 toString()方法, 另一种, 则是把该值与一对双引号或单引号加在一起(10 + "3" = "103")
八, Object
ECMAScript 中的对象其实就是一组数据和功能的集合, 对象可以通过执行 new 操作符后跟要创建的对象类型的名称来创建, 如: var o = new Object(), 圆括号可以省略但是不推荐; ECMAScript 中 Object 类型是所有它的实例的基础, 换句话说, Object 类型所具有的任何属性和方法同样也存在于更具体的对象中.
Object 每个实例都具有下列的属性和方法:
constructor: 保存着用于创建当前对象的函数.
hasOwnProperty(propertyName): 用于检查给定的属性在当前的对象实例中 (而不是在实例原型中) 是否存在
isProptoTypeOf(object): 用于检查传入的对象是否是传入对象的原型.
propertyIsEnumerable(propertyName): 用于检查给定的属性是否能够使用 for-in 语句.
toLocaleString(): 返回对象的字符串表示, 该字符串与执行环境地区相对应.
toString(): 返回对象的字符串表示.
valueOf(): 返回对象的字符串, 数值或布尔值表示, 通常与 toString()的返回值相同.
来源: http://www.jianshu.com/p/4ece03331b6a