JavaScript高级程序设计(第四版)重点笔记(2)

第三章 语言基础
1.语法
(1)一切都区分大小写。
(2)标识符:第一个字符必须是一个字母、下划线、美元符号。
2.关键字和保留字:关键字(debugger、yield等)、保留字(let、await等)
3.变量:有三个关键字可以声明变量:var、const、let
(1)var关键字

  • 注意:在函数内定义变量时省略var操作符,可以创建一个全局变量
function  test(){
message = “hi”;    //全局变量
}
test();
console.log(message);   //“hi”
  • 使用这个关键字声明的变量会自动提升到函数作用域顶部

(2)let声明

  • 和var的区别是,let声明的范围是块作用域,而var声明的范围是函数作用域
 if (true){
       var name=’Matt’;
       console.log(name);//Matt
}
console.log(name);//Matt

if (true){
       let age=26;
       console.log(age);//26
}
console.log(age); //ReferenceError:age没有定义
  • 不允许同一个块作用域中出现冗余声明
  • (暂时性死区)声明的变量不会在作用域中被提升
  • 在全局作用域中声明的变量不会成为window对象的属性
 var name=’Matt’;
console.log(window.name); //’Matt’

let age=26;;
console.log(window.age); //undefined

(3)const声明
—与let基本相同,唯一区别是用它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误。如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。

4.数据类型
6种简单数据类型:Underfined、Null、Boolean、Number、String和Symbol,1种复杂数据类型:Object(对象)
(1)typeof操作符

  • 作用:确定任意变量的数据类型
  • 它是一个操作符不是函数,不需要参数
  • 对一个值使用typeof操作符会返回下列字符串之一:“undefined”表示值未定义、“boolean”表示值为布尔值、“string”表示值为字符串、“number”表示值为数值、“object”表示值为对象或null、“function”表示值为函数、“symbol”表示值为符号
let message = “some string”;
console.log(typeof message);  //”string”
console.log(typeof(message));//”string”
console.log(typeof 95);  //”number”

(2)Undefined类型
当使用var或let声明了变量但没有初始化时,就相当于给变量赋予了underfined值
无论声明还是未声明,typeof返回的都是字符串”undefined”,所以建议在声明变量的同时进行初始化

let message;
//let age
console.log(typeof message); //”undefined”
console.log(typeof  age); //”undefined”

(3)Null类型
null值表示一个空对象指针。undefined值是由null值派生而来的.

Console.log(null==underfined); //true

(4)Boolean类型
要将一个其他类型的值转换为布尔值,可以调用特定的Boolean()转型函数;if等流控制语句会自动执行其他类型值到布尔值的转换。
请添加图片描述

let message = “Hello world”;
if(messgee){
console.log(“Value is true);
}

(5)Number类型

  • 它的值包含整数和浮点值。
  • 补充:八进制字面量,第一个数字必须是0,然后是相应的八进制数字(0-7)。如果字面量中包含的数字超出了应有的范围,就会忽略前缀的0,后面的数字序列会被当成十进制数。十六进制字面量,数值前缀必须是0x(区分大小写),然后是十六进制数字(0-9以及A-F),十六进制数字中的字母大小写均可。

① 浮点值
—小数点后面必须至少有一个数字,前面不是必须有整数。
—科学计数法:用于表示一个应该乘以10的给定次幂的数值。格式要求一个数值(整数或浮点数)后跟一个大写或小写的字母e,再加上一个要乘的10的多少次幂。比如:

let floatNum = 3.125e7;           //等于31250000

—浮点值的精确度最高可达17位小数,但在算数计算中远不如整数精确,如,0.1加0.2得到的不是0.3,而是0.30000000000000004,如果是0.05和0.25那没问题,所以不要测试某个特定的浮点数
② 值的范围
如果某个计算得到的数值结果超出了JavaScript可以表示的范围,那么这个数值会自动转换为一个特殊的Infinity(无穷)值
③ NaN
—意思是”不是数值”(Not a Number),用于表示本来要返回数值的操作失败了

console.log(0/0);//NaN
console.log(-0/+0);//NaN
console.log(5/0-);//-Infinity

—NaN不等于包括NaN在内的任何值。任何不能转换为数值的值都会导致isNaN()函数返回true。
④ 数值转换

  • 三个函数:Number()、parseInt()和parseFloat()。后两个主要用于将字符串转换为数值。
  • Number()会将underfined转换为NaN,对于空字符转换为0,除此之外字符串含有不是整数或浮点数的字符,则返回NaN。
  • parseInt()更专注于字符串是否包含数值模式,从第一个非空格字符开始转换,如果第一个字符不是数值字符、加号或减号,立即返回NaN。
