JavaScript权威指南-总结

章2 词法结构

1.什么是字面量,标识符,保留字?

字面量即程序中的数据的值;标识符指数据的名字(字母、下划线_或美元符号$开头,为了和数值区分开,标识符不能用数字开头,);保留字是JS保留的某些可以使用的标识符,用来给自身使用,如null,if等。

2.什么是Unicode?(补充:什么是ASCII码 ?是一套电脑编码统,可以用来表示大小写英文字母、数字和一些符号,到目前为止共定义了128个字符。)

Unicode是一个编码规范,目前实际实现的unicode编码只要有三种:UTF-8,UCS-2和UTF-16。

JS使用Unicode字符集编写,注:不支持表情符号

Unicode的转义序列是使用ASCII字符来代表任意16位 Unicode 内码,这些 Unicode 转义序列均以 \u 为前缀,其后跟随4个十六进制数(例如 \u4e00),以便于某些支持使用老技术的系统可以处理Unicode字符集。

https://blog.csdn.net/u012672456/article/details/44750277

 章3 类型,值和变量

1.JS中,只有null和undefined是不能调用方法的值,这两个值是特殊值。

2.常用的Math、Number对象属性:

Math.pow() .floor() .ceil() .abs() .max() .min() .random() 

Number.MAX_VALUE .MIN_VALUE .parseInt() .parseFloat() .isNaN() .isFinite()

注:NaN=>"非数值",不等于任何值甚至自己,所以x===NaN不能得出x是否为not a number,需用Number.isNaN(x)或x !== x

toString()方法和parseInt()方法对比:

number.toString(进制)方法是把一个 Number 对象转换为一个字符串,并返回结果。

parseInt(num,基数)函数将字符串转为数值并返回一个十进制整数或NaN。

两者参数不一样,toString方法填写要转换的进制,

而parseInt函数的第二个参数是填基数(即我原本是几进制的数,不填的话则默认原本数值的以开头为 "0x" , 0, 1 ~ 9 分别为十六进制的整数,八进制或十六进制的数字,十进制的整数),它返回的数值为十进制的整数或NaN!!!

3.所有二进制编程语言都无法精确表示哪怕0.1的数,所以二进制浮点数之间不能比较其相等性(相加减之后比较,数值的精确度不一样)

4.字符串

字符串使用for/of循环或...操作符的迭代,迭代的是字符!

字符串不可修改,toUpperCase()等方法均返回新字符串!

字符串可被当作只读数组,用方括号而非charAt()方法可访问个别字符:

let s = "hello" 

s[0] //"h"

位于${ 和对应的}之间的内容会被当作JS表达式来解释:

let name = "BILL";

let ee = "Hello ${name}" ;// ee==Hello BILL

5.布尔值

布尔值只有一个有用的方法:toString(),用于将自己转换为字符串true或false。[拓:除null和undefined外,所有值都有toString()方法]

假性值六个(转布尔值时均为false):undefined,null,0,-0,NaN,""(空字符串)!!!其他均为真性值。JS的所有值均可转为boolean。例子:

假设变量o要么保存一个对象,要么是null:

1)if(o !=== null)...  只要不是null就执行。当需要严格区分null、0、" "时使用

2)if(o)...  只要不是false或其他任何假性值就执行。

6.null和undefined区别?

null(关键字):值不存在,typeof null ;返回字符串 "object" ,所以它是一种特殊对象,表示”没有对象“。

undefined(全局常量):更深层次的值不存在,变量的值未初始化时为undefined,查询不存在的对象属性或数组得undefined。

注:相等操作符==认为他们相等。

两者没有属性或方法,so用.或[ ]访问这两个值的属性或方法均导致TypeError。(对应章3.1)

7.对象(引用类型)

按引用进行比较,

对象值就是引用,

分为赋值引用(浅拷贝)和创建对象新副本(深拷贝,需要显示复制对象的属性或数组的元素)

8.类型转换

JS将+看作算术运算符而不是一元运算符,so有字符串时,JS采用字符串加法运算符(+操作符计算中有一个操作数是字符串时,则另一个操作数也会被转为字符串,即优先字符串拼接):

1 + 1 + 1 + 1 + "" ;//"4"               10 + "  objects" ;// "10  objects",将10转为字符串后计算

但是JS其他时候更期待数值,所以除上面特殊的情况,其他都选择将字符串转换为数值、将==操作符中的操作数转为数值:

1 + 1 + 1 + 2 * "" ;// 3,将""转为数字0后计算

1 == "1" ; //true,字符串转为数值

1 == "a" ; //false,字符串“a”转数值为NaN

"0" == false ; //true,两者均转为0

"true" == true ; //false,"true"转为NaN,true转为1

null == undefined ;//true ,这里特殊,不要试图通过转换为数据类型来解释这个结论,因为Number(null);为0,Number(undefined);为NaN。而ECMAScript 规范认为,既然 null 和  undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性

{ }(任何对象)转布尔值为true,[ ](空数组)转布尔值为true(对应章3.5)!!

9.所有对象都继承两个在对象到原始值转换时使用的方法:toString()和valueOf()。对象到数值的转换先使用偏数值算法将对象转为一个原始值,得到的原始值转为数值,偏数值算法先尝试valueOf(),将toString()作为备用。String\Number\Boolean 这样的包装类定义的valueOf()方法也只是简单地返回被包装的原始值,Array、Function和RegExp简单地继承默认方法。Array类继承默认的valueOf()方法,该方法不返回原始值,so数组转数值时,最终会调用toString()方法。如:

Number([ ]) ; //0 ,空数组先转为空字符串,空字符串转为数值0

Number([99]) ; //99,先转为字符串“99”,再转为数值99

注:多数对象没有valueOf()方法,因此会用toString()方法转换,如 Date对象p71

1 + { }  // "1[object object] ",对象转换为字符串(使用toString()方法)后再拼接

2 + null //2 ,null转换为0(使用valueOf()方法)后计算加法

2 + undefined //NaN,undefined转为NaN后计算加法

p51 let const var

10.什么是解构赋值?p55

右侧值中提取(解构)出一个或多个值,保存到左侧变量中:

let [x,y] = [1,2];//相当于let x=1,y=2

章4 表达式与操作符

1.属性访问表达式中有两种访问属性的语法:

1)表达式(指定对象)后跟一个句点和一个标识符(指定属性名)

2)表达式后跟另一个位于方括号中的表达式(指定属性名或数组元素的索引)注:位于.或[前面的表达式都会先求值。若求值结果为null或undefined,抛出TypeError,cause他们是JS中不能有属性值的两个值。但若是指定名字的属性不存在,则属性访问表达式的值是undefined。

避免报错方法:用?.或?.[ ]语法防止报错。

同样,函数和方法调用也可用?.() 而不是()来防止报错:

o.m() ; //常规调用

o ?. m() ; //条件式属性访问,常规调用

o.m?.() ; //此处o必须不是null或undefined才不会报错

2.幂、一元、赋值、三元条件操作符具有右结合性:

w=(x=(y=z)); 等价于 w=x=y=z;

3. in操作符,instanceof操作符,typeof操作符 ,delete操作符p78

4.逻辑与(&&):只有左操作数为真值时才会对右侧求值

if(a === b) stop(); //只有a===b时才调用stop(ÿ

你可能感兴趣的:(javascript)