我们同样可以经由过程覆写该办法来修改对象的运算表示:
- user = {
- name: "John",
- money: 1000,
- [Symbol.toPrimitive](hint) {
- console.log(`hint: ${hint}`);
- return hint == "string" ? `{name: "${this.name}"}` : this.money;
- }
- };
- // conversions demo:
- console.log(user); // hint: string -> {name: "John"}
- console.log(+user); // hint: number -> 1000
- console.log(user + 500); // hint: default -> 1500
标准的相等性操作符(== 与 !=)应用了 Abstract Equality Comparison Algorithm 来比较操作符两侧的操尴尬刁难象(x == y),该算法流程要点提取如下:
- 如不雅 x 或 y 中有一个为 NaN,则返回 false;
- 如不雅 x 与 y 皆为 null 或 undefined 中的一种类型,则返回 true(null == undefined // true);不然返回 false(null == 0 // false);
- 如不雅 x,y 类型不一致,且 x,y 为 String、Number、Boolean 中的某一类型,则将 x,y 应用 toNumber 函数转化为 Number 类型再进行比较;
- 如不雅 x,y 中有一个为 Object,则起首应用 ToPrimitive 函数将其转化为原始类型,再进行比较。
JavaScript 为我们供给了严格比较邮攀类型转换比较两种模式,严格比较(===)只会在操作符两侧的操尴尬刁难象类型一致,并且内容一致时才会返回为 true,不然返回 false。而更为广泛应用的 == 操作符则会起首将操尴尬刁难象转化为雷同类型,再进行比较。对于 <= 等运算,则会起首转化为原始对象(Primitives),然后再进行比较。
我们再往返想下文首提出的 [] == ![] 这个比较运算,起首 [] 为对象,则调用 ToPrimitive 函数将其转化为字符串 "" ;对于右侧的 ![] ,起首会进行显式类型转换,将其转化为 false。然后在比较运算中,会将运算符两侧的运算对象都转化为数值类型,即都转化为了 0,是以最终的比较结不雅为 true。在上文中还介绍了 null >= 0 为 true 的┞封种比较结不雅,在 ECMAScript 中还规定,如不雅 < 为 false,则 >= 为 true。
加法运算
对于加法运算而言,JavaScript 起首会将操作符两侧的对象转换为 Primitive 类型;然后当恰当的隐式类型转换能得出有意义的值的前提下,JavaScript 会先辈行隐式类型转换,再进交运算。譬如 value1 + value2 这个表达式,起首会调用 ToPrimitive 函数将两个操作数转化为原始类型:
- prim1 := ToPrimitive(value1)
- prim2 := ToPrimitive(value2)
这老将会优先调用除了 Date 类型之外对象的 valueOf 办法,而因为数组的 valueOf 办法的返回值仍为数组类型,则会返回其字符串表示。而经由转换之后的 prim1 与 prim2 中的任一个为字符串,则会优先辈行字符串连接;不然进行加法计算。
【编辑推荐】
- 测试JavaScript函数的机能
- 浅谈JavaScript中的接话柄现
- 浅谈JavaScript中的异步处理
- 怎么轻松进修JavaScript
- JavaScript高等法度榜样设计高等技能
推荐阅读
《CIO修炼之道》第 4 讲制造业企业的核心竞争力表如今产品和办事上,展如今客户面前的竞争力就是“性价比高,交货快!”,这“一高、一快”是互相接洽关系的。比如,采取提前备货、扩大年夜产能等>>>详细阅读
地址:http://www.17bianji.com/lsqh/37165.html
1/2 1