先附上图书在线链接:http://www.chinastor.org/upload/2014-12/14122310427265.pdf
记录内容:
近来阅读红皮书,做的些许笔记,因为第一次整理,可能稍显琐碎,望谅解,如发现错误,希望能提出指正,谢谢。2018-05-27
正文:
3.1.5 语句
ECMAScript中的语句以一个分号结尾;
1 var sum = a + b // 即使没有分号也是有效的语句——不推荐 2 var diff = a - b; // 有效的语句——推荐
加上;的好处:
①加上这个分号可以避免很多错误(例如不完整的输入),②开发人员也可以放心地通过删除多的空格来压缩ECMAScript代码(代码行结尾处没有分号会导致压缩错误)。另外,③加上分号也在某些情况下增进代码的性能,因为这样解析器就不必再花时间推测应该在哪里插入分号了。(利于压缩、避免不完整输入、某些情况下会提供代码性能)
条件控制语句(如if语句)只在执行多条语句的情况下才要求使用代码块,但最佳实践是始终在控制语句中使用代码块——即使代码块中只有一条语句
var bool = true; if(bool){ console.log("ok");//ok }
3.3 变量
ECMAScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。
typeof是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必需的。
console.log(typeof null)//object,从逻辑角度来看,null值表示一个空对象指针,而这也正是typeof操作符检测null值会返回object的原因
使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,未初始化的变量,不能执行真正的操作
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值。这样一来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:
var car = null; if(car != null){ } else{ alert("变量为空") } alert(null == undefined); //true
布尔值转换规则
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN(参见本章后面有关NaN的内容) |
Object | 任何对象 | null |
Undefined | n/a① | undefined |
3.4.5 Number类型
var octalNum1 = 070; // 八进制的56 var octalNum2 = 079; // 无效的八进制数值——解析为79 var octalNum3 = 08; // 无效的八进制数值——解析为8 var hexNum1 = 0xA; // 十六进制的10 var hexNum2 = 0x1f; // 十六进制的31 var floatNum1 = 1.1; //浮点数值 var floatNum2 = 0.1; var floatNum3 = .1; // 有效,但不推荐 var floatNum = 3.125e7; // 等于31250000
浮点数值的最高精度是17位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1加0.2的结果不是0.3,而是0.30000000000000004 。(ps:涉及到对浮点数运算的,一般都要进行,如Math.round()、Math.floor()、Math.ceil(),分别对应四舍五入,向下以及向上取整)
console.log(Number.MAX_VALUE,Number.MIN_VALUE) console.log(isFinite(0.0000000000000321))//判值是否属于最小到最大的范围内
NaN本身有两个非同寻常的特点。首先,任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,
NaN与任何值都不相等,包括NaN本身。例如,下面的代码会返回false:
alert(NaN == NaN); //false
4. 数值转换
有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。第一个函数,即转型函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这3个函数对于同样的输入会有返回不同的结果。
Number()函数转换注意
传入的是布尔值,true1 false0
null值为0 undefined 返回NaN
undefined 返回NaN
字符串,空字符返回0,①011返回11 ②11asdfasdf 返回11 ③hello返回NaN
parseInt()函数转换注意
var num2 = parseInt(""); // NaN var num1 = parseInt("10", 2); //2 (按二进制解析) var num2 = parseInt("10", 8); //8 (按八进制解析) var num3 = parseInt("10", 10); //10 (按十进制解析) var num4 = parseInt("10", 16); //16 (按十六进制解析)
parseFloat()只解析十进制值
var num1 = parseFloat("1234blue"); //1234 (整数) var num2 = parseFloat("0xA"); //0 var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.34.5"); //22.34 var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000
转换为字符串
var age = 11; var ageAsString = age.toString();// 字符串"11" var found = true; var foundAsString = found.toString(); // 字符串"true"
数值、布尔值、对象和字符串值(没错,每个字符串也都有一个toString()方法,该方法返回字符串的一个副本)都有toString()方法。但null和undefined值没有这个方法。.toString(2)里面参数默认是10,为十进制
转型函数String(),这个函数能够将任何类型的值转换为字符串
var value1 = 10; console.log(String(value1)); // "10" null和undefined没有toString()方法,所以String()函数就返回了这两个值的字面量。
Object对象
创建Object类型的实例并为其添加属性和(或)方法,就可以创建自定义对象,如下所示:
var o = new Object();
Object类型是所有它的实例的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
Object的每个实例都具有下列属性和方法。
①constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()。
②hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"))。
③isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型(第5章将讨论原型)。
④propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句(本章后面将会讨论)来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
⑤toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
⑥toString():返回对象的字符串表示。
⑦valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
var test = new Object(); test.name = "dading"; console.log(test);//name:dading console.log(test.constructor == Object);//true console.log(test.hasOwnProperty("name"));//true,属性存在当前对象实例中 console.log(test.isPrototypeOf("name"));//false,传入的对象不是是传入对象的原型 console.log(test.propertyIsEnumerable("name"));//true,可循环 console.log(test.name.toLocaleString());//dading console.log(test.name.toString());//dading console.log(test.name.valueOf());//dading
3.5.2 位操作符
0正1负
例如,数值18的二进制表示是00000000000000000000000000010010,或者更简洁的10010
负数,取反加1
1. 按位非(NOT)
var num1 = 25; // 二进制00000000000000000000000000011001 var num2 = ~num1; // 二进制11111111111111111111111111100110 alert(num2); // -26
2. 按位与(AND)
var result = 25 & 3; //按位与操作只在两个数值的对应位都是1时才返回1 alert(result); //1
3. 按位或(OR) | 有一个位是1的情况下就返回1
4. 按位异或(XOR)^ 只有一个1时才返回1
5. 左移
var oldValue = 2; // 等于二进制的10 var newValue = oldValue << 5; // 等于二进制的1000000,十进制的64
6.有符号的右移
var oldValue = 64; // 等于二进制的1000000 var newValue = oldValue >> 5; // 等于二进制的10,十进制的2
7.无符号的右移
var oldValue = -64; // 等于二进制的11111111111111111111111111000000 var newValue = oldValue >>> 5; // 等于十进制的00000111111111111111111111111110(134217726)
3.5.3 布尔操作符
1.逻辑非操作符由一个叹号(!)表示
alert(!NaN); // true
2. 逻辑与 && 第一个条件错误,后面不执行
3. 逻辑或 || 第一个条件对的,后面不执行
3.5.4 乘性操作符
与没有带数值的值相乘,返回NaN
3.5.5 加性操作符
+会拼串
3.5.6 关系操作符
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
var result = "Brick" < "alphabet"; //true,比较的是两个字符串中对应位置的每个字符的字符编码值。经过这么一番比较之后,再返回一个布尔值。由于大写字母的字符编码全部小于小写字母的字符编码 var result = "23" < "3"; //true 当比较字符串"23"是否小于"3"时,结果居然是true。这是因为两个操作数都是字符串,而字符串比较的是字符编码("2"的字符编码是50,而"3"的字符编码是51) var result = "a" < 3; // false,因为"a"被转换成了NaN由于字母"a"不能转换成合理的数值,因此就被转换成了NaN。根据规则,任何操作数与NaN进行关系比较,结果都是false。
3.5.10 逗号操作符
var num1=1, num2=2, num3=3;
3.6.5 for-in语句
var arr = [1,2,3,4,5,6,]; for(var prop in arr){ console.log(prop,arr[prop]) }
3.6.7 break和continue语句
var num = Math.floor(Math.random()*5 +1); console.log(num) switch (num) { case 1: console.log("1") break; case 2: console.log("2") break; default: console.log("不是1和2"); } }