let num1 = parseInt(22.5);//22

—parseFloat()与parseInt()相似,但它始终忽略字符串开头的0,所以十六进制数值始终会返回0

(6)String类型
字符串可用双引号、单引号或反引号标示
① 字符字面量
\f 换页、\r 回车、\xnn 以十六进制编码nn表示的字符、\unnnn 以十六进制编码nnnn表示的Unicode字符
② 字符串的特点:不可变的
③ 转换为字符串

  • toString()方法返回当前值的字符串等价物,除了null和underfined,可以接收一个底数参数,即以什么底数来输出数值的字符串表示。
let num = 10;
console.log(num.toString(2));  //”1010”
  • 如果你不确定一个值是不是null或underfined,可以使用String()函数,它始终会返回表示相应类型值的字符串。

④ 模板字面量:可以跨行定义字符串。

  • 支持字符串插值,即可以在一个连续定义中插入一个或多个值。通过${}中使用一个JavaScript表达式实现:
let value = 5;
let exponent = ‘second’;
//以前,字符串插值是这样实现的:
let interpolatedString = 
value + ‘to the’ + exponent + ‘power is’ + (value * value);
//现在,可以用模板字面量来实现:
let interpolatedTemplateLiteral = `${value} to the ${exponent} power is ${value * value}`;
console.log(interpolatedString);//5 to the second power is 25;
console.log(interpolatedTemplateLiteral);//5 to the second power is 25;
  • 支持标签函数,自定义插值行为。标签函数会接收被插值标记分隔后的模板和对每个表达式求值的结果
