测试001

133 阅读2分钟
  • 对于. 运算符需要特别注意,因为它是一个有效的数字字符,会被优先识别为数字字面量的一部分,然后才是对象属性访问运算符 如:
	42.toFixed(3)  // syntaxError 会被理解为(42.)tiFixed(3) 解析失败42).toFixed(3) => "42.000"
	42..toFixed(3) => "42.000"
	0.42.toFixed(3) => "0.420"
  • Number.isNaN 比 window.isNaN 更安全准确
	 Number.isNaN = ES6语法 等同于=>
	 if(!Number.isNaN) {
	 	Number.isNaN = function (n) {
		return typeof n === "number" && window.isNaN(n) 
		}
	 }
	

window.isNaN 检查参数是否不是NAN,也不是数字 因此 var b= 'foo'; window.isNaN(b) => true

*ES6 新增Object.is(a,b) 来判断两个值是否绝对相等

可以用来判断两个NAN 或者 0 与 -0

  • 位操作符 ~

~x 大致等同于 -(x+1)

~42 ; => -(42 =1) = -43
~-1; => - (-1 +1) = 0
因此if(~a.indexOf(..)) 可以代替 if(a.indexOf(..) !== -1)
  • parseInt 解析非字符串

parseInt字符串中 0-9和 a-i是有效字符串

* parseInt(1/0 , 19) => 18

首先 1/0 被转换为字符串 parseInt('infinity', 19).第一个字符串i的19进制为18.n不是有限的数字字符串 * parseInt(false, 16) => 250; 等同于16进制的fa转为10进制 15* 16 + 10* 16^0 = 250

  • ==宽松相等 与 ===严格相等的区别

== 允许在相等比较中进行强制类型转换,而===不允许

  • ==宽松相等的隐式强制类型转换

不同类型的值比较是否相等时会先执行类型转换

x==y 不同类型转换规则:

  • 字符串会被转换为数字基本类型 toNumber(x)
  • 布尔类型会被转换为数字基本类型
  • null 和 undefined 可以相互进行隐式转换 即可认为二者等同
  • 对象与非对象相等比较时, 对象会调用内置方法toPrimittive(x)。
0 = [0] => true 对象会调用toPrimittive方法被转换为 "0",而字符串又会被转换为数字0,所以返回true
[] == ![] => true; 相等比较的右边是布尔类型,![]的结果是false,false转换为数字是0; 而数组对象[]转换结果是"0", “0”转换为数字为0
  • 对象内置方法 toPrimittive 会优先调用 object.valueOf(),如果返回的是字符串测抛出字符串作为返回结果,否则会继续调用object.toString()返回字符串