读<>
2018-07-30 本文已影响0人
JLUiceman
1.<script>元素的六个属性
- async: 表示立即下载该脚本,但不应妨碍页面中的其他操作,只对外部脚本文件有效(不保证按照出现顺序执行)
- defer: 表示可以延迟到文档完全被解析和显示后再执行,只对外部脚本有效
- src, language, type, charset
2.a instanceof B <=> a.proto(一个或若干个proto) === B.prototype
3.typeof null === 'object'
在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了"object"
4. 浮点数值计算产生舍入误差的问题
这是使用基于IEEE754数值的浮点计算的通病,ECMAScript并非唯一会有该问题的(原因为10进制小数转化为2进制存储在计算机中受位数限制导致的精度丢失)
延展阅读: IEEE 754 对双精度浮点数的存储规范将 64 bit 分为 3 部分.第1位储存符号,然后11位存储指数,最后剩下52位存储位数。。。所以会不会产生精度误差取决于十进制小数转换为二进制小数后的循环部分的长度能否被52整除
5.数值转换
3个函数: Number(),parseInt(),parseFloat(),其中后两个专门用于把字符串转换为数值
Number()函数的转换规则:
- Boolean值转换为1和0(分别对应true和false)
- null值返回0(parseInt和parseFloat则返回NaN)
- undefined返回NaN
- 字符串遵循规则如下:
1.若字符串只包含数字(浮点数同理),则将其转换为十进制数字(忽略前导0)- 若字符串中包含有效的十六进制格式,如0xf,则将其转换为相同大小的十进制整数值(实测不能包含其他的字符)
- 若为空字符串则转为0(parseInt和parseFloat则返回NaN)
- 若字符串包含上述格式之外的字符,则将其转换为NaN
- 若为对象,则调用对象的valueOf方法,对返回值按照abcd四个规则进行转换,若结果为NaN,则调用对象的toString()方法再次尝试
parseInt()函数的转换规则: - 忽略字符串前面的空格,直到找到第一个非空格字符
- 若第一个字符不是数字字符或者负号,则返回NaN
- 若第一个字符是数字字符,会继续解析直到遇到一个非数字字符
- 可对parseInt传入第二个参数用于指定解析的基数(即以多少进制来解析)
parseFloat()函数的转换规则: - 忽略所有前导的0
- 只解析第一个遇到的小数点
- 若字符串包含的是一个可解析的整数,则返回整数
6.String相关
toString()函数的转换规则:
- 若值存在toString方法,则调用toString方法
- 若值为null或者undefined,则原样返回
7.前置递增和前置递减操作与执行语句优先级相等
8.对非数值应用一元加或者一元减操作符时,会对该值进行Number()转化(注意与parseInt的转换规则区别)
9.位操作
数值与位数的转换
虽然数值均根据IEEE-754规定的64位格式存储,但位操作符并不直接操作64位的值,而是转换为32位进行操作,其中: 对于有符号的整数,32位中前31位表示具体的值,最后一位用于表示数值的符号(0=>正数,1=>负数),前31位中没有用到的用0填充;负数则使用二进制补码进行存储关于二进制的补码
- 求这个数值绝对值的二进制码(如-18则先求18的二进制码)
- 求二进制反码,即将0替换为1,将1替换为0
- 得到的二进制反码加1
在对数值进行位操作时: 64位=>32位=>位操作=>32位=>64
副作用: NaN及Infinity在进行位操作时会被当做0来处理
- 按位非: 即返回数值的反码(本质:操作数的负值-1,eg: ~25 = -25 - 1 = -26)