JavaScript对象和方法算术运算或输出之valueOf和toString优先级
2017-08-25 15:34
686 查看
直接输出对象名先toString再valueOf
var obj = { toString: function() { console.log('调用了 obj.toString'); return {}; }, valueOf: function() { console.log('调用了 obj.valueOf') return '110'; } } alert(obj); // 调用了 obj.toString // 调用了 obj.valueOf // 弹出110
从上面代码可看出输出obj时,先调用其toString方法,若toString返回原始值就直接返回,否则继续调用valueOf方法。
对象参与运算先valueOf再toString
var obj = { toString: function() { console.log('调用了 obj.toString'); return 123; }, valueOf: function() { console.log('调用了 obj.valueOf') return {}; } } alert(obj+1);
var obj = { toString: function() { console.log('调用了 obj.toString'); return {}; }, valueOf: function() { console.log('调用了 obj.valueOf') return {}; } } alert(obj); // 调用了 obj.toString // 调用了 obj.valueOf // Uncaught TypeError: Cannot convert object to primitive value
若toString和valueOf都返回对象则程序报错
对象与数值运算转原始值先valueOf再toString
var obj = { valueOf: function() { console.log('调用 valueOf'); return 5; } } console.log(obj + 1); // 调用 valueOf // 6 var obj = { valueOf: function() { console.log('调用 valueOf'); return {}; }, toString: function() { console.log('调用 toString'); return 10; } } console.log(obj + 1); // 调用 valueOf // 调用 toString // 11 var obj = { valueOf: function() { console.log('调用 valueOf'); return {}; }, toString: function() { console.log('调用 toString'); return {}; } } console.log(obj + 1); // 调用 valueOf // 调用 toString // Uncaught TypeError: Cannot convert object to primitive value
方法名运算先valueOf,若valueOf返回对象再toString
function test() { var a = 1; console.log(1); } test; // 这里打印函数内容,即调用了test.valueOf() test.valueOf = function() { console.log('调用 valueOf 方法'); return 2; } test; // 输出如下: // 调用 valueOf 方法 // 2
添加toString方法并将valueOf返回对象
test.valueOf = function() { console.log('调用 valueOf 方法'); return {}; } test.toString= function() { console.log('调用 toString 方法'); return 3; } test; // 输出如下: // 调用 valueOf 方法 // 调用 toString 方法 // 3
若将其valueOf和toString都返回对象,程序不会报错
test.valueOf = function() { console.log('调用 valueOf 方法'); return {}; } test.toString= function() { console.log('调用 toString 方法'); return {}; } test; //调用 valueOf 方法 //调用 toString 方法 //ƒ #<Function>
题目
add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15
实现:
function add() { var args1 = Array.prototype.slice.call(arguments); var fn = function () { var args2 = Array.prototype.slice.call(arguments); return add.apply(null,args2.concat(args1)); }; fn.toString = function () { return args1.reduce(function (a, b) { return a * b; }); }; <!-- fn.valueOf = function () { return args1.reduce(function (a, b) { return a + b; }); };--> return fn; }
其中,valueOf和toString,哪个先被改写优先调用谁,同时出现,调用valueOf
构造函数实例算术运算先原型上的valueOf,输出调用toString
class Test { valueOf () { console.log('调用 valueOf 方法'); return 'v'; } toString() { console.log('调用 toString 方法'); return 's'; } } var T1 = new Test();
测试:
T1+1 VM20301:3 调用 valueOf 方法 "v1" `${T1}` VM20301:7 调用 toString 方法 "s"
相关文章推荐
- JavaScript Array 对象方法 以及 如何区分javascript中的toString()、toLocaleString()、valueOf()方法
- 重写toString方法输出对象信息
- JavaScript的Number对象的toString()方法
- JavaScript中的valueOf与toString方法
- 全面解析JavaScript中的valueOf与toString方法(推荐)
- JavaScript 对象转换之 toString 和 valueOf
- 空类生成对象输出的结果是什么? toString()输出 覆写Object toString()方法输出的结果是什么
- javascript中Number对象的toString()方法分析
- js中函数对象的方法,原型方法apply、call、bind、toString、toLocaleString、valueOf
- JavaScript中的valueOf与toString方法
- javascript中Number对象的toString()方法分析
- JavaScript中的valueOf与toString方法
- javaScript valueOf和toString方法在不同场景被调用进行数据转换
- JavaSE8基础 直接输出对象的名称与对象的toString方法的结果是相同的
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
- JavaScript通过function定义对象并给对象添加toString()方法实例分析
- 简单说 JavaScript中的tostring( ) 与 valueOf( )方法
- 区分javascript中的toString(),toLocaleString(),valueOf()方法
- php -- 魔术方法 之 对象输出 : __toString()
- JavaScript对象的valueOf()方法