2020.4.11
2.5 关于省略行尾分号
js并不是在所有换行处都添加分号,只有缺少分号无法解析代码时才添加。所以,若出现
var y=x+f (a+b).toString()
这样的代码,会解析成
var y=x+f(a+b).toString() //把f当函数了
所以还是加分号。
3 垃圾回收策略
当不再有任何引用指向一个对象,解释器就知道此对象没用了,自动回收它。
3.1.3 特殊数值的比较
NaN==NaN //false NaN!=NaN //true isNaN(NaN) //true /*当运算结果发生下溢结果为-0*/ -0==0 //true 1/0==1/-0 //false,Infinity!=-Infinity
3.3 if中判断空值
if (obj!==null)... //只要obj不等于null时 if (obj)... //obf不是false或任何假值(null,undefined,0,"")才运行
3.4 null和undefined的区别
undefined可以理解为系统级的、出乎意料的值的空缺,null表示程序级的、正常可预料的空值。
3.6 不可变值和包装对象
对不可变值(number,bool,string)变量调用属性和方法,不会修改变量本身,而是在调用的语句创建临时的包装对象。
var s="test" s.len=4 //创建包装对象,String(s).len=4 var t=s.len //t==undefined
可使用String(),Number(),Boolean()显式创建包装对象。
3.7 对象的比较
对象间的比较不是看两对象包含同样的属性和值,而是看是否指向一个引用。
3.8 类型转换
几个易错的:
值 | 字符串 | 数字 | 布尔值 | 对象 |
undefiend | NaN | throws TypeError | ||
null | 0 | throws TypeError | ||
"" | 0 | false | ||
-0 | "0" | false | ||
-Infinity | "-Infinity" | true | ||
Infinity | true | |||
[] | "" | 0 | true |
3.8.1 原始值的相等性和转换
number,string,bool相互比较时全部转为数字再比较。
3.8.2 number转换格式的函数
number=123456.789 toString(radix=10) //转换的基数可以为2,8,10,16,36 toFixed(5) //小数点后几位 toExponential(1) //1.2e+5 toExponential(3) //1.235e+5 /*toPrecision指定包括整数部分的有效位数, 若指定位数小于整数部分,转换为指数形式*/ toPrecision(4) //1.235e+5 toPrecision(10) //123456.7890 /*所有方法都会自动补零和四舍五入*/
parseInt和parseFloat会跳过前导空格,尽可能解析更多数值字符,并忽略后面内容。
3.8.3 对象转换为原始值
对象到字符串:先尝试toString,再尝试valueOf后转成字符串
对象到数字:先尝试valueOf,再尝试toString后转成数字
3.10.1 变量作用域
所有var实际上在整个函数内都可引用(包括定义前),这被称为声明提前(hoisting)。
3.10.3 作用域链
在函数作用域中使用变量x,js现在最底作用域查找x,若无则到上一级作用域查找,以此类推,直到找到或找过最终的全局作用域。
4.3 数组初始化写法
var arr=[1,,,,5] //会生成3个undefined元素 arr[1,2,] //结尾的','并不会生成undefined元素
4.9.1 严格相等符===
null===null //false undefined===undefined //false 0===-0 //true //若两字符串含义和显示的字符也一样,但16编码不同,则为false //有方法String.localeCompare()