let a = 6;
let b = 9;
function simpleTag(strings,aValExpression,bValExpression,sumExpression){
console.log(strings);
console.log(aValExpression);
console.log(bValExpression);
console.log(sumExpresssion);
return ‘footbar’;
}
let untaggedResult = `${a} + ${b} = ${a+b}`;
let taggedResult= simpleTag `${a} + ${b} = ${a+b}`;
//[“”,”+”,”=”,””]
//6
//9
//15
console.log(untaggedResult);    //”6+9=15”
console.log(taggedResult);    //”foobar”
因为表达式参数的数量是可变的,所以通常应该使用剩余操作符将他们收集到一个数组中:
let a = 6;
let b =9;
function simpleTag(strings,...expressions){
fonsole.log(strings);
for (const expression of expressions){
console.log(expression);
}
let taggedResult = simpleTag `${a} + ${b} = ${a+b}`;
//[“”,”+”,”=”,””]
//6
//9
//15
console.log(taggedResult);

(7)Object类型

  • Object是派生其他对象的基类,所有属性和方法在派生对象上同样存在
  • 属性和方法:

① constructor:用于创建当前对象的函数属性。
② hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性,属性名必须是字符串。
③ isPrototypeOf(object):用于判断当前对象是否为另一个对象的原型。
④ propertyIsEnumerable(propertyName):用于判断给定的属性是否可以使用for-in语句枚举。
⑤ toLocaleString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。
⑥ toString():返回对象的字符串表示。
⑦ valueOf():返回对象对应的字符串、数值或布尔值表示。

5.操作符
(大部分操作符在处理一些特殊值是有一些特殊的行为,这个没有写,翻书吧)
(尤其当碰到操作数为NaN、null、Infinity、undefined时会容易混淆,后面总结下)
操作符有:一元操作符(递增/递减操作符、一元加和减)、位操作符、布尔操作符、乘性操作符、指数操作符、加性操作符、关系操作符、相等操作符、条件操作符、赋值操作符、逗号操作符。
(1)一元操作符:最简单的操作符
① 递增/递减操作符

let age = 19;
++age;//前缀递增,实际上等于age = age+1;
age++;//后缀递增,在语句被求值后才发生
这四个操作符可用于任何值,规则举例说明:
let s1 =2;
let s2 = “z”;
let b = false;
let f = 1.1;
let o = {
valueOf(){
return -1;
}
};
s1++;  //值变成数值3
s2++;  //值变成NaN
b++;   //值变成数值1
f--;    //值变成0.1000000000000009
o--;    //值变成-2

② 一元加和减
一元加由一个加号表示,放在变量前头,对数值没有任何影响;
一元减用于把数值变成负值。

如果将一元加应用到非数值,则会执行与使用Number()转型函数一样的类型转换。

(2)位操作符

  • 先把值转换成32位整数,再进行位操作,之后再把结果转换为64位。有符号整数使用32位的前31位表示整数值,第32位表示数值的符号,0表示正,1表示负。正值以真正的二进制格式存储,而负值以一种二补码的二进制编码存储,如
    -18的二进制表示,首先取其绝对值的二进制:0000 0000 0000 0000 0000 0000 0001 0010, 然后计算数值的反码,即反转每一位的二进制值: 1111 1111 1111 1111 1111 1111 1110
    1101,最后,给一补数加1: 1111 1111 1111 1111 1111 1111 1110 1110。
  • 特殊值NaN和Infinity在位操作中都会被当成0处理。

① 按位非(~),返回数值的反码,最终效果是对数值取反并减1.
② 按位与(&),两两为1才为1。
③ 按位或(|),至少一位是1才为1。
④ 按位异或(^),只在一位上是1的时候才返回1。
⑤ 左移(<<),会按照指定的位数将数值的所有位向左移动,但会保留数值的符号,-2左移5位得到-64。
⑥ 有符号右移:会将数值的所有32位都向右移,同时保留符号,移位后出现的空位将用符号位的值来填充这些空位,以得到完整的整值。
⑦ 无符号右移(>>>),正数无符号右移的结果与有符号的相同,负数的化它会给空位补充0,不管符号位是什么。

let oldValue = -64;  //等于二进制 1111111111111111111111111111111100000
let newValue = oldValue>>>5;  //等于十进制134217726

(3)布尔操作符
① 逻辑非(!):首先将操作数转换为布尔值,再对其取反。
同时使用两个!!,相当于调用了Boolean()
② 逻辑与(&&):如果有操作数不是布尔值,则逻辑与并不一定会返回布尔值。它是一种短路操作符,如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。
③ 逻辑或(|):如果有操作数不是布尔值,则逻辑或并不一定会返回布尔值。
let myObject = preferredObject || backupObject;
变量myObject会被赋予两个值中的一个,避免给变量赋值null或undefined.

(4)乘性操作符
乘法操作符(*)、除法操作符(/)、取模操作符(%)

(5)指数操作符
Math.pow()有了自己的操作符**。

let squared = 3;
squared **=2;  //等于 squared = squared ** 2;
console.log(squared);//9

(6)加性操作符
① 加法操作符:如果有两个操作数都是字符串,那么将第二个字符串拼接到第一个字符串后面,如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。
② 减法操作符:如果有任意操作数是字符串、布尔值、null或undefined,则先在后台使用Number()将其转换为数值,然后再根据前面的规则执行数学运算。

(7)关系操作符(<、>、<=、>=)

let result =23<3;  //true

(字符“2“的编码是50,而字符”3“的编码是51)

(8)相等操作符
① 等于和不等于(、!=)
这两个操作符都会先进行类型转换再确定操作数是否相等。
② 全等和不全等(
=、!==)
全等只有操作数在不转换的前提下相等才返回true。

(9)条件操作符(let max = (num1 > num2) ? num1:num2)

(10)赋值操作符(*=、/=等等)

(11)逗号操作符:用来在一条语句中执行多个操作。

6.语句
(1)if语句

if (condition) statement1 else statement2

这里的条件(condition)可以是任何表达式,并且求值结果不一定是布尔值。会自动调用Boolean()函数将这个表达式的值转换为布尔值。
(2)do-while语句、while语句、for 语句
(3)for-in语句:是一种严格的迭代语句,用于枚举对象中的非符号键属性。

for (property in expression) statement

(4)for-of语句:用于遍历可迭代对象的元素,按照可迭代对象的next()方法产生值的顺序迭代元素。
(5)标签语句:用于给语句加标签。
label:statement
例:

start:for (let i=0;i<count;i++){
console.log(i);
}

这里start是一个标签,可以在后面通过break或continue语句引用。
(6)break和continue语句
continue也用于立即退出循环,但会再次从循环顶部开始执行。

let num=0;
outermost:
for (let i=0;i<10;i++){
  for (let j=0;j<10;j++){
      if (i==5 && j==5){
break  outermost;
}
num++;
}
}
console.log(num);//55

这里outermost标签标识的是第一个for语句,添加标签不仅让break退出内部循环,也会退出外部循环。continue会退出内部循环,继续执行外部循环。

(7)with语句:将代码作用域设置为特定的对象(不建议使用)
(8)switch语句:可以用于所有数据类型

7.函数
return语句后面的代码不会执行,return语句也可以不带返回值,函数会立即停止执行返回underfined。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值