只挑本人重要的写(有夹杂其他补充)
3.1 语法
注释
单行注释以两个斜杠开头,如下所示: // 单行注释 块级注释以一个斜杠和一个星号( /* )开头, 以一个星号和一个斜杠( */ )结尾,如下所示: /* * 这是一个多行 * (块级)注释 */
- 严格模式(一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误)
要在整个脚本中启用严格模式可以在顶部添加如下代码: "use strict"; 在函数内部的上方包含这条编译指示,也可以指定函在严格模式下执行: function doSomething(){ "use strict"; //函数体 }
- 语句ECMAScript 中的语句以一个分号结尾;如果省略分号,则由解析器确定语句的结尾
3.2 变量
描述: ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。
简单来说,每个变量仅仅是一个用于保存值的占位符而已。
- 注意用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。简单来说,如果在函数中使用 var 定义一个变量,那么这个变量在函数退出后就会被销毁
function test(){ var message = "hi"; // 局部变量 } test(); alert(message); // 错误
3.3 数据类型
typeof操作符
可能会返回以下结果字符串:
"undefined"——如果这个值未定义; "boolean"——如果这个值是布尔值; "string"——如果这个值是字符串; "number"——如果这个值是数值; "object"——如果这个值是对象或null; "function"——如果这个值是函数。注意: a.对null返回是'object'。 typeof null // object; b.不能区分对象、数组、正则,对它们操作都返回'object'。 typeof Number()// object; c.对NaN返回是'number' typeof parseInt('你') === 'number' //true
Undefined类型
描述:声明变量但未对其加以初始化时,这个变量的值就是 undefined。
下面几种情况会出现undefined: 访问数组或对象不存在的成员 定义的变量未赋值。 函数没有返回值,或return后没有数据。 注意: var a; // undefined b // ReferenceErroe:b is not defined; typeof a; // undefined; typeof b; // undefined;
Null类型
描述: 表示一个空对象指针; var car = null; alert(typeof car); //
"object" 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。
注意: console.log(null == undefined) // true; console.log(null === undefined) //false判断值是否为null: var a = null; (!a && typeof a === 'object');// true;
Boolean类型
可转转化布尔类型:
a.假值 undefined、null、false、+0、-0、NaN、''; b、假值对象 var a = new Boolean(false); var b = new Number(0); var c = new String(''); var d = Boolean(a && b && c ); d // true; var e = a && b && c; e // String {length: 0[[PrimitiveValue]]: ""};
Number类型
描述: 表示整数和浮点数值(双精度64位二进制); 整数就是没有小数的十进制数。所以42.0即等于“整数”42。
- 数字语法
a.十进制:
var a = 42; var b = 42.3;
b.前面的0可以省略:
var a = 0.42;var b = .42;
c.小数点部分最后的0也可以省略
var a = 42.0;var b = 42.;
d.默认情况下大部分数字都以十进制显示,小数部分最后的0被省略
var a = 42.3000 // 42.3var b = 42.0 // 42
e.特别大与特别小的数字默认用指数显示
var a = 5E10;a; // 50000000000a.toExponential(); // "5e+10" var b = a * a;b; // 2.5e+21 var c = 1/a;c; // 2e-11
f.由于数字可以使用Number对象进行封装,可以调用Number.prototype方法。如:
var a = 42.59;a.toFixed(0); // "43"a.toFixed(1); // "42.6";a.toFixed(3); // "42.590"在上列中结果实际上是给定数字的字符串形式 // 无效语法42.toFixed(3); // SyntaxError//有效语法(42).toFixed(3);0.42.toFixed(3);42..toFixed(3);在上列中结果是因为第一个.被视为number的一部分,第二个.是属性访问运算符。
- 较小的数值:(这是二进制浮点数最大的问题)
0.1 + 0.2 === 0.3; // false
解决方法(判断两数是否相等):function numbersCloseEnoughToEqual(n1,n2) { return Math.abs(n1 - n2 ) < Math.pow(2,-52);}
- 整数的安全范围:
Number.MAX_SAFE_INTEGER = 2^53 -1; Number.MIN_SAFE_INTEGER = -(2^53 -1); 如数据库中的64位ID等,由于JavaScript的数值类型无法精确呈现64位数值,所以必须将它保存为字符串。
- 整数检测:
Number.isInteger = function(num) { return typeof num === 'number' && num % 1 === 0; }
- 检测是否是安全整数:
Number.isSafeInteger = function(num) { return Number.isInteger(num) && Math.abs(num) <= Number.MAX_SAFE_INTEGER;}
- 特殊的数字:
描述:数学运算的操作数不是数字类型,无法返回一个有效的数字,会返回NaN。
a.不是数字的数字
var a = 2/'foo'; // NaNtypeof a === 'number'; // true不是数字的数字是数字类型。注意: NaN是一个特殊值,他和自身不相等; NaN != NaN; // true 可用isNaN()来判断(但有个bug):var a = 2 / 'foo'isNaN(a); // true var b = 'foo';isNaN(b); // trueisNaN()检查参数是否不是NaN,也不是数字。解决:Number.isNaN = function(n){ return (typeof n === 'number' && window.isNaN(n))}
b.无穷数
var a = 1 /0; // Infinity var b = -1/0; // -Infinity Infinity/Infinity; // NaN 1/Infinity; // 0 -1/Infinity; // -0
c.零值
var a = 0/ -3; //-0var b = 0 * -3; // -0a.toString(); // '0'a + ''; // '0'String(a); // '0'JSON.stringfy(a); // '0'+'-0'; // -0Number('-0'); // -0JSON.parse('-0'); // -0-0 == 0; // true-0 === 0; // true0 > -0; // false区分 -0 和 0: function isNegZero(n) { var n = Number(n); return (n === 0) && (1/n === -Infinity); }
String类型
特点: 字符串是不可变的,也就是说,字符串一旦建, 它们的值就不能改变。
要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量
转换字符串:
基本类型值的转化规则为:null转化为'null',undefined转化为'undefined',true转化为'true',数字的字符串化则遵循通用规则,数组的默认toString(),将所有单元字符串化后再用','链接起来。
JSON字符串化
注意:a.JSON字符串化并非严格意义上的强制类型转换。 序列化的结果总是字符串 JSON.stringify('42'); // ""42"" JSON.stringify()在对象遇到undefined、function 和 symbol 时会自动将其忽略,在数组中返回null(以保证单元位置不变) JSON.stringify(undefined);// undefined JSON.stringify([1,undefined,function(){},4]); // '[1,null,null,4]' JSON.stringify({a:2,b:function(){}}) // "{"a":2}" b.如果传递给JSON.stringify()的对象定义了toJSON()方法,该方法会在字符串前调用,以便将对象转换为安全的JSON值。
Object类型
Object 的每个实例都具有下列属性和方法:
constructor :保存着用于创建当前对象的函数。hasOwnProperty(propertyName) :用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名( propertyName )必须以字符串形式指定(例如: o.hasOwnProperty("name") )。isPrototypeOf(object) :用于检查传入的对象是否是传入对象的原型(第 5 章将讨论原型)。propertyIsEnumerable(propertyName) :用于检查给定的属性是否能够使用 for-in 语句来枚举。与 hasOwnProperty() 方法一样,作为参数的属性名必须以字符串形式指定。toLocaleString() :返回对象的字符串表示,该字符串与执行环境的地区对应。toString() :返回对象的字符串表示。valueOf() :返回对象的字符串、数值或布值表示。通常与 toString() 方法的返回值相同。