《JavaScript高级程序设计第三版》——细碎知识痛点整理

先附上图书在线链接: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");
}
}

猜你喜欢

转载自www.cnblogs.com/laomi233/p/9096875.html