小梁建站专注重庆中小企业网站建设SEO优化,让您网站更具价值!

当前位置:首页 > WEB前端学习 > 如何分析[] == []与[] ==! []的运算规则区别?

如何分析[] == []与[] ==! []的运算规则区别?

时间:2018-08-18 23:37 来源:重庆网站制作公司(www.seozol.cn) 作者:重庆网站建设公司

  如何分析[] == []与[] ==! []的运算规则区别?

如何分析[] == []与[] ==! []的运算规则区别?

  思考题:

  1.[] == [] => false ???

  2.[] == ![] => true ???

  [] == [] ?

  因为[] 和 {} 是引用类型

  简单类型都是放在栈(stack)里

  对象类型都是放在堆(heap)里

  例如:

  var d = { m: 20 }//地址假设为0x0012ff7c

  var e = { m: 20 }//重新开辟一段内存空间假设为0x0012ff8f

  console.log(e==d); //false

  [] == [] => false

  [] ==![] ?

  这题考察点:

  运算符的优先级

  == 运算规则

  隐式转换

  首先:了解一下运算符优先级(可以查MDN )

  分析:

  表达式: [] ==! []

  左边:[]

  右边:![]

  更具优先级高低,!优先大于 ==,因此首先先处理 ![]

  逻辑非的计算规则:

  产生UnaryExpression: !UnaryExpression按照下面执行过程:

  1.令expr为解释执行UnaryExpression的结果

  2.令oldValue 为ToBoolean(getValue(expr))

  3.如果oldValue为true,返回 false

  4.返回true

  重点:![] 返回是一个boolean

  分析:

  ![] 是要转换ToBoolean() 运算

  ToBoolean 运算规则

  undefined => false

  Null => false

  Number => +0,-0,NaN => false,其他是true

  String => 空字符串 => false ,其他的是true

  Object => true

  ToNumber 运算规则:

  undefined => NaN

  Null => +0

  Boolean => true 为1 ,false=> 0

  Number 不转换

  String 变成Number 有规则

  分析:

  ![] => false

  false => toNumber(false ) => 0

  其次:== 含义

  重点:执行相等比较运算符的结果总是boolean类型,

  表示是否由运算符指定的关系对二操作数成立。

  EqualityExpression :EqualityExpression == RelationExpression按照下面的过程:

  1.令lref 为解释执行 EqualityExpression

  2.令lval 为GetValue(lref)

  3.令rref为解释执行RelationExpression的结果

  4.令rval为GetValue(rref)

  5.返回做用相比较算法等于rval == lval 的 结果

  抽象相等比较算法:

  比较运算 x==y,其中x和y是值,产生true或者false

  1.若Type(x) 与 Type(y)相同,则

  a.若Type(x)为undefined,返回true

  b.若Type(x)为Null,返回true

  c.若Type(x)为number,则

  1.若x为NaN,返回false

  2.若y为NaN,返回false

  3.若x与y相等数值,返回true

  4.若x为+0 且y为 -0,返回true

  5.若x为-0 且y为 +0,返回true

  d.若Type(x)为String,则当x和y为完全相同的字符序列(长度相等且字符在相同位置)

  返回true

  e.若Type(x)为Boolean,当x和y为同为true或者同为false时,返回true,否则返回false

  2.若x为null且y为undefined,返回true

  3.若y为undefined且x为null,返回true

  4.若Type(x)为Number且Type(y)为string,返回 x == Tonumber(y) 的结果

  5.若Type(x)为String且Type(y)为 number,返回 Tonumber(x) == y 的结果

  6.若Type(x)为Boolean且Type(y)为number,返回 Tonumber(x) ==y 的结果

  7.若Type(y)为boolean且Type(x) 为number,返回 Tonumber(y)==x 的结果

  8.若Type(x)为String或者Number,且Type(y)为object,返回比较 x == ToPrimitive(y)的结果

  9.若Type(x)为Object,且Type(y)为String或Number,返回比较ToPrimitive(x) ==y的结果

  接下来了解难点:

  JS引擎内部转换为原始值ToPrimitive(obj,preferredType)

  函数接受两个参数,第一个obj为被转换的对象,

  第二个preferredType为希望转换成的类型(默认为空,接受的值为Number或String)

  在执行ToPrimitive(obj,preferredType)时如果第二个参数为空并且obj为Date的实例时,

  此时preferredType会被设置为String,

  其他情况下preferredType都会被设置为Number如果preferredType为Number,

  ToPrimitive执行过程如下:

  如果obj为原始值,直接返回;

  否则调用 obj.valueOf(),如果执行结果是原始值,返回之;

  否则调用obj.toString(),如果执行结果是原始值,返回之;

  否则抛异常。

  如果preferredType为String,

  将上面的第2步和第3步调换,即:如果obj为原始值,直接返回;

  否则调用obj.toString(),如果执行结果是原始值,返回之;

  否则调用 obj.valueOf(),如果执行结果是原始值,返回之;

  否则抛异常。

  分析:

  满足相比较8,因此:

  [] => ToPrimitive([]) => ''

  '' => ToNumber('') => 0

  左后比较 0 == 0 => false

  总结:

  1.undefined == null,结果是true。且它俩与所有其他值比较的结果都是false

  2.String == Boolean,需要两个操作数同时转为Number

  3.String/Boolean == Number,需要String/Boolean转为Number。

  4. Object == Primitive,需要Object转为Primitive(具体通过valueOf和toString方法)。


版权声明:本文:如何分析[] == []与[] ==! []的运算规则区别? 由重庆网站制作公司(www.seozol.cn)原创内容,如需要转载请注明原文网址:重庆网站建设公司http://www.seozol.cn/

 
喜欢看,就分享到:

围观: 9999次 | 责任编辑:重庆网站建设公司

回到顶部